2012-09-30 30 views
11

Tôi lấy ví dụ PDF tối thiểu trong thông số PDF từ PDF Specification, sao chép nó vào NotePad, đổi tên tệp thành phần mở rộng .pdf.Ví dụ PDF tối thiểu trong đặc tả PDF

Tôi có thể mở bằng trình xem PDF khác (PDF-XChange, SumatraPDF, MuPDF). Nhưng khi tôi mở nó với Adobe Reader, nó nói rằng tập tin bị hỏng.

Tôi không chắc liệu người xem khác xem tệp "bị hỏng" này có phải là tệp trống hay không.

Tệp được cho là hiển thị một trang trống, vì đây là một ví dụ tối thiểu.

Thực tế, tôi sửa đổi ví dụ tối thiểu. Vì khi tôi sao chép từ thông số PDF sang notepad và mở tệp .txt bằng Trình chỉnh sửa Hex, tôi thấy một dòng mới trong .txt tệp cung cấp cho tôi 2 không gian. Ví dụ,

1 0 obj 
<< /Type /Catalog 

mang lại cho tôi (trong Hex Editor)

1 0 obj << /Type /Catalog 

đó là (trong các giá trị hex)

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 

2 khoảng trống giữa j<0D 0A.

Do đó, tôi không tạo dòng mới trong NotePad và sửa đổi các giá trị trong phần xref.

Dưới đây là mã đầy đủ.

Bạn có biết điều gì sai với ví dụ này không? Tại sao Adobe Reader lại nói nó bị hỏng? Đây có phải là vì tôi đã đưa ra các giá trị sai trong xref không?

%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 

Trả lời

16

Đầu tiên: khi bạn 'sao chép' ví dụ từ các đặc điểm kỹ thuật PDF, rất có thể một vài điều xảy ra mà làm bản sao của bạn để không làm việc như mong đợi:

  • ... bạn trai tôi không 't' copy 'bằng cách nhập lại ví dụ trong trình chỉnh sửa văn bản, nhưng
  • ... bạn đã sử dụng copy'n'paste, sử dụng PDF làm tệp nguồn.

Tùy thuộc vào trình soạn thảo văn bản của bạn, phương pháp đó có thể gây ra việc chuyển đổi quy ước đường mới được thay đổi từ [cr] + [lf] sang [cr] hoặc ngược lại. Điều này có nghĩa là số byte bù đắp trong bảng nội dung của đối tượng '(' xref '-table) không còn giá trị.

Một vấn đề khác với mã nguồn PDF bạn đã đăng là bây giờ nó không chứa bất kỳ dấu ngắt dòng nào tại tất cả. Một số người xem có thể vẫn lặng lẽ phân tích cú pháp, nhưng không phải tất cả. Và nó chắc chắn là chống lại spec, bởi vì theo spec, trong chương 7.5.2 nó rõ ràng được viết ra rằng

"Dòng đầu tiên của tệp PDF phải là tiêu đề gồm 5 ký tự% PDF - theo sau là số phiên bản của biểu mẫu 1.N, trong đó N là một chữ số từ 0 đến 7.

Tiêu đề của bạn vi phạm quy tắc đó.

Ngoài ra, 'luồng' trong 5 0 obj không phải là bất kỳ mã PDF hợp lệ nào, nó chỉ là văn bản giữ chỗ (… Page-marking operators …). Một số người xem có thể nghiêng khi họ gặp 'rác' đó.

Cuối cùng, giá trị startxref của bạn không chính xác.

Vì vậy, đây là tệp hoạt động. Tôi sửa chữa nó trong một trình soạn thảo văn bản, và tôi đặt mã ban đầu của bạn như một lời nhận xét sau khi %%EOF để so sánh và tham khảo:

%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

Cảm ơn Kurt, nhưng tại sao giá trị của startxref là 394 không 396. Không phải là giá trị này nên được bù đắp byte của nhân vật 'x' trong 'xref' trong tập tin này? Nó là 396 trong một Hex Editor. Nhưng với 396, tệp bị hỏng và 394 công trình. Tôi không biết lý do. – user565739

+0

@ user565739: Bạn nên chạy 'dd bs = 1 skip = 394 if = this.pdf'. Điều đó có nghĩa là bạn đã bỏ qua 394 byte đầu tiên khi bán phá giá tệp. Bây giờ đầu ra sẽ bắt đầu bằng 'xref' trên một dòng bởi chính nó. –

+0

Khi tôi sao chép/dán, tôi phải thay đổi ký tự đơn "..." xung quanh "toán tử đánh dấu trang" thành ba ký tự "..." và startxref từ 394 đến 398. Tôi nghi ngờ rằng khi tôi sao chép/dán nhân vật duy nhất "..." bị nghiền nát. Bằng cách mở rộng thành ba, "." ở hai bên của luồng, thêm 4 byte khác đã chuyển tôi đến 398 từ 394 để bắt đầu bảng xref. – Pat

Các vấn đề liên quan