PDF格式的表单XObject页面模板

PDF格式的表单XObject页面模板,pdf,pdf-generation,Pdf,Pdf Generation,我正在编写一个PDF生成库,希望添加使用其他PDF作为模板的功能。规范指出,在带有模板对象别名的页面上,只需要一个templateInstanced属性 以下是pdf内容的要点: 模板本身将被存储,页面将显示在中 qpdf--check将PDF报告为无效: WARNING: tmp/alpaca.pdf: file is damaged WARNING: tmp/alpaca.pdf (file position 32089): xref not found WARNING: tmp/alpa

我正在编写一个PDF生成库,希望添加使用其他PDF作为模板的功能。规范指出,在带有模板对象别名的页面上,只需要一个
templateInstanced
属性

以下是pdf内容的要点:

模板本身将被存储,页面将显示在中

qpdf--check
将PDF报告为无效:

WARNING: tmp/alpaca.pdf: file is damaged
WARNING: tmp/alpaca.pdf (file position 32089): xref not found
WARNING: tmp/alpaca.pdf: Attempting to reconstruct cross-reference table
checking tmp/alpaca.pdf
PDF Version: 1.7
File is not encrypted
File is not linearized

正如评论中已经指出的,OP提供的PDF在结构上存在缺陷,交叉引用表的位置和条目是错误的。此外,从一个PDF修订版到下一个更新版的转换看起来有问题。因此,OP必须提供至少语法正确的PDF样本

尽管如此,OP表示他是

正在编写PDF生成库,并希望添加将其他PDF用作模板的功能。该规范注意到,应该只需要在具有模板对象别名的页面上使用TemplateInstancedProperty

命名页面机制并不适用于类似的情况。它当前的主要用途(如果使用过的话)是在Acroform操作生成页面模板的上下文中


对于使用其他PDF中的页面,只要将它们(以及引用的其他对象)作为单独的页面使用,就可以从源PDF中复制它们;如果要将多个模板放在一个目标页面上,则可以将复制的源文件包装成表单XObject,并将其包含在目标页面中。

恐怕您的PDF文档完全被破坏了,您误解了许多关键概念。您不能简单地将一个完整的PDF文件合并到另一个PDF文件中,就像您所做的那样,并期望它能够正常工作

您所引用的模板系统旨在将“隐藏”页面(PDF文件中的页面树中未引用)包含在交互式表单文档(或一般交互式文档)的上下文中。这听起来不像你打算做的。这些页面必须是有效的PDF页面。换言之,您可以不只是逐字地包含原始PDF文档,并期望PDF阅读器进行分类;您需要插入语法正确的PDF页面对象

您要做的是将文档的内容作为背景应用于文档。这通常是使用XObject完成的。这方面的伪代码可能是:

  • 打开原始PDF文档
  • 打开“模板”文档
  • 阅读模板文档并将模板页面中的所有元素复制到原始PDF文档中新创建的XObject中
  • 修改原始PDF文档中页面的页面内容,以便在现有页面的页面描述开头绘制新的XObject

需要再次注意的是,您不应该简单地将模板文档插入到新创建的XObject的流中。您必须创建一个有效的XObject,其中包含一个格式正确的资源字典,引用XObject所需的所有资源,并包含模板文档中的内容流。

我下载了您的pdf摘要。它指示32089处的外部参照(正如您的qpdf输出已经指示的那样),但您的交叉引用表根本不存在。看起来是48583(除非gist将PDF文件视为文本)。表中的条目看起来也不对。顺便说一句,转换
startxref 116%%EOF endstream endobj 17 0 obj
看起来至少很奇怪。太棒了!这更有意义。规范对此相当混乱。回到最基本的!您可以查看允许使用现有PDF作为模板的现有API(iText,go.applidok.com,…)。