2012-09-30 101 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