iosxamarinprintingxamarin.iosairprint

PrinterToPrint without showing the print job Progress dialog


I am using iOs default PrinterToPrint in Xamarin to print without showing dialog to choose printer but then also it's showing one dialog which says printing to [PRINTER NAME]. Is there anyway to hide the dialog as well. Like complete silent print functionality?

I am not its possible but I have seen some apps which do that and I am not sure whether they are using the same function or not.

Thanks in advance.


Solution

  • Update:

    UIPrinterPickerController comes from UIKit and as such there is no way to push the "printing" process to the background and off the main UI thread.

    In the current UIPrintInteractionController.PrintToPrinter implementation (currently up to iOS 10.3 B4) there is no exposed way to disable the print progress (Connecting, Preparing, etc...) alart/dialog (w/ Cancel button) or to modify its appearance.

    This interface is high level wrapper using AirPrint and thus Internet Print Protocol (IPP) at a lower level to preform the actual printing, job queue monitoring on the printer, etc... IPP is not currently exposed as a publicly available framework within iOS...

    Programs that allow background printing are not using UIPrintInteractionController to do the printing. Most do use UIPrinterPickerController to obtain a UIPrinter selection from the user, but then use the UIPrinter.Url.AbsoluteUrl to "talk" directly to the printer via HTTP/HTTPS Post/Get. Depending upon the printers used, TCP-based sockets are also an option vs. IPP and even USB/serial for direct connected printers.

    Re: https://en.wikipedia.org/wiki/Internet_Printing_Protocol

    Original:

    Pick a Printer:

    if (allowUserToSelectDifferentPrinter || printerUrl == null)
    {
        UIPrinter uiPrinter = printerUrl != null ? null as UIPrinter : UIPrinter.FromUrl(new NSUrl(printerUrl));
        var uiPrinterPickerController = UIPrinterPickerController.FromPrinter(uiPrinter);
        uiPrinterPickerController.Present(true, (printerPickerController, userDidSelect, error) =>
        {
            if (userDidSelect)
            {
                uiPrinter = uiPrinterPickerController?.SelectedPrinter;
                printerUrl = uiPrinter.Url.AbsoluteUrl.ToString();
                Console.WriteLine($"Save this UIPrinter's Url string for later use: {printerUrl}");
            }
        });
    }
    

    Print using UIPrintInteractionController with an existing UIPrinter:

    if (printerUrl != null)
    {
        // re-create a UIPrinter from a saved NSUrl string
        var uiPrinter = UIPrinter.FromUrl(new NSUrl(printerUrl));
        var printer = UIPrintInteractionController.SharedPrintController;
        printer.ShowsPageRange = false;
        printer.ShowsNumberOfCopies = false;
        printer.ShowsPaperSelectionForLoadedPapers = false;
        var printInfo = UIPrintInfo.PrintInfo;
    
        printInfo.OutputType = UIPrintInfoOutputType.General;
        printInfo.JobName = "StackOverflow Print Job";
        var textFormatter = new UISimpleTextPrintFormatter("StackOverflow Rocks")
        {
            StartPage = 0,
            ContentInsets = new UIEdgeInsets(72, 72, 72, 72),
            MaximumContentWidth = 6 * 72,
        };
        printer.Delegate = new PrintInteractionControllerDelegate();
        printer.PrintFormatter = textFormatter;
        printer.PrintToPrinter(uiPrinter, (printInteractionController, completed, error) =>
        {
            if ((completed && error != null))
            {
                Console.WriteLine($"Print Error: {error.Code}:{error.Description}");
                PresentViewController(
                    UIAlertController.Create("Print Error", "Code: {error.Code} Description: {error.Description}", UIAlertControllerStyle.ActionSheet),
                    true, () => { });
            }
            printInfo?.Dispose();
            uiPrinter?.Dispose();
    
            uiPrinter.
        });
    }
    else
    {
        Console.WriteLine("User has not selected a printer...printing disabled");
    }