0

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

此示例是对对象 15 的引用:

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

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

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 中),只需使用文本编辑器即可。]

4

1 回答 1

1

在文本编辑器中编辑文本不是 PDF 设计的用例。因此,听到您的需求不会出现通用解决方案时,请不要太惊讶。

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

一个糟糕的要求

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

这是一个不好的要求。使用十六进制编辑器编辑 PDF 已经很微妙了,但至少可以确保您不会无意中更改不想更改的内容。许多文本编辑器在这方面是不同的并应用更改(在实际文本文档的情况下无关紧要,但在 PDF 的情况下确实如此)。

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

表单 XObject

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

AcroForm 文本字段

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

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

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

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

于 2021-04-26T12:46:24.010 回答