Exemplo n.º 1
0
        /// <summary>
        /// Callback method that is called when printing completes (successfully or as a result of failure).
        /// </summary>
        /// <param name="_">The Print Interaction controller</param>
        /// <param name="completed">Flag indicating if printing has completed.</param>
        /// <param name="nsError">NSError value used to report errors during printing. Null if no error.</param>
        private static async void PrintCompletion(
            UIPrintInteractionController _,
            bool completed,
            NSError nsError)
        {
            try
            {
                if (completed)
                {
                    await PrintStatusReporting.ReportInfoAsync(
                        CrossPrinting.PrintingMessages.PrintInteractionCompleted);
                }
                else if (!completed && nsError != null)
                {
                    await PrintStatusReporting.ReportInfoAsync(
                        CrossPrinting.PrintingMessages.PrintInteractionError);
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types
        }
Exemplo n.º 2
0
        public override async Task <bool> PrintPdfFromStreamAsync(
            Stream inputStream,
            PrintJobConfiguration config)
        {
            bool result = false;

            try
            {
                if (PrintPdfFromStreamAsyncSupported)
                {
                    PdfPrintJob printJob = new PdfPrintJob(config, inputStream);
                    await printJob.PrintAsync();

                    result = true;
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);

                result = false;
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Print the contents of a WebView
        /// </summary>
        /// <param name="parentPage">The page that the WebView is shown on.</param>
        /// <param name="webView">The Xamarin.Forms WebView.</param>
        /// <param name="webViewAdditionFunctions">Additional functions</param>
        /// <param name="printJobConfiguration">Configuration information for the print job.</param>
        /// <returns>true if attempting print, false otherwise.</returns>
        public override async Task <bool> PrintWebViewAsync(
            Page parentPage,
            WebView webView,
            IWebViewAdditionalFunctions webViewAdditionFunctions,
            PrintJobConfiguration printJobConfiguration)
        {
            bool result = false;

            try
            {
                // TODO - get rid of use of UIWebView as deprecated by Apple
                // See https://forums.xamarin.com/discussion/168620/itms-90338-non-public-api-usage-apple-rejected-my-app-xamarin#latest

                if (PrintWebViewAsyncSupported &&
                    (webViewAdditionFunctions?.NativeControl is UIWebView nativeWebView))
                {
                    using (nativeWebView)
                    {
                        result = await PrintUIViewAsync(nativeWebView, printJobConfiguration);
                    }
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 4
0
        public override async Task <bool> PrintImageFromByteArrayAsync(byte[] content, PrintJobConfiguration printJobConfiguration)
        {
            // based on https://github.com/bushbert/XamarinPCLPrinting/blob/master/PCLPrintExample/PCLPrintExample/PCLPrintExample.Android/Print.cs

            bool result = false;

            try
            {
                if (PrintImageFromByteArrayAsyncSupported)
                {
                    //using (
                    Stream inputStream = new MemoryStream(content); //)
                    {
                        PrintServiceAndroidHelper.PrintImageFromStream(inputStream, printJobConfiguration);
                        result = true;
                    }
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (System.Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 5
0
        public override async Task <bool> PrintFromURLAsync(string url, PrintJobConfiguration printJobConfiguration) // was string jobName, bool enablePrintPreview = true)
        {
            bool result = false;

            try
            {
                if (PrintFromURLAsyncSupported)
                {
                    if (!(url is null))
                    {
                        UriPrintJob printJob = new UriPrintJob(printJobConfiguration, new Uri(url));
                        await printJob.PrintAsync();

                        result = true;
                    }
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);

                result = false;
            }
#pragma warning restore CA1031 // Do not catch general exception types

            // TODO - does this want to be here??? printJob?.UnwireAllEvents();

            return(result);
        }
Exemplo n.º 6
0
        public override async Task <bool> PrintImageFromByteArrayAsync(
            byte[] content,
            PrintJobConfiguration config)
        {
            bool result = false;

            try
            {
                if (PrintImageFromByteArrayAsyncSupported)
                {
                    ImagePrintJob printJob = new ImagePrintJob(config, content);
                    await printJob.PrintAsync();

                    result = true;
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);

                result = false;
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 7
0
        public override async Task <bool> PrintWebViewAsync(
            Page parentPage,
            WebView webView,
            IWebViewAdditionalFunctions webViewAdditionFunctions,
            PrintJobConfiguration printJobConfiguration)
        {
            bool result = false;

            try
            {
                if (PrintWebViewAsyncSupported &&
                    (webViewAdditionFunctions?.NativeControl is Android.Webkit.WebView nativeWebView))
                {
                    PrintServiceAndroidHelper.PrintFromWebView(nativeWebView, printJobConfiguration);
                    result = true;
                }
            }
            catch (Java.Lang.Exception jlex)
            {
                await PrintStatusReporting.ReportExceptionSilentlyAsync(jlex);
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (System.Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 8
0
        public override async Task <bool> PrintFromURLAsync(string url, PrintJobConfiguration printJobConfiguration)
        {
            bool result = false;

            try
            {
                if (PrintFromURLAsyncSupported)
                {
                    WebViewPrintClientSubclass webViewClientSubclass = new WebViewPrintClientSubclass(url, printJobConfiguration); // TODO - check that this is disposed
                    webViewClientSubclass.Run();
                    result = true;
                }
            }
            catch (Java.Lang.Exception jlex)
            {
                await PrintStatusReporting.ReportExceptionSilentlyAsync(jlex);
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (System.Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Unwire all events as part of cleanup.
        /// </summary>
        public virtual void UnwireAllEvents() => Xamarin.Forms.Device.BeginInvokeOnMainThread(
            async() =>
        {
            try
            {
                if (_printManager != null)
                {
                    PrintManagerHelper.Instance.ClearPrintTaskRequestedHandler(_printManager);
                    //_printManager.PrintTaskRequested -= PrintTaskRequested;
                    _printManager = null;
                }

                if (_printTask != null)
                {
                    _printTask.Completed -= PrintTaskCompleted;
                    //_printTask.Previewing -= PrintTask_Previewing;
                    //_printTask.Progressing -= PrintTask_Progressing;
                    //_printTask.Submitting -= PrintTask_Submitting;

#if DEBUG
                    DecrementCompletedCount();
                    //DecrementPreviewing();
                    //DecrementProgressing();
                    //DecrementSubmitting();
#endif

                    Windows.Graphics.Printing.OptionDetails.PrintTaskOptionDetails printDetailedOptions
                        = Windows.Graphics.Printing.OptionDetails.PrintTaskOptionDetails.GetFromPrintTaskOptions(_printTask.Options);

                    if (printDetailedOptions != null)
                    {
                        printDetailedOptions.OptionChanged -= PrintDetailedOptions_OptionChanged;
#if DEBUG
                        DecrementOptionChangedCount();
#endif
                    }
                }

                if (_printDocument != null)
                {
                    _printDocument.GetPreviewPage -= GetPrintPreviewPage;
                    _printDocument.Paginate       -= CreatePrintPreviewPages;
                    _printDocument.AddPages       -= AddPrintPages;

#if DEBUG
                    DecrementGetPreviewPageCount();
                    DecrementPaginateCount();
                    DecrementAddPagesCount();
#endif
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionSilentlyAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types
        });
        /// <summary>
        ///
        /// </summary>
        /// <param name="pages"></param>
        /// <param name="destination"></param>
        /// <param name="cancellationSignal"></param>
        /// <param name="callback"></param>
        public override async void OnWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback)
        {
            _input  = null;
            _output = null;

            try
            {
                _input  = new FileInputStream(FileToPrint);                 // if we use using on this, we get an ObjectDisposedException // TODO - investigate further
                _output = new FileOutputStream(destination.FileDescriptor); // if we use using on this, we get an ObjectDisposedException // TODO - investigate further

                byte[] buf = new byte[1024];
                int    bytesRead;

                while ((bytesRead = _input.Read(buf)) > 0)
                {
                    _output.Write(buf, 0, bytesRead);
                }

                callback.OnWriteFinished(new PageRange[] { PageRange.AllPages });
            }
            catch (Java.IO.FileNotFoundException ee)
            {
                await PrintStatusReporting.ReportExceptionSilentlyAsync(ee);
            }
            catch (Java.Lang.Exception jlex)
            {
                await PrintStatusReporting.ReportExceptionSilentlyAsync(jlex);
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (System.Exception e)
            {
                await PrintStatusReporting.ReportExceptionSilentlyAsync(e);
            }
#pragma warning restore CA1031 // Do not catch general exception types
            finally
            {
                try
                {
                    if (!(_input is null))
                    {
                        _input.Close();
                        _input = null;
                    }

                    if (!(_output is null))
                    {
                        _output.Close();
                        _output = null;
                    }
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (System.Exception e)
                {
                    await PrintStatusReporting.ReportExceptionSilentlyAsync(e);
                }
#pragma warning restore CA1031 // Do not catch general exception types
            }
        }
Exemplo n.º 11
0
        private static async Task <UIPrintInteractionController> PopulateCommonPrinterDetailsAsync(
            PrintJobConfiguration printJobConfiguration)
        {
            UIPrintInteractionController printer = UIPrintInteractionController.SharedPrintController;

            if (printer is null)
            {
                await PrintStatusReporting.ReportErrorAsync(
                    CrossPrinting.PrintingMessages.UnableToPrintAtThisTime);
            }
            else
            {
                printer.PrintInfo = UIPrintInfo.PrintInfo;

                if (!(printer.PrintInfo is null))
                {
                    if (!(printJobConfiguration is null))
                    {
                        switch (printJobConfiguration.DuplexPreference)
                        {
                        case PrintJobDuplexConfiguration.LongEdge:
                            printer.PrintInfo.Duplex = UIPrintInfoDuplex.LongEdge;
                            break;

                        case PrintJobDuplexConfiguration.ShortEdge:
                            printer.PrintInfo.Duplex = UIPrintInfoDuplex.ShortEdge;
                            break;

                        case PrintJobDuplexConfiguration.None:
                        default:
                            printer.PrintInfo.Duplex = UIPrintInfoDuplex.None;
                            break;
                        }

                        printer.PrintInfo.JobName = printJobConfiguration.JobName;

                        printer.PrintInfo.Orientation
                            = printJobConfiguration.PreferPortraitOrientation
                            ? UIPrintInfoOrientation.Portrait
                            : UIPrintInfoOrientation.Landscape;

                        printer.PrintInfo.OutputType
                            = printJobConfiguration.PreferColor
                            ? UIPrintInfoOutputType.General
                            : UIPrintInfoOutputType.Grayscale;
                    }
                }
                printer.ShowsPageRange = true;
            }

            return(printer);
        }
Exemplo n.º 12
0
        /// <summary>
        ///
        /// </summary>
        /// <returns>true if no immediate errors detected, false if an immediate error detected. Note that a true return value does not mean that printing completed successfully, just that it didn't fail immediately</returns>
        protected async Task <bool> RegisterForPrintingAsync()
        {
            try
            {
                _printDocument       = new Windows.UI.Xaml.Printing.PrintDocument();
                _printDocumentSource = _printDocument.DocumentSource;

                _printDocument.Paginate       += CreatePrintPreviewPages;
                _printDocument.GetPreviewPage += GetPrintPreviewPage;
                _printDocument.AddPages       += AddPrintPages;
#if DEBUG
                IncrementAddPagesCount();
                IncrementGetPreviewPageCount();
                IncrementPaginateCount();
#endif

                _printManager = Windows.Graphics.Printing.PrintManager.GetForCurrentView();
                if (!(_printManager is null))
                {
                    PrintManagerHelper.Instance.SetPrintTaskRequestedHandler(
                        _printManager,
                        PrintTaskRequested);
                    return(true);
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            if (!(_printDocument is null))
            {
                _printDocument.Paginate       -= CreatePrintPreviewPages;
                _printDocument.GetPreviewPage -= GetPrintPreviewPage;
                _printDocument.AddPages       -= AddPrintPages;
            }

#if DEBUG
            DecrementPaginateCount();
            DecrementGetPreviewPageCount();
            DecrementAddPagesCount();
#endif

            await PrintStatusReporting.ReportErrorAsync(
                CrossPrinting.PrintingMessages.FailedToRegisterForPrinting);

            return(false);
        }
Exemplo n.º 13
0
        /// <summary>
        /// Wraps a function in a try/catch block, reporting back any
        /// exception on the UI thread through the PrintStatusReporting class.
        /// </summary>
        /// <param name="func"></param>
        internal static void SafeBlock(
            BlockDelegate func)
        {
            try
            {
                func();
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                Xamarin.Forms.Device.BeginInvokeOnMainThread(async() =>
                {
                    await PrintStatusReporting.ReportExceptionAsync(ex);
                });
            }
#pragma warning restore CA1031 // Do not catch general exception types
        }
Exemplo n.º 14
0
        /// <summary>
        /// Show Print Preview UI
        /// </summary>
        /// <returns>Task that the caller is expected to await</returns>
        protected async Task ShowPrintApiAsync()
        {
            try
            {
                if (await RegisterForPrintingAsync())
                {
                    bool showprint = await Windows.Graphics.Printing.PrintManager.ShowPrintUIAsync();
                }
                else
                {
                    UnwireAllEvents();
                }
            }
#pragma warning disable CS0168 // Variable is declared but never used
            catch (System.IO.FileNotFoundException fnfex)
#pragma warning restore CS0168 // Variable is declared but never used
            {
                UnwireAllEvents();
                await PrintStatusReporting.ReportInfoAsync(
                    CrossPrinting.PrintingMessages.PrinterServiceBusy);

                return;
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                if ((ex.Message != null) && (ex.Message.Contains("0x80010115")))
                {
                    // {"OLE has sent a request and is waiting for a reply. (Exception from HRESULT: 0x80010115)"}

                    await PrintStatusReporting.ReportInfoAsync(
                        CrossPrinting.PrintingMessages.AwaitingResponse);

                    UnwireAllEvents();
                    return;
                }
                else
                {
                    await PrintStatusReporting.ReportExceptionAsync(ex);

                    UnwireAllEvents();
                    return;
                }
            }
#pragma warning restore CA1031 // Do not catch general exception types
        }
Exemplo n.º 15
0
        private async Task <bool> PrintFileFromStreamAsync(Stream inputStream, PrintJobConfiguration printJobConfiguration)
        {
            bool result = false;

            try
            {
                string documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                string library   = Path.Combine(documents, "..", "Library");
                string filePath  = Path.Combine(library, printJobConfiguration.JobName);

                try
                {
                    File.Delete(filePath);
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch
                {
                    // no-op
                }
#pragma warning restore CA1031 // Do not catch general exception types

                using (MemoryStream tempStream = new MemoryStream())
                {
                    inputStream.Position = 0;
                    inputStream.CopyTo(tempStream);
                    File.WriteAllBytes(filePath, tempStream.ToArray());
                }

                NSUrl url = NSUrl.FromFilename(filePath);
                using (url)
                {
                    result = await PrintObjectAsync(url, printJobConfiguration);
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 16
0
        public override async Task <bool> PrintImageFromStreamAsync(Stream stream, PrintJobConfiguration printJobConfiguration)
        {
            try
            {
                if (PrintImageFromStreamAsyncSupported)
                {
                    return(await PrintImageFromData(
                               NSData.FromStream(stream),
                               printJobConfiguration));
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(false);
        }
Exemplo n.º 17
0
        /// <summary>
        /// Event handler that shows the Print Preview dialog once the DOM content has been loaded for the URI
        /// </summary>
        /// <param name="sender">The sender</param>
        /// <param name="args">The event args related to the DOM content loading completion</param>
        private async void NativeWebViewDOMContentLoaded(
#pragma warning disable IDE0060 // Remove unused parameter
            Windows.UI.Xaml.Controls.WebView sender,
            Windows.UI.Xaml.Controls.WebViewDOMContentLoadedEventArgs args)
#pragma warning restore IDE0060 // Remove unused parameter
        {
            try
            {
                await ShowPrintApiAsync();
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types
            finally
            {
                Unwire();
            }
        }
Exemplo n.º 18
0
        public override async Task <bool> PrintImageFromStreamAsync(Stream inputStream, PrintJobConfiguration printJobConfiguration)
        {
            bool result = false;

            try
            {
                if (PrintImageFromStreamAsyncSupported)
                {
                    PrintServiceAndroidHelper.PrintImageFromStream(inputStream, printJobConfiguration);
                    result = true;
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (System.Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 19
0
        public override async Task <bool> PrintFromURLAsync(string url, PrintJobConfiguration printJobConfiguration)
        {
            bool result = false;

            try
            {
                if (PrintFromURLAsyncSupported)
                {
                    using (NSUrl nsUrl = NSUrl.FromString(url))
                    {
                        result = await PrintObjectAsync(nsUrl, printJobConfiguration);
                    }
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types

            return(result);
        }
Exemplo n.º 20
0
        public override async Task <bool> PrintWebViewAsync(
            Page page,
            WebView webView,
            IWebViewAdditionalFunctions webViewAdditionFunctions,
            PrintJobConfiguration config)
        {
            bool result = false;

            try
            {
                if (PrintWebViewAsyncSupported)
                {
                    if (!(webViewAdditionFunctions is null))
                    {
                        await webViewAdditionFunctions.WaitForViewToBeInNativeLayout(page, 10, 100);

                        WebViewPrintJob printJob = new WebViewPrintJob(config, webViewAdditionFunctions);
                        //WebViewPrintJob printJob = new WebViewPrintJob(config, html);
                        await printJob.PrintAsync();

                        result = true;
                    }
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                await PrintStatusReporting.ReportExceptionAsync(ex);

                result = false;
            }
#pragma warning restore CA1031 // Do not catch general exception types

            // TODO - does this want to be here??? printJob?.UnwireAllEvents();

            return(result);
        }
Exemplo n.º 21
0
        /// <summary>
        /// AddPages event handler
        /// </summary>
        /// <param name="sender">The sender</param>
        /// <param name="e">AddPages event args</param>
        private async void AddPrintPages(
            object sender,
            Windows.UI.Xaml.Printing.AddPagesEventArgs e)
        {
            try
            {
                // based on https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/print-from-your-app

                if ((!_printJobConfiguration.AllowPageRangeSpecification) ||
                    (e.PrintTaskOptions.CustomPageRanges.Count == 0))
                {
                    if (!_printJobConfiguration.PreferPrintPreview)
                    {
                        await GeneratePagesAsync();
                    }

                    // Loop over all of the preview pages and add each one to add each page to be printed
                    if ((sender is Windows.UI.Xaml.Printing.PrintDocument printDoc) &&
                        (_printPreviewPages != null))
                    {
                        // Note that _printDocument.Equals(printDoc)
                        // so possible optimisation/simplification here

                        foreach (Windows.UI.Xaml.UIElement previewPage in _printPreviewPages)
                        {
                            _printDocument.AddPage(previewPage);
                        }

                        _printDocument.AddPagesComplete();
                    }
                }
                else
                {
                    // Print only the pages chosen by the user.
                    //
                    // The "Current page" option is a special case of "Custom set of pages".
                    // In case the user selects the "Current page" option, the PrintDialog
                    // will turn that into a CustomPageRanges containing the page that the user was looking at.
                    // If the user typed in an indefinite range such as "6-", the LastPageNumber value
                    // will be whatever this sample app last passed into the PrintDocument.SetPreviewPageCount API.
                    IList <Windows.Graphics.Printing.PrintPageRange> customPageRanges = e.PrintTaskOptions.CustomPageRanges;
                    foreach (Windows.Graphics.Printing.PrintPageRange pageRange in customPageRanges)
                    {
                        // The user may type in a page number that is not present in the document.
                        // In this case, we just ignore those pages, hence the checks
                        // (pageRange.FirstPageNumber <= printPreviewPages.Count) and (i <= printPreviewPages.Count).
                        //
                        // If the user types the same page multiple times, it will be printed multiple times
                        // (e.g 3-4;1;1 will print pages 3 and 4 followed by two copies of page 1)
                        if (pageRange.FirstPageNumber <= _printPreviewPages.Count)
                        {
                            for (int i = pageRange.FirstPageNumber; (i <= pageRange.LastPageNumber) && (i <= _printPreviewPages.Count); i++)
                            {
                                // Subtract 1 because page numbers are 1-based, but our list is 0-based.
                                _printDocument.AddPage(_printPreviewPages[i - 1]);
                            }
                        }
                    }

                    _printDocument.AddPagesComplete();
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
            {
                if (sender is Windows.UI.Xaml.Printing.PrintDocument printDoc)
                {
                    printDoc.InvalidatePreview();
                }

                PrintManagerHelper.Instance.ClearPrintTaskRequestedHandler(_printManager);
                //_printManager.PrintTaskRequested -= PrintTaskRequested;
                await PrintStatusReporting.ReportExceptionAsync(ex);
            }
#pragma warning restore CA1031 // Do not catch general exception types
        }