【问题标题】:What do the ASCII characters preceding a carriage return represent in a PDF page?回车前的 ASCII 字符在 PDF 页面中代表什么?
【发布时间】:2018-12-23 14:18:33
【问题描述】:

这可能是一个相当基本的问题,但我很难弄清楚,它可能对未来的访问者有用。

我想获取 PDF 文件中的原始数据,并且我已经使用 Python 库 PyPDF2 使用以下命令对页面进行了解码:

import PyPDF2
with open('My PDF.pdf', 'rb') as infile:
    mypdf = PyPDF2.PdfFileReader(infile)
    raw_data = mypdf.getPage(1).getContents().getData()
    print(raw_data)

查看提供的原始数据,我开始怀疑回车前的 ASCII 字符很重要:我看到的每个回车前都有一个。看起来它们可能是某种令牌标识符。我已经发现/RelativeColorimetric 与序列ri\r 相关联。我目前正在查看PDF 1.7 standard Adobe provides,我知道在某处有解释,但我还没有在那个 756 页的庞然大物文档中找到它

【问题讨论】:

  • 提示:将最后一行更改为 print(raw_data.decode('latin1')) 以获得更好的视图,而不是现在返回的 b 字符串。
  • @usr2564301 解码后的字符串似乎不起作用,可能是因为在尝试显示期间回车会将所有内容重置到行首;无论如何,我对二进制字符串格式很好,因为我可以在需要时进一步处理它们。但如果我确实使用了该建议,我可能会对其进行调整以将输出字符串中的 \r 替换为其他内容。
  • 你是对的!我从我尝试过的 PDF 中得到了\ns,但我可以看到\r 行尾会如何弄乱你的显示。祝您调查顺利!

标签: pdf encoding


【解决方案1】:

这里的定义不是\r——它只是为了可读性而插入而不是常规空格——而是ri是一个运算符这一事实。

PDF 内容流使用基于堆栈的波兰符号语法:value<sub>1</sub> value<sub>2</sub> ... value<sub><em>n</em></sub> operator

例如,ri 的完整语法在第 127 页的表 57 中进行了说明:

intent ri (PDF 1.1) 在图形状态下设置颜色渲染意图(参见 8.6.5.8,“渲染意图”) .

这个想法是,这确实以这个顺序出现在内容流中。 (...我试图找到您正在使用的ri 的适当示例,但找不到;甚至在您提到的 ISO PDF 本身中也没有。)

来自其他地方的随机流 sn-p:

q
  /CS0 cs
  1 1 1 scn
  1.5 i
  /GS1 gs
  0 -85.0500031 -14.7640076 0 287.0200043 344.026001 cm
  BX
  /Sh0 sh
  EX
Q

(缩进来自我自己的 PDF 阅读器)显示 操作数/CS01 1 11.5 等),以及 运算符csscni 等)在每一行的末尾,以便清楚起见。

7.8.2 内容流对此进行了解释:

...
使用任何指定过滤器解码后的内容流应根据第 7.2 节“词汇约定”中描述的 PDF 语法规则进行解释。它由表示操作数和运算符的 PDF 对象组成。 运算符所需的操作数应在流中位于其前面。有关内容流的示例,请参见 7.4 “过滤器”中的示例 4。
(我的重点)

7.2.2 字符集 指定在内容流中,制表符、换行符和回车符等空白字符只是:分隔符,并且可以出现在任何位置和任何数量(> = 1) 在操作数和运算符之间。它提到了

注意本标准中的示例使用将标记排列成行的约定。但是,示例使用空格进行缩进纯粹是为了说明清楚,不需要包含在实际使用中。

– 我可以向其中添加大多数 PDF 创建软件确实尝试分隔由带有返回的操作数运算符序列组成的“行”。

【讨论】:

  • 有没有什么地方可以得到这些运算符的完整列表?我看过各个部分(8.4.4 - 图形状态操作符、8.6.8 - 颜色操作符和 9.3 - 文本状态参数和操作符),但有些操作符没有在这些部分中定义,例如 @987654334 @.
  • 使用搜索“操作员”,我似乎找到了我在 ISO 标准中寻找的内容:第 111 页的表 51 列出了操作员类别。
  • @Graham: g8.6.8 颜色运算符 中定义(表 74)。我发现 ISO 规范很枯燥,难以阅读和解析。也许您想阅读 Adob​​e 自己的 PDF Reference, 3rd Ed.(直接链接到 PDF),因为它更可口。
  • @Graham:如果你想要一个“可读”的内容流,比如在我的 sn-p 中,还有一个提示。您可以轻松识别字符串、数组、名称 (/Stuff) 和数字,并将其放在一行中。然后,下一个不是其中之一的项必须是运算符。
猜你喜欢
  • 1970-01-01
  • 2012-05-08
  • 2013-07-26
  • 1970-01-01
  • 2011-04-30
  • 2021-10-26
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多