如何引用预格式化 PDF (QDF) 中的文本内容? 糟糕的要求形成 XObjects页面内容流AcroForm 文本字段

问题描述

当使用文本编辑器编辑 PDF 文件的源文件时,我可以通过多次引用一个对象来多次使用它。

这个例子是对对象 15 的引用:

  /Resources <<
    /XObject <<
      /Fm0 15 0 R
    >>
  >>

如果对象 15 是文本,则此文本将出现在 PDF 查看器中引用它的每个位置。但它将始终采用 /Resources 下和对象 15 内的 stream 中定义的字体和大小:

15 0 obj
<<
  /BBox [
    3.24609
    767.215
    507.739
    819.297
  ]
  /FormType 1
  /Resources <<
    /Font <<
      /F1 25 0 R
    >>
    /ProcSet [
      /PDF
      /Text
      /ImageB
      /ImageC
      /ImageI
    ]
  >>
  /Subtype /Form
  /Type /XObject
  /Length 16 0 R
>>
stream
q
0 g
BT
0 Tr
/F1 25 Tf
1 0 0 1 36 785.248 Tm
[(0123)] TJ
ET
Q
endstream
endobj

我真正需要的是有一个字符串(实际上是四位数字),它在 PDF 源的两个或多个位置被引用。但是,每次使用的字体和大小都不同,而两种字体的编码是相同的(即,转换为 QDF 格式后,使用的字符在文本编辑器中可以作为纯文本读取——只要它们在 ASCII 中范围)。

所以我想我要寻找的是两件事:

  1. 将文本字符串添加到 PDF 文件以便我可以的正确方法
  2. 从不同的中引用它。

––> 有没有办法做到这一点?

[要求是,一旦准备就绪,如果我在要修改的行上方添加注释,则可以在任何系统上将四位数字替换为四个不同的数字,以便他们可以轻松找到正确的位置。无需先安装软件或字体(已嵌入到预格式化的 PDF 中),只需使用文本编辑器即可。]

解决方法

在文本编辑器中编辑文本 不是 PDF 设计的用例。因此,如果您的要求通用的解决方案不符合预期,请不要太惊讶。

在某些特殊情况下,您可以实施解决方案。尽管如此,作为一个整体的要求是一个坏主意。

糟糕的要求

要求是,一旦准备就绪,如果我在要修改的行上方添加注释,则可以在任何系统上将四位数字替换为四个不同的数字,以便他们可以轻松找到正确的位置。无需先安装软件或字体(已嵌入到预格式化的 PDF 中),只需使用文本编辑器即可。

这是一个糟糕的要求。使用十六进制编辑器编辑 PDF 已经是一件微妙的事情,但您至少可以确保不会无意中更改您不想更改的内容。许多文本编辑器在这方面有所不同,并且会应用更改(在实际文本文档的情况下无关紧要,但在 PDF 的情况下会发生变化)。

再次使用 QPDF 对编辑过的 PDF 进行后处理使这种影响相对化了一点,但这种方法会发生错误。

形成 XObjects

Form XObjects 并不是您问题的真正解决方案,因为它们不代表孤立的字符串,而是完整的、完全样式化的内容。它们可以转换为调整大小或旋转,每次使用都不同,但不能重新设置样式。

(好吧,您可以尝试使用过时的选项来使用没有 Resources 条目的 Form XObject;此对象将继承其显示页面的资源。不同的页面可能在它们的资源具有与 XObject 中使用的字体名称相关联的不同字体。这样,您至少可以在不同页面上以不同样式使用该编号。但如上所述,此构造已过时,因此不应使用。 )

页面内容流

如果显示有关四位数字的说明的文本只需要出现在页面级别(即不在某些 XObject、Pattern 等中),您可以利用页面内容 可以排列为一系列流。

例如:

%PDF-1.7
%äöü
1 0 obj
<<
/Length 9
>>
stream
(1234) Tj
endstream
endobj 
[... more indirect objects ...]
100 0 obj
/Type/Page 
/Contents [101 0 R 1 0 R 102 0 R 1 0 R 103 0 R]
[... more page entries ... ]
endobj
101 0 obj
<<
/Length XXX
>>
stream
[... some page specific drawing instructions ...]
BT
1 0 0 1 30 600 Tm
/Font1 10 Tf
endstream
endobj 
102 0 obj
<<
/Length XXX
>>
stream
ET
[... some page specific drawing instructions ...]
BT
0 1 -1 0 300 300 Tm
/Font2 20 Tf
endstream
endobj 
103 0 obj
<<
/Length XXX
>>
stream
ET
[... some page specific drawing instructions ...]
endstream
endobj 
[... more indirect objects and the whole end-of-file stuff ...]

这里页面对象 100 的内容分布在多个流上:

  • 101 以一些页面特定的绘图说明开始;然后它启动一个文本对象,转到 (30,600),然后选择大小为 10 的 Font1
  • 1 绘制字符串;
  • 102 结束文本对象并执行更多页面特定的绘图指令;然后它开始另一个文本对象,以 90° 转到 (300,300),并选择 Font2 大小为 20;
  • 1 绘制字符串;
  • 103 结束文本对象并执行更多页面特定的绘图指令。

AcroForm 文本字段

另一种选择是使用 AcroForm 文本字段。

此类文本字段具有单个值但具有多个可视化(小部件注释),并且不同的可视化可能具有不同的 DA 默认外观值,PDF 查看器可以从中构建外观。

但这并不适用于所有 PDF 查看器。

此外,在 PDF-2.0 中,您需要为所有小部件提供实际的外观流。