如何引用预格式化 PDF (QDF) 中的文本内容?

How to reference text content in preformatted PDF (QDF)?

当使用文本编辑器编辑 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 设计的用例。因此,听到您的要求的通用解决方案并不令人期待时,请不要太惊讶。

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

糟糕的要求

The requirement is that, once ready, the four digits can be replaced by four different ones on any system if I put a comment above the line to be amended so they can easily find the right spot. Without having to install software or fonts (which are already embedded in the preformatted PDF) first, but just by using a text editor.

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

使用 QPDF 对编辑后的 ​​PDF 进行后处理会稍微降低这种影响,但这种方法会发生错误。

表单 XObjects

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

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

页面内容流

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

例如:

%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),并选择大小为 20 的 Font2
  • 1绘制字符串;
  • 103 结束文本对象并执行更多页面特定的绘图指令。

AcroForm 文本字段

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

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

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

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