Dot.Blog

C#, XAML, WinUI, WPF, Android, MAUI, IoT, IA, ChatGPT, Prompt Engineering

Imprimer avec MAUI ?

Est-il possible d'imprimer depuis MAUI ? Et Comment ?

Oui, il est possible d'imprimer directement sur une imprimante avec MAUI, mais cela nécessite une combinaison de techniques, car MAUI, en tant que framework multiplateforme, ne fournit pas encore d'API intégrée dédiée pour la gestion des impressions. Cependant, des solutions peuvent être mises en œuvre en utilisant les fonctionnalités natives des plateformes cibles (Android, iOS, Windows, macOS) via .NET MAUI Essentials, des bibliothèques tierces ou encore du code natif avec des interopérabilités.

Voici une approche générale pour les principales plateformes :

Impression sur Windows

Windows prend en charge l'impression directement via des API .NET. Vous pouvez utiliser la classe PrintDocument pour gérer des impressions.

Exemple d'implémentation pour Windows

using System.Drawing.Printing;
public class WindowsPrinter
{
    public void Print()
  {
   PrintDocument printDocument = new PrintDocument();
    printDocument.PrintPage += (sender, e) =>
    {
      e.Graphics.DrawString("Hello, World!", new Font("Arial", 12), Brushes.Black, 10, 10);
     };
   printDocument.Print();
   }
}

Ensuite, cette classe peut être appelée via une plateforme spécifique dans MAUI avec le code conditionnel :

if (DeviceInfo.Platform == DevicePlatform.WinUI)
{
var printer = new WindowsPrinter();
printer. Print();
}

Impression sur Android

Pour Android, il est nécessaire d'utiliser les API Java pour accéder au framework d'impression.

Exemple d'implémentation pour Android

Créez une classe pour implémenter l'impression via Android PrintManager :
using Android.Print;
using Android.Content;
using Microsoft.Maui.Controls.Compatibility.Platform.Android; 
public class AndroidPrinter
{
    public void Print(Context context)
    {
        var printManager = (PrintManager)context.GetSystemService(Context.PrintService);
        var adapter = new PrintDocumentAdapterWrapper(context);
        printManager.Print("Print Job", adapter, null);
    }
}
public class PrintDocumentAdapterWrapper : PrintDocumentAdapter
{
    private readonly Context _context;
    public PrintDocumentAdapterWrapper(Context context)
    {
        _context = context;
    }
    public override void OnWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback)
    {
        using (var fileOutputStream = new FileOutputStream(destination.FileDescriptor))
        {
            fileOutputStream.Write(System.Text.Encoding.UTF8.GetBytes("Hello, Android Print!"));
        }
        callback.OnWriteFinished(new PageRange[] { PageRange.AllPages });
    }

    public override void OnLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras)
    {
        callback.OnLayoutFinished(new PrintDocumentInfo.Builder("MyPrint").SetContentType(PrintContentType.Document).Build(), true);
    }
}

Vous pouvez l'appeler dans un gestionnaire de dépendances ou depuis un fichier partagé :

if (DeviceInfo.Platform == DevicePlatform.Android)
{
    var printer = new AndroidPrinter();
    printer.Print(Android.App.Application.Context);
}

Impression sur iOS

iOS prend en charge l'impression via le framework UIKit et sa classe UIPrintInteractionController.

Exemple d'implémentation pour iOS

Ajoutez une classe spécifique pour iOS en utilisant les API natives :

using UIKit;
using Foundation; 
public class iOSPrinter
{
    public void Print()
    {
        var printer = UIPrintInteractionController.SharedPrintController;
        var printInfo = UIPrintInfo.PrintInfo;
        printInfo.OutputType = UIPrintInfoOutputType.General;
        printInfo.JobName = "Print Job";
        printer.PrintInfo = printInfo;
        printer.PrintingItem = NSData.FromString("Hello, iOS Print!");
        printer.Present(true, (controller, completed, error) =>
        {
            if (!completed && error != null)
            {
                Console.WriteLine($"Printing failed: {error.LocalizedDescription}");
            }
        });
    }
}

Appel du service iOS :

if (DeviceInfo.Platform == DevicePlatform.iOS)
{
    var printer = new iOSPrinter();
    printer. Print();
}

Impression sur macOS

macOS partage certaines similarités avec iOS pour l'impression via AppKit.

Approche multiplateforme

Pour unifier ces solutions, il est possible de définir une interface dans un fichier partagé et d'implémenter des services spécifiques à chaque plateforme :

Interface partagée

public interface IPrinterService
{ void Print(string content); }

Service pour chaque plateforme

Dans chaque projet de plateforme (par exemple, Windows, Android, iOS), implémentez cette interface.

Dans le fichier partagé, utilisez un service de dépendance MAUI :

var printer = DependencyService.Get<IPrinterService>();
printer?.Print("Hello, MAUI Printing!");

Bibliothèques tierces

Vous pouvez également envisager des bibliothèques telles que Xamarin Print SDK ou d'autres packages NuGet qui offrent des fonctionnalités d'impression multiplateforme, si disponibles.

Conclusion

L'impression directe dans un environnement MAUI peut sembler complexe au premier abord, en raison de l'absence d'une API intégrée dédiée. Cependant, en exploitant les capacités natives de chaque plateforme et les outils offerts par .NET MAUI, il est tout à fait possible de mettre en place une solution robuste. Que ce soit en s'appuyant sur des APIs natives comme PrintDocument pour Windows, PrintManager pour Android ou UIPrintInteractionController pour iOS, ou encore en créant un service multiplateforme unifié, les développeurs disposent des outils nécessaires pour répondre à leurs besoins d'impression. En combinant ces techniques avec de potentielles bibliothèques tierces, MAUI montre à nouveau sa flexibilité et son potentiel pour des applications multiplateformes avancées.

Stay Tuned !

 

Faites des heureux, PARTAGEZ l'article !