使用 Xamarin.Android 渲染 PDF 页面
本文档解释了如何使用 Xamarin.Android 渲染 PDF 页面。
本文档展示了如何使用 PDFRasterizer.NET 4.0 将 PDF 页面渲染为位图并渲染到 Android 画布。 PDFRasterizer.NET 4.0 支持各种框架,包括 Xamarin.Android。 本文是在 PDFRasterizer.NET 4.0 仍处于 Beta 版本时编写的。 您可以在 此处查看最新的更改日志。
将 PDF 页面渲染为 PNG
此处讨论的代码通过将 PDF 页面转换为位图并将其分配给 ImageView,在 Xamarin.Android 应用程序中绘制 PDF 页面。 为了使代码示例简单,PDF 文档本身作为资源嵌入。 在更实际的代码示例中,它将从设备或云存储中选择。
我们将展示相关的代码片段。 您可以从 github 下载完整的源代码。
布局
应用程序的主要布局仅包含一个 ImageView
,如下所示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Activity.OnCreateLayout
主 Activity 重写了 OnCreate
并执行以下任务
- 从嵌入为资源的“tiger.pdf”创建 PDF Page 对象
- 将 PDF Page 对象渲染为 Bitmap
- 将 Bitmap 分配给主布局的一部分
ImageView
如下所示
protected async override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);
var assembly = Assembly.GetExecutingAssembly();
var inputStream = new MemoryStream();
// create a PDF Page object from "tiger.pdf" that is embedded as a resource
using (Stream resourceStream = assembly.GetManifestResourceStream("DrawPdf.Android.tiger.pdf"))
{
resourceStream.CopyTo(inputStream);
}
using (var outputStream = new MemoryStream())
{
// render PDF Page object to a Bitmap
await Task.Run(() =>
{
Document document = new Document(inputStream);
Page page = document.Pages[0];
page.SaveAsBitmap(outputStream, CompressFormat.Png, 72);
});
// assign the Bitmap to the ImageView
Bitmap bmp = global::Android.Graphics.BitmapFactory.DecodeByteArray(outputStream.GetBuffer(), 0, (int) outputStream.Length);
ImageView imageView = FindViewById<ImageView>(Resource.Id.imageView);
imageView.SetImageBitmap(bmp);
}
}
将 PDF 渲染到 Android.Canvas
此处讨论的代码实现了一个自定义 View (PdfPageView),并将 PDF 页面直接绘制到 Android Canvas。
我们将展示相关的代码片段。 您可以从 github 下载完整的源代码。
Activity.OnCreate
在主 Activity 的 OnCreate
内部,构造一个 Page 实例并传递给 PdfPageView
构造函数。 自定义视图被设置为内容视图
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// create PDF page from the PDF document which is embedded as a resource
var assembly = Assembly.GetExecutingAssembly();
var inputStream = new MemoryStream();
using (Stream resourceStream = assembly.GetManifestResourceStream("DrawPdf.Android.tiger.pdf"))
{
resourceStream.CopyTo(inputStream);
}
Document document = new Document(inputStream);
Page page = document.Pages[0];
// create a customized view for the page
SetContentView(new PdfPageView(this, page));
}
PdfPageView
自定义 View 使用 Page.Draw
方法直接绘制到画布。 如下所示
public class PdfPageView : View
{
Page _page;
public PdfPageView(Context context, Page page) :
base(context)
{
_page = page;
}
protected override void OnDraw(Canvas canvas)
{
_page.Draw(canvas, 1);
}
}