0

在我的应用程序中,我将一些部分打印为用户的 pdf。我通过使用 PrintedPdfDocument 来做到这一点。

代码如下所示:

    // create a new document
    val printAttributes = PrintAttributes.Builder()
            .setMediaSize(mediaSize)
            .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
            .setMinMargins(PrintAttributes.Margins.NO_MARGINS)
            .build()
    val document = PrintedPdfDocument(context, printAttributes)

    // add pages
    for ((n, pdfPageView) in pdfPages.withIndex()) {
        val page = document.startPage(n)
        Timber.d("Printing page " + (n + 1))
        pdfPageView.draw(page.canvas)
        document.finishPage(page)
    }

    // write the document content
    try {
        val out: OutputStream = FileOutputStream(outputFile)
        document.writeTo(out)
        out.close()
        Timber.d("PDF written to $outputFile")
    } catch (e: IOException) {
        return
    }

一切正常。但是现在我想在最后添加另一个页面。唯一的例外是这将是从资产中预先生成的 pdf 文件。我只需要附加它,因此不需要额外的渲染等。

有没有办法通过 Android SDK 中的 PdfDocument 类来做到这一点?

https://developer.android.com/reference/android/graphics/pdf/PdfDocument#finishPage(android.graphics.pdf.PdfDocument.Page)

我认为这可能是一个类似的问题:如何结合多个 pdf 在 android 中转换单个 pdf?

但这是真的吗?答案不被接受,是3岁。有什么建议么?

4

1 回答 1

0

好吧,我会在这里回答我自己的问题。

似乎没有太多选择。至少我找不到任何本土的东西。Android 框架中有一些 pdf 库,但它们似乎都只支持创建新页面而不支持对现有文档的操作。

所以这就是我所做的:

首先,似乎没有任何好的 Android 库。我在这里找到了为 Android 准备 Apache PDF-Box 的那个。将此添加到您的 Gradle 文件中:

implementation 'com.tom_roush:pdfbox-android:1.8.10.3'

在代码中,您现在可以导入

import com.tom_roush.pdfbox.multipdf.PDFMergerUtility

我在哪里添加了一个方法

val ut = PDFMergerUtility()
ut.addSource(file)

val assetManager: AssetManager = context.assets
var inputStream: InputStream? = null
try {
    inputStream = assetManager.open("appendix.pdf")
    ut.addSource(inputStream)
} catch (e: IOException) {
    ...
}

// Write the destination file over the original document
ut.destinationFileName = file.absolutePath
ut.mergeDocuments(true)

这样,附录页面从资产加载并附加在文档的末尾。然后它被写回到与以前相同的文件中。

于 2021-04-21T08:23:19.510 回答