【问题标题】:Draw contents of a PDF file to a Canvas将 PDF 文件的内容绘制到 Canvas
【发布时间】:2018-09-16 18:37:05
【问题描述】:

我的 Android 应用程序正在使用 PdfDocument 以编程方式生成多页 PDF 文件:

public byte[] buildPDF() {
    int pageWidth = Math.round(8.5f * 72f);
    int pageHeight = Math.round(11.0f * 72f);
    int margin = Math.round(.5f * 72f);
    int fontSize = 12;

    TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
    textPaint.setColor(Color.BLACK);
    textPaint.setTextSize(fontSize);
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);

    PdfDocument document = new PdfDocument();
    PdfDocument.Page page = null;
    Canvas canvas = null;

    for (int i=0; i<10; i++) {
        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, document.getPages().size()).create();
        page = document.startPage(pageInfo);
        canvas = page.getCanvas();

        String content = "Content for page " + (i + 1);
        canvas.drawText(content, margin, margin + fontSize, textPaint);
        document.finishPage(page);
    }

    byte[] output = new byte[0];
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {
        document.writeTo(outputStream);
    } catch (Exception e) {
        Log.d("buildPDF", "error writing PDF output");
        return output;
    }
    output = outputStream.toByteArray();
    document.close();

    return output;
}

在某些情况下,我想将本地设备中的现有 PDF 文件放入这一系列页面中。最简单的工作流程是以某种方式将 PDF 文件作为数据打开,然后将其写入画布。有没有办法用 Android SDK 做到这一点?

这在 iOS 中使用 CGPDFDocumentRefCGContextDrawPDFPage 很容易,但我还没有找到适用于 Android 的等效项。

如果没有内置方法,那么 Apache PDFBox 中的 multipdf 包似乎可以胜任这项工作。但是,我需要内存中的数据,如上所示,所以我认为这需要将生成的数据写入临时文件,对临时文件执行操作,然后将数据读回内存。

【问题讨论】:

    标签: android pdf pdf-generation


    【解决方案1】:

    我的 Android 应用程序正在使用 PdfDocument 以编程方式生成多页 PDF 文件:

    请注意,PdfDocument 设计用于打印,而不是用于创建任意 PDF 文件。

    最简单的工作流程是以某种方式将 PDF 文件作为数据打开,然后将其写入画布。有没有办法用 Android SDK 做到这一点?

    不,抱歉。

    【讨论】:

    • 我不明白关于打印的评论。我按照文档中的描述使用它:developer.android.com/reference/android/graphics/pdf/…
    • @arlomedia:android.graphics.pdf 中的类用于打印,而不是用于处理任意 PDF 文件。诚然,PdfDocument 很可能生成可供任意其他工具使用的 PDF。相比之下,PdfRenderer 对很多很多 PDF 文件都失败了。我的观点是,许多开发人员认为 Android 具有完整的 PDF 处理支持,但事实并非如此。
    【解决方案2】:

    CommonsWare 回答了我的具体问题(SDK 不能这样做),但这里有一些关于第三方工具的更多信息可以:

    1. 我尝试了 Apache PDFBox,然后意识到它与 Android 不兼容。然后我找到PdfBox-Android 并尝试安装它,但遇到了一系列构建问题,从“Dex 文件的数量不能超过 64,000......”开始,我花了几个小时试图构建它,然后感觉就像我在追逐野鹅,然后我继续前进。

    2. iTextG 在这种情况下经常出现,但我一直遵循这样的规则,即如果软件公司不在其网站上列出其价格,我就买不起。我确实继续发送了价格请求,但他们将我的请求转发给了经销商,然后经销商的回复进入了我的垃圾邮件文件夹,直到为时已晚,我才看到它。它们的成本没有我担心的那么高,但考虑到 PDF 在我的应用程序中的作用相对较小,仍然不太可行。

    3. 我已经在我的应用程序中使用Radaee PDF 作为 PDF 查看器,我意识到它包含一些文档编辑和合并功能。我无法让它与我正在使用的旧库版本一起使用,但在他们的技术支持的帮助下,我能够将我的项目更新为当前版本,并且有效。这需要高级许可,但他们提供的固定费用定价结构对我的项目来说并非遥不可及。

    因此,我花了一周的大部分时间处理第三方库并解决兼容性问题,但是一旦运行,它只需要 14 行代码即可获得我想要的功能。这是一个很好的例子,说明为什么软件开发时间如此难以估计……哈哈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多