如何动态生成PDF文档

如何动态生成PDF文档

我想构建一个用于生成时尚 PDF 文档的 Web 应用程序。布局应基于设计模板,数据应动态来自数据库。理想情况下,我想在带有占位符的“类似发布”工具中设计模板,并通过 Web 应用程序用数据库中的数据替换这些占位符。想象一下发票生成器之类的东西,客户可以从不同的发票模板中进行选择,发票数据本身来自数据库。感谢您的想法!

答案1

我使用 perl(带有 HTML::Template)从数据库数据生成 .ods 文档,然后使用 unoconv 将其转换为 pdf。准确来说:

  • 首先,创建一个美观的 .ods 文档。确保变量字段可识别。
  • 解压.ods文档并编辑文件contents.xml。
  • 在 content.xml 中,根据 HTML::Template 将所有变量字段更改为 <TMPL_VAR> 标签。此 content.xml 文件将成为您的模板。
  • 编写一个 Perl 程序,读取数据库,填充 TMPL_VAR 字段,写入新的 content.xml 文件,并将新的 content.xml 文件重新压缩到新的 .ods 文档中。
  • 然后使用 unoconv 将新文档转换为 pdf。

可轻松扩展以使用多个模板。

答案2

我曾使用 Java、Jasper Reports 和 iReport 完成过类似的任务。希望对您有所帮助。

答案3

我想将此作为评论发布,因为这是一般性建议,而不是最终解决方案,但它得到了轻微地太长了。我当然可以在评论中帮你找到具体的解决方案。

首先要说的是一般规则:没有单一的最佳解决方案。这主要取决于您设计文档时感觉如何。

如果您了解 LaTeX,那么这显然是可能的。LaTeX 文档非常漂亮,这几乎是定义上的。

如果您不了解 LaTeX,并且对一些选项不太熟悉,但了解 org-mode,那么这也是一个不错的选择。org-mode 文档可以转换为 LaTeX,然后可以转换为 PDF,而且看起来也很漂亮。pandoc也许可以直接做到这一点,但我没有检查过。

当然,另一种可能性是在 Org-mode 中设计文档,让 Emacs 从中构建 LaTeX 代码,然后在将其编译为 PDF 之前使用该 LaTeX 文档填充每个实例中的变量。这样,您仍然不必在 LaTeX 中设计文档,也不必从 Org-mode 文档构建,而是从 LaTeX 文档构建。

如果你觉得更少就好了,而且不想做太多,你可以使用 markdown。Markdown 提供到目前为止选项最少,包括设计选项和内容类型。但是,它非常容易学习和使用,您可以在 StackExchange 上直接设计您的文档并使用实时预览。这也应该让您了解它的局限性。用 Markdown 编写的文档很不错,但通常需要进行大量调整才能达到所需的输出格式(在您的情况下可能是多页 DIN A4 PDF),这有点违背了它易于学习的目的。当然,对于想要用 Markdown 编写大量文档的人来说,它可能是一个完美的解决方案,因为它非常容易写下来,但在您的情况下,编写部分是自动化的,因此这个优势并不重要,而且易于使用语言可能不值得为让文档看起来像您希望的那样而付出麻烦。

如果您对以上任何一种方法都不满意,您可以使用 Jos 的方法,在 LibreOffice 中设计文档,解压、更改content.xml、再次打包,然后将其转换为 PDF。但是,虽然这比 markdown 为您提供了更多的选项,但它提供的选项比 LaTeX 少得多,而且达到 org-mode 的级别会很麻烦。实际上,整个过程似乎很难快速适应,因为当您想要更改文档时,它涉及许多步骤。它似乎也是最容易出错的。不一定是以“最终形成 PDF”的方式,而是以“看起来应该是”的方式。

但需要注意的是:不要尝试用 Microsoft Office 替换 LibreOffice。虽然您可能能够找到将 Microsoft Office 转换为 PDF 的工具,但使用它们的格式似乎是一个非常糟糕的主意。原因是 LibreOffice 使用 OpenDocument 标准,该标准使用标准 zip 文件,因此您可以使用任何 zip 工具来提取和打包文件。另一方面,Microsoft Office 文件仅基于 zip。您可以使用普通的 zip 工具提取它们,但无法使用标准 zip 工具打包它们。

如果您需要目录,org-mode 或 LaTeX 特别有用。其他的可能也行,但需要更多工作。如果您需要大量选项并且愿意在必要时学习,LaTeX 绝对是您的最佳选择。

相关内容