【问题标题】:Interpolating custom data onto a PDF将自定义数据插入 PDF
【发布时间】:2018-02-04 15:25:32
【问题描述】:

我正在构建一个 Angular 测试准备应用程序(使用 Laravel 5.1 API)。其中一项要求是允许用户打印成就证书。

客户希望将该人的姓名和凭据插入到文档中(例如,在下面突出显示)。这是他们发送的 PDF 模板的快照:

我处理 PDF 查看的方式是简单地将文件存储在 S3 上并为他们提供指向该文件的链接。

将信息插入 PDF 文档似乎并不简单,我还没有找到很多关于以编程方式允许这样做的信息,但是有像 DocHub 这样的工具,可以让您在查看 PDF 时进行编辑。

我有兴趣学习:

  • 以编程方式执行此操作很简单吗?
  • 是否有我不知道的第 3 方工具?
  • 我什至可以将此信息发送到 S3 链接以首先进行插值吗?

【问题讨论】:

  • 在此处查看一些答案以开始使用:stackoverflow.com/questions/34049956/…
  • PDF 是处理链中的最终格式。特别是它不是为轻松更改可能需要重排现有内容的内容而设计的。您可能会考虑更改模板以包含 AcroForm 表单字段并填充它们,但这会根据插入的名称留下或多或少的大间隙。或者,您可以考虑将模板改造成其他一些非最终格式,例如html,以该格式插入值,然后转换为 pdf。

标签: angularjs laravel pdf amazon-s3 interpolation


【解决方案1】:

如果您已经在使用 Amazon 服务,为什么不使用 amazon lambda 函数,结合 iText7 (java) 来按需生成 pdf?

这样,您就可以保证 pdf 是正确的,并且每次都有很好的布局。

生成 pdf 可以通过以下方式完成:

  • 转换 HTML,
  • 以编程方式创建整个文档,
  • 填写和展平 XFA 表单。

我认为对于您的用例,选项 1 或 2 是最可持续的。

【讨论】:

    【解决方案2】:

    使用 PDF 作为编辑格式通常是一个糟糕的选择。如果您有一个带有固定字段的表单,那么这很容易。使用交互式表单创建 PDF 模板。在此表单中,基于 AcroForm 技术,您将定义具有固定坐标和固定大小的字段。然后,您可以向这些字段添加内容。

    这种方法的一个主要缺点是缺乏灵活性。您是否注意到我在上一段中使用了三遍“固定”一词?如果文本不适合预定义的字段,那么您就不走运了。如果该字段尺寸过大,您最终会得到大量空白。如果您可以预测数据会是什么样子,那么这种方法非常棒。一个典型的用例是一张票或一张代金券。例如:空表单是一个非常好的页面,只有几个字段,自动化系统可以在其中输入姓名、日期、时间和座位号。

    这不是您在屏幕截图中显示的示例的最佳方法。每一行文本、每个单词、每个字符的位置都是预先知道的。如果您想用一个长词替换一个短词(反之亦然),则需要重新计算所有这些位置(每一行的、整个页面的、可能是整个文档的)。那是疯狂。只有设计能力很差的人才会想出这样的想法。

    更好的办法是将模板存储为 HTML。例如,请参阅 iText 的 pdfHTML 教程的 chapter 5,其中我们有 HTML 的 sn-p:

    <html>
        <head>
            <title>Invitation to SXSW 2018</title>
        </head>
        <body>
            <u><b>Re: Invitation</b></u>
            <br>
            <p>Dear <name>SXSW visitor</name>,
            we hope you had a great SXSW film festival experience last year.
            And we would like to invite you to the next edition of SXSW Film
            that takes place from March 9 until March 17, 2018.</p>
            <p>Sincerely,<br>
            The SXSW crew<br>
            <date>August 4, 2017</date></p>
        </body>
    </html>
    

    实际上,它并不是真正的 HTML,因为 HTML 中不存在 &lt;name&gt; 标签和 &lt;date&gt; 标签。所有 HTML 处理器(浏览器以及 pdfHTML)都会忽略这些标签并将其内容视为标签是 &lt;span&gt;

    在纯 HTML 的上下文中使用这样的标签并没有多大意义,但在 pdfHTML 的情况下却很有意义。使用 pdfHTMLL,您可以配置自定义标签,并获得如下所示的 PDF:

    查看“John Doe”的文档并将其与“Bruno Lowagie”的文档进行比较。 “John Doe”这个名字比我的名字短得多,因此第一行有更多的词。文本很好地流动(我们也可以选择在两边证明文本的合理性)。这种“流程”是不可能用您的方法实现的,因为您永远无法让 PDF 模板很好地重排。

    好的,我明白了,你可能会说,但是实际方面呢?您谈论的是 Java / .Net 库,但我正在使用 Laravel 和 Angular.js。 首先,让我告诉您,我认为您不会为 Laravel 或 Angular 找到任何好的 PDF 工具。 js,因为 PDF 的性质和那些开发环境(在我看来,这些技术不能很好地结合在一起)。不管我怎么看,这对你来说应该不是什么大问题,因为你在亚马逊环境中工作。 AWS 支持 Java,使 pdfHTML 工作所需的 Java 代码非常少。我为 pdfHTML 教程编写的大多数代码示例都少于 15 行。那么为什么不试试 Java 和 pdfHTML?

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2021-06-21
      • 2013-06-04
      • 1970-01-01
      • 2014-11-07
      • 2017-04-14
      • 1970-01-01
      • 2011-04-12
      • 2016-03-03
      相关资源
      最近更新 更多