这可能是一个相当基本的问题,但是我在弄清楚它时遇到了一些麻烦,这可能对将来的访问者有用。
我想获取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页庞然大物中我还找不到它< / p>
答案 0 :(得分:1)
这里定义的不是\r
–只是插入而不是为了可读性的规则空间–而是ri
是运算符的事实。
PDF内容流使用基于堆栈的波兰语表示法语法:value1 value2 ... valuen operator
例如,第{127页}的表57中说明了ri
的完整语法:
意图 ri (PDF 1.1)在图形状态下设置颜色呈现意图(请参见8.6.5.8,“呈现意图”)
并且想法是,它确实按此顺序出现在内容流中。 (...我试图找到一个正在使用的ri
的适当示例,但找不到一个;甚至在您引用的ISO PDF本身中也找不到。)
其他地方的随机流摘要:
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阅读器)显示操作数(/CS0
,1 1 1
,1.5
等),以及为了清楚起见,请在每行末尾添加(cs
,scn
,i
等)
在 7.8.2内容流中对此进行了解释:
...
在使用任何指定的过滤器解码后,内容流应根据第7.2节“词汇约定”中所述的PDF语法规则进行解释。它由表示操作数和运算符的PDF对象组成。 运算符所需的操作数应在流中位于其前面。有关内容流的示例,请参见7.4中的示例4,“过滤器”。
(我的重点)
7.2.2字符集指定在内容流中,空格字符(例如tab,换行符和回车符)就是这样的:分隔符,并且可以在任何位置以任何数字出现(> = 1)在操作数和运算符之间。它提到
注释此标准中的示例使用一种约定将令牌按行排列。但是,示例将空格用于缩进的目的仅仅是为了说明的清楚,在实际使用中不必包括在内。
–我可以添加 most 的PDF创建软件,实际上是试图用操作符-操作符序列和返回符来定界“行”。