簡體   English   中英

如何使用手機默認打印機功能在Xamarin Android中打印從WebView打開的PDF內容

[英]How to use phone default printer function to print the content of PDF opened from WebView in Xamarin Android

任何人都可以幫助我解決這個問題,打印 url 內容。 我正在我的應用程序的 Web 視圖中打開 PDF 文件,然后嘗試通過放置單獨的打印按鈕從那里打印文檔。 請看下面的代碼。

    [Activity(Label = "PdfView")]
    public class PdfView : Activity
    {
        public static PdfView _context;
        Android.Content.Res.Resources res;
        private static string ErrorTitle, ErrorMsg;
        private static ProgressBar progressBar;

        WebView mWebView, Web_Print;
        RelativeLayout LL_Print,LL_input;
        string MyUrl;
        private WebClient _webClient = new WebClient();
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            _context = this;
            res = _context.Resources;
            SetContentView(Resource.Layout.web_pdf);
            ErrorTitle = res.GetString(Resource.String.error_title);
            ErrorMsg = res.GetString(Resource.String.Somethingwentwrong);
            progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
            LL_Print = FindViewById<RelativeLayout>(Resource.Id.LL_Print);
            LL_input = FindViewById<RelativeLayout>(Resource.Id.LL_input);
            Web_Print = FindViewById<WebView>(Resource.Id.Web_Print);
            Web_Print.Visibility = ViewStates.Gone;
            LL_Print.Visibility = ViewStates.Gone;
            var customWebViewClient = new WebViewLoaderClient();
            mWebView = FindViewById<WebView>(Resource.Id.Web);
            mWebView.Download += MWebview_Download;               
            mWebView.Settings.JavaScriptEnabled = true;
            mWebView.Settings.BuiltInZoomControls = true;
            mWebView.SetWebViewClient(customWebViewClient);
            mWebView.SetWebChromeClient(new WebChromeClient());
            String myPdfUrl = APIConstants.InvoicePdfUrl;
            MyUrl = "http://docs.google.com/gview?embedded=true&url=" + myPdfUrl;
            mWebView.LoadUrl(MyUrl);

            InitComonents();
        }

        private void MWebview_Download(object sender, DownloadEventArgs e)
        {
            mWebView.Visibility = ViewStates.Gone;
            LL_input.Visibility = ViewStates.Gone;
            LL_Print.Visibility = ViewStates.Visible;
            Web_Print.Visibility = ViewStates.Visible;
            var Url = e.Url;
            CustomWebViewClient client = new CustomWebViewClient(this);
            Web_Print.SetWebViewClient(client);
            Web_Print.SetWebChromeClient(new WebChromeClient());
            Web_Print.Settings.JavaScriptEnabled = true;
            Web_Print.LoadUrl(Url);
            Web_Print.Settings.UseWideViewPort = true;
            Web_Print.Settings.LoadWithOverviewMode = true;
        }


        #region // Initializing widgets
        public void InitComonents()
        {
            try
            {
                LinearLayout img_viw = FindViewById<LinearLayout>(Resource.Id.img_WV_back);
                LinearLayout img_viw_Home = FindViewById<LinearLayout>(Resource.Id.img_WV_home);

            }
            catch (Exception ex)
            {
                ex.Message.ToString();
            }
        }
        #endregion

        #region // Webview client
        public class WebViewLoaderClient : WebViewClient
        {
            public event EventHandler<bool> OnPageLoaded;
            public override bool ShouldOverrideUrlLoading(WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
            public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
            {
                base.OnPageStarted(view, url, favicon);
                progressBar.Visibility = ViewStates.Visible;
            }
            public override void OnPageFinished(WebView view, string url)
            {
                base.OnPageFinished(view, url);
                progressBar.Visibility = ViewStates.Gone;
            }
            public override void OnReceivedError(WebView view, ClientError errorCode, string description, string failingUrl)
            {
                base.OnReceivedError(view, errorCode, description, failingUrl);
                view.Visibility = ViewStates.Gone;
                Error();
            }
        }
        class MonkeyWebViewClient : WebViewClient
        {
            public override bool ShouldOverrideUrlLoading(WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
            {
                view.LoadUrl("file:///android_asset/myerrorpage.html");
            }
        }
        #endregion


        #region Error Message for Web View Error
        public static void Error()
        {
            AlertDialog.Builder alert = new AlertDialog.Builder(_context);
            alert.SetTitle(ErrorTitle);
            alert.SetMessage(ErrorMsg);
            alert.SetPositiveButton(Resource.String.ok, (senderAlert, args) =>
            {
                _context.Finish();
            });
            alert.SetCancelable(false);
            Dialog dialog = alert.Create();
            dialog.Show();
        }

        public void doWebViewPrint(string url)
        {
            PrintDocumentAdapter adapter;
            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
                adapter = mWebView.CreatePrintDocumentAdapter("test");
            else
                adapter = mWebView.CreatePrintDocumentAdapter();
            var printMgr = (PrintManager)GetSystemService(PrintService);
            printMgr.Print("printTest", adapter, null);
        }
        #endregion
    }

    public class CustomWebViewClient : WebViewClient
    {
        private PdfView myActivity;
        public bool shouldOverrideUrlLoading(WebView view, string url)
        {
            view.LoadUrl(url);
            return false;
        }
        public override void OnPageFinished(WebView view, string url)
        {
            Log.Debug("PRINT", "page finished loading " + url);
            myActivity.doWebViewPrint(url);
            //CreateWebPrintJob(view);
            base.OnPageFinished(view, url);
        }

        private void CreateWebPrintJob(WebView view)
        {
            throw new NotImplementedException();
        }

        public CustomWebViewClient(PdfView activity)
        {
            myActivity = activity;
        }
    }
}

這可以顯示PDF的內容並打開打印機功能,但無法在打印機功能中查看PDF的內容作為預覽,即,讓我如下打印機默認值

因此,任何人都可以幫助我解決此問題以糾正並能夠在網絡中查看 PDF 內容以進行打印。

請參閱以下使打印成為可能的代碼:這里的完整游戲規則改變者是比例計算,

.
.
.
.
.
.
.
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            _context = this;
            res = _context.Resources;
            SetContentView(Resource.Layout.xxxxxxxxxxxxxxxx);
            var customWebViewClient = new WebViewLoaderClient();
            mWebView = FindViewById<WebView>(Resource.Id.Web);
            //mWebView.Download += MWebview_Download;
            UserLoginDetailList = UserInfoDBServices.getUserLoginDetailsfromDBfordroid();
            ObjLangList = UserInfoDBServices.GetCurrentLanguageListfordroid();
            mWebView.Settings.JavaScriptEnabled = true;
            mWebView.Settings.BuiltInZoomControls = true;
            mWebView.SetWebViewClient(customWebViewClient);
            String myPdfUrl = APIConstants.InvoicePdfUrl;
            MyUrl = "http://docs.google.com/gview?embedded=true&url=" + myPdfUrl;//Here in myPdfUrl variable place the url of the pdf you are getting from your server
            mWebView.LoadUrl(MyUrl);
            InitComonents();
        }
        #region // Initializing widgets
        public void InitComonents()
        {
            try
            {
                Print = FindViewById<LinearLayout>(Resource.Id.ll_TNP_Pirnt);
                Print.Visibility = ViewStates.Visible;
                Print.Click += delegate
                  {
                      LL_Print.Clickable = false;
                      var printManager = (PrintManager)GetSystemService(Context.PrintService);
                      var content = FindViewById<LinearLayout>(Resource.Id.LL_input);
                      var printAdapter = new GenericPrintAdapter(this, content);

                      printManager.Print("MyPrintJob", printAdapter, null);
                  };
            }
            catch (Exception ex)
            {
                ex.Message.ToString();
            }
        }
        #endregion
        public class GenericPrintAdapter:PrintDocumentAdapter
        {
            View view;
            Context context;
            PrintedPdfDocument document;
            float scale;
            private DownloadPdfView downloadPdfView;
            private RelativeLayout content;

            public GenericPrintAdapter(DownloadPdfView downloadPdfView, View view)
            {
                this.downloadPdfView = downloadPdfView;
                this.view = view;
            }

            public override void OnLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras)
            {
                try
                {
                    document = new PrintedPdfDocument(context, newAttributes);

                    CalculateScale(newAttributes);

                    var printInfo = new PrintDocumentInfo
                        .Builder("Invoice.pdf")
                        .SetContentType(PrintContentType.Document)
                        .SetPageCount(1)
                        .Build();

                    callback.OnLayoutFinished(printInfo, true);
                }
                catch(Exception ex)
                {
                    ex.Message.ToString();
                }

            }

            public override void OnWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback)
            {

                try
                {
                    PrintedPdfDocument.Page page = document.StartPage(0);

                    page.Canvas.Scale(scale, scale);

                    view.Draw(page.Canvas);

                    document.FinishPage(page);

                    WritePrintedPdfDoc(destination);

                    document.Close();

                    document.Dispose();

                    callback.OnWriteFinished(pages);
                }
                catch (Exception ex)
                {
                    ex.Message.ToString();
                }

            }
            void CalculateScale(PrintAttributes newAttributes)
            {
                try
                {
                    int dpi = Math.Max(newAttributes.GetResolution().HorizontalDpi, newAttributes.GetResolution().VerticalDpi);

                    int leftMargin = (int)(dpi * (float)newAttributes.MinMargins.LeftMils / 1000);
                    int rightMargin = (int)(dpi * (float)newAttributes.MinMargins.RightMils / 1000);
                    int topMargin = (int)(dpi * (float)newAttributes.MinMargins.TopMils / 1000);
                    int bottomMargin = (int)(dpi * (float)newAttributes.MinMargins.BottomMils / 1000);

                    int w = (int)(dpi * (float)newAttributes.GetMediaSize().WidthMils / 3500) - leftMargin - rightMargin;
                    int h = (int)(dpi * (float)newAttributes.GetMediaSize().HeightMils / 3500) - topMargin - bottomMargin;

                    scale = Math.Min((float)document.PageContentRect.Width() / w, (float)document.PageContentRect.Height() / h);
                }
                catch (Exception ex)
                {
                    ex.Message.ToString();
                }

            }
            void WritePrintedPdfDoc(ParcelFileDescriptor destination)
            {
                try
                {
                    var javaStream = new Java.IO.FileOutputStream(destination.FileDescriptor);
                    var osi = new OutputStreamInvoker(javaStream);
                    using (var mem = new MemoryStream())
                    {
                        document.WriteTo(mem);
                        var bytes = mem.ToArray();
                        osi.Write(bytes, 0, bytes.Length);
                    }
                }
                catch (Exception ex)
                {
                    ex.Message.ToString();
                }
            }
        }

        #region // Webview client
        public class WebViewLoaderClient : WebViewClient
        {
            public event EventHandler<bool> OnPageLoaded;
            public override bool ShouldOverrideUrlLoading(WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
            public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
            {
                base.OnPageStarted(view, url, favicon);
                progressBar.Visibility = ViewStates.Visible;
            }
            public override void OnPageFinished(WebView view, string url)
            {
                base.OnPageFinished(view, url);
                progressBar.Visibility = ViewStates.Gone;
            }
            public override void OnReceivedError(WebView view, ClientError errorCode, string description, string failingUrl)
            {
                base.OnReceivedError(view, errorCode, description, failingUrl);
                view.Visibility = ViewStates.Gone;
                Error();
            }
        }
        class MonkeyWebViewClient : WebViewClient
        {
            public override bool ShouldOverrideUrlLoading(WebView view, string url)
            {
                view.LoadUrl(url);
                return true;
            }
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
            {
                view.LoadUrl("file:///android_asset/myerrorpage.html");
            }
        }
        #endregion

        #region Error Message for Web View Error
        public static void Error()
        {
            AlertDialog.Builder alert = new AlertDialog.Builder(_context);
            alert.SetTitle(ErrorTitle);
            alert.SetMessage(ErrorMsg);
            alert.SetPositiveButton(Resource.String.ok, (senderAlert, args) =>
            {
                _context.Finish();
            });
            alert.SetCancelable(false);
            Dialog dialog = alert.Create();
            dialog.Show();
        }
        #endregion
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM