65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Xamarin.Android 渲染 PDF 页面

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2016年11月22日

CPOL

1分钟阅读

viewsIcon

20546

本文档解释了如何使用 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);
    }
}
© . All rights reserved.