【问题标题】:PDF 1.3 text conversion with escape sequence and character code带有转义序列和字符代码的 PDF 1.3 文本转换
【发布时间】:2018-08-10 10:47:59
【问题描述】:

我有一个 PDF 1.3,我想在其中提取文本。 但是在流中有两种不同类型的文本。 一些纯文本和一些带有转义序列的字符编码文本。

这里是一个例子:

/TextClip BMC 
BT
/T1_2 1 Tf
0 Tc 0 Tw 7 Tr 16.2626 0 0 16.2626 37.2512 581.738 Tm
(Test Test)Tj
ET
EMC 
q
/GS0 gs
67.6799985 0 0 -13.4399997 37.439994 594.2399583 cm
/Im47 Do
Q
Q
Q
q
37.499 569.52 179.713 8.34 re
W n
q
/GS0 gs
180.959996 0 0 -9.5999998 36.959999 578.3999755 cm
/Im48 Do
Q
Q
q
37.499 569.52 179.713 8.34 re
W n
q
/TextClip BMC 
BT
0 Tc 0 Tw 7 Tr 9.899 0 0 9.899 37.2512 569.7178 Tm
[(\000E\000V\000d\000e\000\003\000E\000V\000d\000e)]TJ
ET
EMC

在此示例中,文本“Test Test”有 2 次。一次是计划文本,另一次是转义序列\000E\000V\000d\000e\000\003\000E\000V\000d\000e。 我只知道,如果转义序列后有 3 位数字,这是一个八进制字符代码。但在我的示例中,有时是 4 位,有时是 3 位。 转义序列后的第 4 个字符位于正确的 ascii 代码旁边的 15 处。 (\000E 是字符“T”)但是正确的转换是什么? 文本块\000\003 应该是一个空格符号。有什么转换技巧?

问候

【问题讨论】:

  • 您为什么要手动执行此操作?您应该使用某种 PDF 库来为您处理此问题。

标签: pdf text extract text-extraction


【解决方案1】:

显示 TJTj 等指令的文本的字符串参数的编码取决于相关的 PDF 字体,参见。规范

文本显示运算符的字符串操作数应被解释为标识要绘制的字形的字符代码序列。

对于简单字体,字符串的每个字节都应被视为一个单独的字符代码。然后应在字体的编码中查找字符代码以选择字形,如 9.6.6 “字符编码”中所述。

对于复合字体(PDF 1.2),可以使用多字节代码来选择字形。在这种情况下,字符串的一个或多个连续字节应被视为单个字符代码。代码长度以及从代码到字形的映射在称为 CMap 的数据结构中定义,如 9.7 “复合字体”中所述。

(第 9.4.3 节 - 文本显示运算符 - ISO 32000-1 中)

第一个文字显示操作使用的字体

(Test Test)Tj

可能是一种 简单字体,采用 ASCII 编码,可能是 WinAnsiEncoding。字体本身在上面两行中被选中

/T1_2 1 Tf

因此您只需查找字体资源T1_2 相关资源(如果您向我们展示页面内容流的摘录,则为页面资源)进行验证。

第二个文字显示操作使用的字体

[(\000E\000V\000d\000e\000\003\000E\000V\000d\000e)]TJ

似乎是一种具有双字节编码的复合字体,可能是 Identity-H,并且底层字体程序似乎具有在 TrueType 字体中最常见的字形代码。您应该在该 PDF 字体中寻找 ToUnicode 映射以便于解码。

选择此字体的说明不在您发布的说明中,但必须在上面的某个位置。此选择已保存为图形状态的一部分(在一些早期的 q 指令中)并再次恢复(在显示您共享指令的两个文本之间的一些 Q 指令中)。


如果转义序列后有 3 位数字,则表示这是一个八进制字符代码。但在我的示例中,有时是 4 位,有时是 3 位。

不,在您的示例中,总是有带有三个八进制数字的转义序列。其后的字符是一个单独的字节,即您有字节 '\000'、'E'、'\000'、'V'、'\000'、'd'、'\000'、'e'、' \000'、'\003'、'\000'、'E'、'\000'、'V'、'\000'、'd'、'\000'和'e'。

如上所述,这看起来像是一个双字节编码,特别是映射

\000E    -> 'T'
\000V    -> 'e'
\000d    -> 's'
\000e    -> 't'
\000\003 -> ' ' (space)

这似乎是 TrueType 字体中常见的一种字形编码,对于拉丁字母而言,它仅意味着对其 Unicode 代码的恒定偏移。

但也有许多不同的多字节编码常用,有时它们甚至是专门为手头页面上的字体创建的编码。

因此,如果您真的想从 PDF 中提取文本,您真的必须研究 PDF 规范并按照其要求实施,而不是希望获得一些转换技巧

Adobe 已在其网页 https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf 上发布了旧 PDF 规范 ISO 32000-1 的副本

【讨论】:

  • /T1_2 1 字体只选择了 1 次,之后有 2 种不同的编码?为什么第二个文本应该用多字节编码编码,而第一个文本应该用单字节编码? (换句话说:如果在这两个文本之前只设置了 1 次字体,那么指定应该使用哪种编码的这两个文本之间的运算符是什么?)
  • @Revilo 您的摘录不完整。请阅读我回答的“选择此字体的说明不在您发布的说明中,而是...”段落。
猜你喜欢
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2017-12-28
  • 2016-04-25
  • 2019-01-02
  • 1970-01-01
相关资源
最近更新 更多