将自定义数据插入到PDF中

时间:2017-08-27 00:09:57

标签: angularjs laravel pdf amazon-s3 interpolation

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

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

enter image description here

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

将信息插入到PDF文档中似乎并不重要,而且我还没有找到关于以编程方式允许此操作的大量信息,但是有一些像DocHub这样的工具允许您在查看PDF时进行编辑。

我对学习感兴趣:

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

2 个答案:

答案 0 :(得分:1)

如果您已经在使用亚马逊服务,为什么不使用亚马逊lambda函数与iText7(java)结合使用来生成pdf点播服务呢?

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

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

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

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

答案 1 :(得分:1)

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

这种方法的一个主要缺点是缺乏灵活性。您是否注意到我在前一段中使用了“固定”一词三次?如果文本不符合预定义字段,那你就不走运了。如果该字段尺寸过大,您将获得足够的空白区域。如果您可以预测数据的样子,那么这种方法很有用。典型的用例是票证或凭证。例如:空表单是一个非常好的页面,只有几个字段,自动化系统可以放置名称,日期,时间和座位号。

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

更好的想法是将模板存储为HTML。请参阅iText的pdfHTML教程的chapter 5,其中我们有这个HTML片段:

<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中不存在<name>标记和<date>标记。所有HTML处理器(浏览器以及pdfHTML)都会忽略这些标记并将其内容视为标记为<span>

enter image description here

在纯HTML的上下文中使用这样的标记没有多大意义,但在pdfHTML的情况下它确实很有意义。使用pdfHTMLL,您可以配置自定义标记,并且结果看起来像下面显示的PDF:

enter image description here

查看“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?