繁体   English   中英

Xamarin Android打印PDF文件

[英]Xamarin Android print PDF file

我正在尝试打印使用PrintManager创建的PDF文件。 我已经在活动中编写了使用ITextSharp生成PDF文件的代码。 下面是我的生成PDF方法:

    private byte[] generatePdf()
    {
        using (var baos = new MemoryStream())
        {
            using (var ps = new StreamWriter(baos))
            {
                Document doc = new Document(PageSize.A4, 72, 72, 72, 72);
                PdfWriter writer = PdfWriter.GetInstance(doc, ps.BaseStream);
                if (!doc.IsOpen())
                    doc.Open();

                doc.AddTitle("Sales Order " + GlobalVars.selectedSales.DocumentNo);
                var TitleFont = new Font(Font.FontFamily.TIMES_ROMAN, 24, Font.BOLD);
                var SubTitleFont = new Font(Font.FontFamily.TIMES_ROMAN, 20);
                var HeadingFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD);
                var BoldNormalFont = new Font(Font.FontFamily.TIMES_ROMAN, 14, Font.BOLD);
                var NormalFont = new Font(Font.FontFamily.TIMES_ROMAN, 14);

                doc.Add(new Paragraph("SALES ORDER", TitleFont));
                ... //other data
                doc.Close();
                writer.Close();
            }
            var bytes = baos.ToArray();
            return bytes;
        }
    }

简而言之,上面的代码将返回包含生成的PDF文件的字节数组,因为我不想将PDF保存在Android设备中的任何位置。

生成此PDF后,我将无法使用PrintManager ,后者仅使用PrintDocumentAdapter参数来生成文件,而不使用我的生成的PDF。 我试图生成从PrintDocumentAdapter继承的CustomPrintAdapter ,但不知道如何重用上面从活动中创建的PDF,因为它使用PrintedPdfDocument数据类型。

你们能在这里指出我正确的方向吗? 还是有其他更简单的方法可以实现打印自定义PDF文件?

更新1

事实证明,基于本文,Xamarin Android不支持System.Drawing.dll。 我认为ITextSharp库使用System.Drawing库,因为当我尝试构建它时,它引发了一个异常:

Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. 
Perhaps it doesn't exist in the Mono for Android profile?

当我删除它时,构建成功并且没有引发异常。 请注意,我已经尝试关闭解决方案,从Packages文件夹中删除所有内容,然后重新打开解决方案并进行构建; 在这种情况下不起作用。

因此,我将尝试使用Android.Graphics.Canvas生成PDF,如Android Developer网站上所示。

更新2

我无法像Android开发人员网站那样成功地使用Android.Graphics.Canvas生成PDF。 原因是我不知道如何计算页面并由于内容是动态的而更改页面。 该站点中也有类似getPrintItemCount()的方法,我不知道这是什么,因为该站点未在其中包含说明。

因此,我现在可以想到的解决方法是打印由Web服务端点处理的WebView 我正在为要打印的页面创建HTML布局,然后WebView将打开我的Web服务端点。 幸运的是,使用这种方法可以很好地进行打印。 当然,这种方法有局限性,即进行打印应该可以访问Web服务。

为此,首先,我需要创建一个自定义类,该类扩展了WebViewClient以在使用OnPageFinished方法完成页面加载时获取事件。 我,然后使用我的活动中的print方法,使用构造函数将其传递给我。 为了更清楚,我将附加我的代码。

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

这是我的活动中的doWebPrint方法

public async void doWebViewPrint(string URL)
    {
        if (await vm.printCheck())
        {
            PrintDocumentAdapter adapter;
            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
                adapter = webView.CreatePrintDocumentAdapter("test");
            else
                adapter = webView.CreatePrintDocumentAdapter();
            var printMgr = (PrintManager)GetSystemService(PrintService);
            printMgr.Print("printTest", adapter, null);
        }
    }

然后,我创建WebView ,每当用户单击“打印”按钮时加载网站。

Button btnPrintSO = FindViewById<Button>(Resource.Id.btnPrintSO);
btnPrintSO.Click += delegate
{
    string URL = ServerDatabaseApi.printSOEndpoint + GlobalVars.selectedSales.DocumentNo;
    webView = new WebView(this);
    CustomWebViewClient client = new CustomWebViewClient(this);
    webView.SetWebViewClient(client);
    webView.Settings.JavaScriptEnabled = true;
    webView.LoadUrl(URL);
    webView.Settings.UseWideViewPort = true;
    webView.Settings.LoadWithOverviewMode = true;
};

希望这些更新将来能对任何人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM