Pdf 计算字节偏移量的问题

Pdf 计算字节偏移量的问题,pdf,pdf-generation,adobe,offset,postscript,Pdf,Pdf Generation,Adobe,Offset,Postscript,我现在正试图理解PDF结构,但在计算字符串的字节偏移量方面有点问题。对象的偏移量是从文件的开头到对象的索引(60 obj)的偏移量 我有一个工作的hello world PDF文件,但当我计算偏移量时,得到的偏移量与外部参照表中的不同 如果有人知道这是如何计算的,请告诉我 例如: 0 6 obj外部参照:9 me:17 0 1 obj外部参照:60 me:72 0 4 obj外部参照:145 me 187 (我以“\r\n”(2)作为换行符计数) Adobe标准件: %PDF-1.4 %%EOF

我现在正试图理解PDF结构,但在计算字符串的字节偏移量方面有点问题。对象的偏移量是从文件的开头到对象的索引(60 obj)的偏移量

我有一个工作的hello world PDF文件,但当我计算偏移量时,得到的偏移量与外部参照表中的不同

如果有人知道这是如何计算的,请告诉我

例如:

0 6 obj外部参照:9 me:17

0 1 obj外部参照:60 me:72

0 4 obj外部参照:145 me 187

(我以“\r\n”(2)作为换行符计数)

Adobe标准件:

%PDF-1.4
%%EOF
60 obj
>
endobj
10 obj
>
endobj
40 obj
>
endobj
20 obj
>
流动
英国电信
/F1 24 Tf
1001260600商标
(你好世界)Tj
ET
尾流
endobj
50 obj
>
endobj
30 obj
>
endobj
外部参照
0 7
0000000000 65535 f
00000000 600万n
0000000 228 00000 n
0000000 424 00000n
0000000 145 00000n
0000000 333 00000 n
000000000 900万n
拖车
>
起始外部参照
488
%%EOF

您不能假定行结束是一对\r\n,它可以是\r\n或\r\n,您需要使用二进制编辑器来确定。如果不访问原始文件,我们也无法告诉您哪个值是正确的,如上所述的剪切/粘贴根本不够好,对不起。尽管9不可能是正确的,除非%%EOF是虚假的

您引用的PDF文件无论如何都不正确,您不应该将%%EOF作为第二行,“应该”是一个二进制字节序列,并设置高位,以确保PDF文件作为二进制文件传输

如何知道PDF文件中的外部参照是正确的?如果您使用Acrobat打开它,它是否提供在退出时保存更改?这肯定表明Acrobat为您重建了外部参照,因为它不正确

[为清晰起见进行了编辑,因为评论太长]

我的解释应该更清楚些。在我最初的回答中,我把2条陈述压缩成1条,并打算在评论中加以澄清。文件不正确,外部参照偏移在我看来是错误的,初始检查时%%EOF似乎是错误的(但请稍后查看),这看起来在某种程度上是伪造的(通过剪切/粘贴、编辑器或其他方式插入)

从技术上讲,您可以在PDF文件中的任何位置(但在字符串和流之外)有任何以%开头的文本,前提是您正确地解释了它,并且没有破坏PDF语法。但我仍然不会在PDF文件中添加两条%%EOF注释,这很可能会让头脑简单的PDF用户感到困惑

我不认为在
'x y obj'
语句之前添加注释一定是错误的(我不会这么做,但这不是一回事)。这也不能完全否定David关于以下方面的观点:

The idea behind this is that you can open a file, set the file read position to a given offset and start reading.
前提是PDF使用者准备阅读评论,并且不希望出现空白或
'x y obj'
语句(我在这里看到了前面有空白的PDF文件)。这是有争议的,虽然我在阅读规范时会说外部参照偏移量应该精确地指向
'x y obj'
行的第一个字节,但它实际上并没有说规范中有这么多词。PDF使用者确实需要能够在对象定义本身的过程中处理注释。例如,我认为:

1 0 obj
%% Here's a comment
<<
/Type /Page
/Parent 5 0 R
/MediaBox [ 0 0 612 792 ]
/Resources 3 0 R
/Contents 2 0 R
>>
10对象
%%这里有一条评论
>
这是合法的。该行以“%”开头,它不在字符串或流上下文中,并且不会破坏PDF语法,使用者只需跳过它即可

这与以下内容差别不大:

%% Here's a comment
1 0 obj
<<
/Type /Page
/Parent 5 0 R
/MediaBox [ 0 0 612 792 ]
/Resources 3 0 R
/Contents 2 0 R
>>
%%这里有一条评论
10 obj
>
同样,我自己不会这样做(或者如果我这样做了,我会将外部参照指向10 obj的开始,但我认为这样做是有争议的


但在最初的示例中,我的二进制编辑器表示(具有2字节的行结束符)如果我使用1字节的结束符,则对象4从偏移量187开始。为了使对象1的外部参照正确,我假设行结束符为1字节,并删除“%%EOF\n”但是从170中减去6字节仍然是164,因此距离外部参照包含的145还很远。如果不删除真正的PDF运算符/结构,我看不到任何方法可以使对象4位于145位置。

这是一个非常有趣的文件,阅读PDF规范一开始让我更困惑:-)。在这种情况下(我会让一些人发疯),我只需保存示例PDF文件,并按照@KenS在之前的回答中的建议执行;在Acrobat中打开它,如果Acrobat报告它已损坏,或者在您关闭文件时要求您保存-它不喜欢它,您可以假设您弄错了

此文件之所以有趣,是因为第二行:

%%EOF
我不同意KenS的观点,这一行会自动使文件无效——我在ISO 32000中找不到任何文本说明这一点。该文本说明文件末尾的%%EOF行具有语法意义(并解释了为什么会出现该行),并说明以百分比字符(%)开头的任何行都是注释以及其含义。但是没有任何地方表明%%EOF不被允许作为文件中其他地方的注释(虽然我认为这是愚蠢的事情,但这是不同的)。

如果%%EOF行不存在,则外部参照表是正确的。如果有,那就错了。关于我在文档中阅读的内容的更多解释:

1) 据我所知,偏移量是从文件的第一个字节(它是字节偏移量,不是字符偏移量)开始的,即“0”,然后向上计数。这背后的想法是,您可以打开一个文件,将文件读取位置设置为给定的偏移量,然后开始读取。因此,如果您在二进制编辑器中打开文件,该编辑器显示实际字节,那么偏移量应该与您在那里看到的相匹配。如果%%EOF行不存在,则表示第一个对象(6 0 obj)实际上从偏移量9开始(如果行结束于charac
%%EOF