在 android 中创建、显示和打印 pdf 文档的最佳策略是什么

What is the best strategy for creating, displaying and printing pdf documents in android

我打算使用内置的 android pdf 库。在我的应用程序中,我需要显示一个可能包含多个页面的 pdf 报告。用户应该能够打印这些页面。使用 PrintDocumentAdapter 进行打印似乎非常简单,但我不清楚创建 pdf 的最佳方式是什么。我知道您可以仅使用 View/canvas 生成 PdfDocument,或者采用更多 "low-level" 方法绘制线条、文本、绘画等

我看到三种可能性:

  1. 为每个页面创建一个视图。用户可以根据需要在视图之间导航并打印。但是我不清楚如何为每个 page/view 生成 pdf。我的意思是,如果我正在查看 page/view 1,是的,我可以轻松地从中创建一个 pdf,但是其他页面呢?是的,我可以将其保存在内存中,但我发现,如果它们没有主动显示在屏幕上,它们就会创建空的 pdf。我不想让用户单独打印每一页。

  2. 创建 pdf 文档(低级方法),集成 pdf reader 并从那里 display/print pdf。

  3. 为用户可以浏览的每个页面创建一个视图。当调用打印选项时,再次生成pdf文档(低级方法)

显然选项 1 是首选方法,但我不清楚如何才能做到这一点。当然,我可能会在这里遗漏一些东西,因此我们将不胜感激!

那里有一些 pdf 生成库。 Itext 是最简单易用的,但它贵得离谱。 Pdfjet 是另一种价格合理的。我相信快速 google 将为您提供更多信息。

Android 没有内置 pdf 生成库,但在 API19 android 中提供了一个 api https://developer.android.com/reference/android/graphics/pdf/PdfDocument.html

但正如@Ivan Wooll 所说,如果您想使用,itext 是一个不错的 pdf 生成库。

...but what's unclear to me is what is the best way to create the pdf...

然而,这是相对的。这真的是 library/framework 您觉得使用哪个更方便的问题,因为它们中的每一个都提供相同的功能,但都有自己的缺点。例如,与我合作过的有以下这些:

  1. iText - 您必须购买许可证才能用于商业用途(参见 What is latest version of itext that is not AGPL?);
  2. Android 打印框架 - 没有内置 pdf 打印前预览,如您在第二项中所述(您可以使用内置 PdfRenderer though for API 21+; also see Display PDF within app on Android?). Another disadvantage is the disturbing system dialogs当你想 save/print "silently" :)

甚至 official documentation 也指出 "You can use any PDF generation library to generate a PDF document and pass it to the Android print framework for printing."

...Yes I can have this in memory, but what I've found is if they aren't actively being displayed on screen, they create empty pdfs...

当您将用户留下的视图保留在内存中时,空 pdf 的原因是它们的 0 维因为没有被布局(参见 Android: PdfDocument generates empty pdf).如果您尝试夸大用户尚未达到的视图,也会发生同样的情况...事实上,您对此无能为力,这就是 Android 的工作方式。

I don't want to have the user print each page individually.

在这种情况下,我建议您为用户当前正在与之交互的每个内容视图提前创建 pdf 页面,只要确保在 [=61= 上绘制视图时视图仍然处于布局状态即可].对于当前未布局的视图,请使用 "low-level approach"。一旦请求打印,将输出 pdf 传递给 Android Print Framework.