如何从 Xamarin.Forms UWP 打印 pdf 文档



我有一个仅支持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(。最好在没有打印对话框的情况下打印。

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

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

在 UWP 项目中的打印类中:

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

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

最新更新