2012-09-30 64 views
11

我将PDF规范中的最小PDF示例从PDF Specification复制到NotePad,并将该文件重命名为扩展名为.pdfPDF规范中的最小PDF示例

我可以用其他PDF查看器(PDF-XChange,SumatraPDF,MuPDF)打开它。但是当我用Adobe Reader打开它时,它说文件已损坏。

我不确定其他观众是否将这个“损坏”的文件视为空白文件。

该文件应该显示一个空白页,因为它是一个最小的例子。

其实我修改了最小的例子。因为当我将它从PDF规范复制到记事本,并通过十六进制编辑器打开.txt文件时,我在.txt文件中看到一个新行,给我2个空格。例如,

1 0 obj 
<< /Type /Catalog 

给我(在十六进制编辑器)

1 0 obj << /Type /Catalog 

其是(在十六进制值)

31 20 30 20 6F 62 6A 0D 0A 3C 3C 20 2F 54 79 70 
65 20 2F 43 61 74 61 6C 6F 67 

j<之间的2个空间是0D 0A

因此,我不在NotePad中换新行,并修改xref部分中的值。

以下是完整的代码。

你知道这个例子有什么问题吗? Adobe Reader为什么说它被破坏了?这是因为我在xref中给出了错误的值吗?

%PDF-1.4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj << /Length 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395 %%EOF 

回答

16

第一:当您从PDF规格“复制”的例子,很可能一些事情发生这让你的副本不能按预期:

  • ...你没通过在文本编辑器中重新输入示例来'复制',但是
  • ...您使用copy'n'paste,使用PDF作为源文件。

根据您的文本编辑器,该方法可能导致将换行符转换从[cr] + [lf]更改为[cr],反之亦然。这又意味着对象'目录'('xref'-table)中的字节偏移号不再有效。

与您发布的PDF源代码的另一个问题是,它现在不包含任何换行符在所有。一些观众可能仍然能够静静地解析这个事物,但并不是全部。并且这肯定违反规范,因为根据规范,在第7.5.2章中明确指出,

“PDF文件的第一行应该是由5个字符%PDF - 接着是表单1的版本号。N,其中N是0到7之间的数字。

您的标头违反了该规则。

此外,的“流”中5 0 obj没有任何有效的PDF代码,它仅仅是占位符文本(… Page-marking operators …)。一些观众在遇到这种“垃圾”时可能会倾斜。

最后,您的startxref值不正确。

所以这里是一个文件的工作。我修好它在文本编辑器,我把你原来的代码注释的%%EOF后比较与借鉴:

%PDF-1.4 
1 0 obj 
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> 
endobj 
2 0 obj 
<< /Type Outlines /Count 0 >> 
endobj 
3 0 obj 
<< /Type /Pages /Kids [4 0 R] /Count 1 >> 
endobj 
4 0 obj 
<< /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> 
endobj 
5 0 obj 
<< /Length 35 >> 
stream 
… Page-marking operators … 
endstream 
endobj 
6 0 obj 
[/PDF] 
endobj 
xref 
0 7 
0000000000 65535 f 
0000000009 00000 n 
0000000074 00000 n 
0000000119 00000 n 
0000000176 00000 n 
0000000295 00000 n 
0000000376 00000 n 
trailer 
<< /Size 7 /Root 1 0 R >> 
startxref 
394 
%%EOF 

%% %PDF-1.4 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [4 0 R] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612 792] /Contents 5 0 R /Resources << /ProcSet 6 0 R >> >> endobj 5 0 obj << /Length 35 >> stream … Page-marking operators … endstream endobj 6 0 obj [/PDF] endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000119 00000 n 0000000176 00000 n 0000000295 00000 n 0000000373 00000 n trailer << /Size 7 /Root 1 0 R >> startxref 395 
+0

感谢库尔特,但为什么startxref的值是394不是396这不是值应该是该文件中'xref'中字符'x'的字节偏移量?它是一个十六进制编辑器中的396。但与396,该文件被打破,394作品。我不知道原因。 – user565739

+0

@ user565739:你应该运行'dd bs = 1 skip = 394 if = this.pdf'。这意味着在转储文件时跳过了前394个字节。现在输出应该以'xref'开头,并由它自己开始。 –

+0

当我复制/粘贴这个时,我不得不将单个字符“...”围绕“页面标记操作符”更改为三个字符“...”和从394到398的startxref。我怀疑当我复制/粘贴单个字符“...”被消灭了。通过扩展到三个,个人“。”在流的任一侧,添加了另外4个字节,这使我从394开始将外部参照表移动到398。 – Pat