[英]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.