【问题标题】:PrinterToPrint without showing the print job Progress dialogPrinterToPrint 不显示打印作业进度对话框
【发布时间】:2019-10-02 20:08:57
【问题描述】:

我在 Xamarin 中使用 iOs 默认 PrinterToPrint 进行打印,但没有显示选择打印机的对话框,但它也显示了一个对话框,显示打印到 [PRINTER NAME]。无论如何也可以隐藏对话框。喜欢完整的静音打印功能吗?

我不可能,但我看到一些应用程序可以做到这一点,我不确定它们是否使用相同的功能。

提前致谢。

【问题讨论】:

  • 您需要创建UIPrinter url 以提供给PrintToPrinter,通常您可以让用户通过UIPrinterPickerController 选择打印机并将UIPrinter 保存在您的应用设置中以供将来重新使用使用...stackoverflow.com/questions/34602302/…
  • 我也在做同样的事情,但我得到一个对话框,上面写着“打印到 [Printername]”。
  • 我看错了你的问题,并没有意识到你在询问打印作业“进度”警报,请参阅我的更新答案。
  • 你找到这个解决方案了吗?

标签: ios xamarin printing xamarin.ios airprint


【解决方案1】:

更新:

UIPrinterPickerController 来自UIKit,因此无法将“打印”进程推到后台并退出主 UI 线程。

在当前的UIPrintInteractionController.PrintToPrinter 实现中(当前最高为 iOS 10.3 B4),没有公开的方法来禁用打印进度(连接、准备等)警报/对话框(带取消按钮)或修改它的外观。

此接口是使用AirPrint 的高级包装器,因此使用较低级别的 Internet 打印协议 (IPP) 来执行实际打印、打印机上的作业队列监控等... IPP 目前未公开公开iOS 中可用的框架...

允许后台打印的程序未使用UIPrintInteractionController 进行打印。 大多数确实使用UIPrinterPickerController 从用户那里获得UIPrinter 选择,然后使用UIPrinter.Url.AbsoluteUrl 通过HTTP/HTTPS Post/Get 直接与打印机“对话”。根据所使用的打印机,与 IPP 甚至 USB/串行直接连接的打印机相比,基于 TCP 的套接字也是一种选择。

回复:https://en.wikipedia.org/wiki/Internet_Printing_Protocol

原文:

选择打印机:

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}");
        }
    });
}

使用UIPrintInteractionController 和现有的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");
}

【讨论】:

  • 有没有不带uiprintinteractioncontroller使用ipp地址打印的例子?
  • @thailey01 有很多直接 IPP 打印(发布/查询)示例,只需进行网络搜索即可
  • 你能用objective c解释一下吗?
【解决方案2】:

我知道这是一个有点老的线程,但我一直在为我的一个客户在 iOS 中实现静默打印而苦苦挣扎,最终我找到了一个非常容易实现的可接受的解决方案。

正如接受的答案中提到的,没有办法摆脱显示打印进度的弹出窗口。然而,有一种方法可以隐藏它。您只需将关键窗口的 UIWindowLevel 更改为 UIWindowLevel.Alert + 100。这将保证您的当前窗口将显示在任何警报视图上方。

但请注意,正如我所提到的,它会在级别更改后显示在任何警报视图上。幸运的是,您只需将此级别切换回“正常”即可获得原始行为。

所以回顾一下我的解决方案。我使用 UIPrintInteractionController.PrintToPrinter 直接打印到我使用 UIPrinter.FromUrl 创建的打印机对象(顺便说一句,这是 Xamarin.iOS 代码)。在此之前,我将窗口级别调整为警报 + 100,一旦打印完成,我将窗口级别重置为“正常”。现在我的打印在没有任何视觉反馈给我的用户的情况下发生。

希望这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多