问题描述
当使用文本编辑器编辑 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 中范围)。
所以我想我要寻找的是两件事:
––> 有没有办法做到这一点?
[要求是,一旦准备就绪,如果我在要修改的行上方添加注释,则可以在任何系统上将四位数字替换为四个不同的数字,以便他们可以轻松找到正确的位置。无需先安装软件或字体(已嵌入到预格式化的 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 中,您需要为所有小部件提供实际的外观流。