【问题标题】:How can I print a pdf document from Xamarin.Forms UWP?如何从 Xamarin.Forms UWP 打印 pdf 文档?
【发布时间】:2019-08-16 19:22:49
【问题描述】:

我有一个仅支持 UWP 的 Xamarin.Forms 应用程序。我找不到打印 pdf 文档的方法。无论我在网上看到什么,出于某种原因对我都不起作用。例如。我试过了

https://www.syncfusion.com/kb/8767/how-to-print-pdf-documents-in-xamarin-forms-platform

它可以让我打印,但打印对话框中的预览永远不会出现,并且进度指示器只会永远旋转。

我也试过http://zawayasoft.com/2018/03/13/uwp-print-pdf-files-silently-without-print-dialog/ 这给了我无法修复的错误。

所以我想知道是否有人可以提出其他实际可行的建议。也许比我尝试过的更新(我使用 VS 2017)。最好不使用打印对话框进行打印。

提前谢谢你。

【问题讨论】:

    标签: c# xamarin.forms printing uwp


    【解决方案1】:

    我使用了一个非常肮脏的黑客来做到这一点!

    我要做的是尝试打印 pdf 的图像版本(我在后端进行了转换),然后使用了以下 DependencyInjection:

    在我的 UWP 项目中的 Print 类中:

    class Print : IPrint
        {
            void IPrint.Print(byte[] content)
            {
                Print_UWP printing = new Print_UWP();
                printing.PrintUWpAsync(content);
            }
        }
    

    以及uwp中负责打印的类:

     public class Print_UWP
        {
            PrintManager printmgr = PrintManager.GetForCurrentView();
            PrintDocument PrintDoc = null;
            PrintDocument printDoc;
            PrintTask Task = null;
            Windows.UI.Xaml.Controls.Image ViewToPrint = new Windows.UI.Xaml.Controls.Image();
    
            public Print_UWP()
            {
    
                printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
            }
    
            public async void PrintUWpAsync(byte[] imageData)
            {
                int i = 0;
    
                while (i < 5)
                {
                    try
                    {
                        BitmapImage biSource = new BitmapImage();
                        using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
                        {
                            await stream.WriteAsync(imageData.AsBuffer());
                            stream.Seek(0);
                            await biSource.SetSourceAsync(stream);
                        }
    
                        ViewToPrint.Source = biSource;
                        if (PrintDoc != null)
                        {
                            printDoc.GetPreviewPage -= PrintDoc_GetPreviewPage;
                            printDoc.Paginate -= PrintDoc_Paginate;
                            printDoc.AddPages -= PrintDoc_AddPages;
                        }
    
                        this.printDoc = new PrintDocument();
                        try
                        {
                            printDoc.GetPreviewPage += PrintDoc_GetPreviewPage;
                            printDoc.Paginate += PrintDoc_Paginate;
                            printDoc.AddPages += PrintDoc_AddPages;
    
                            bool showprint = await PrintManager.ShowPrintUIAsync();
    
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine(e.ToString());
                        }
    
                        //  printmgr = null;
                        // printDoc = null;
                        // Task = null;
                        PrintDoc = null;
                        GC.Collect();
                        printmgr.PrintTaskRequested -= Printmgr_PrintTaskRequested;
                        break;
                    }
                    catch (Exception e)
                    {
                        i++;
                    }
    
                }
            }
    
            private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
            {
                var deff = args.Request.GetDeferral();
                Task = args.Request.CreatePrintTask("Invoice", OnPrintTaskSourceRequested);
    
                deff.Complete();
    
            }
    
            async void OnPrintTaskSourceRequested(PrintTaskSourceRequestedArgs args)
            {
                var def = args.GetDeferral();
                await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    args.SetSource(printDoc.DocumentSource);
                });
                def.Complete();
            }
    
            private void PrintDoc_AddPages(object sender, AddPagesEventArgs e)
            {
                printDoc.AddPage(ViewToPrint);
                printDoc.AddPagesComplete();
            }
    
            private void PrintDoc_Paginate(object sender, PaginateEventArgs e)
            {
                PrintTaskOptions opt = Task.Options;
                printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
            }
    
            private void PrintDoc_GetPreviewPage(object sender, GetPreviewPageEventArgs e)
            {
                printDoc.SetPreviewPage(e.PageNumber, ViewToPrint);
            }
    
        }
    

    请注意,这不是一个完美的解决方案,有时它会崩溃而实际上无法追踪异常(这真的很奇怪),所以我确信即使它完成了工作,也必须有更好的答案。

    【讨论】:

    • 感谢您的回答!当然,最好避免崩溃。我会等,如果我没有得到更好的,就像你说的,我可以用你的。再次感谢。
    • 我试过这个解决方案。不幸的是,它给了我一个例外:找不到组件。 (来自 HRESULT 的异常:0x88982F50)在 CustomerKiosk.UWP.Services.Print_UWP.d__6.MoveNext() 有什么想法吗?
    • 您是否正确设置了DependecyInjection?
    • 我想是的。执行来到 await biSource.SetSourceAsync(stream);并且永远不会到达下一行。我相信异常发生在某处。
    • 你的 XF 版本是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2011-08-01
    • 2010-10-12
    • 1970-01-01
    • 2012-01-25
    • 2016-10-09
    • 2022-08-16
    • 2020-06-10
    相关资源
    最近更新 更多