Vì tò mò đơn giản, đã xem GIF nhỏ nhất , tệp PDF hợp lệ nhỏ nhất có thể là gì?
Vì tò mò đơn giản, đã xem GIF nhỏ nhất , tệp PDF hợp lệ nhỏ nhất có thể là gì?
Câu trả lời:
Đây là một vấn đề thú vị. Lấy nó bằng cuốn sách, bạn có thể bắt đầu với điều này:
%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000053 00000 n
0000000102 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
149
%EOF
Đó là 291 byte niềm vui PDF. Acrobat mở nó, nhưng nó phàn nàn phần nào. Có một trang trong đó và nó có diện tích 3/72 ", mức tối thiểu cho phép của thông số kỹ thuật.
Tuy nhiên, Acrobat X thậm chí không bận tâm đến bảng tham chiếu chéo nữa, vì vậy chúng tôi có thể loại bỏ điều đó:
%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Size 4/Root 1 0 R>>
Acrobat phàn nàn, nhưng mở nó ra. Bây giờ chúng tôi ở mức 178 byte. Hóa ra là bạn không cần / Kích thước trong đoạn giới thiệu. Bây giờ chúng tôi ở mức 172:
%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>
Hóa ra bạn không cần tất cả các yếu tố pesky / Type trong từ điển của bạn:
%PDF-1.0
1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>
Bây giờ chúng tôi ở mức 138 byte.
Nó cũng chỉ ra rằng khi thông số kỹ thuật nói "sẽ là một tham chiếu gián tiếp" và / Count là bắt buộc và tiêu đề "phải" là% PDF-1.0, họ đang đưa ra các đề xuất lỏng lẻo. Đây là cái nhỏ nhất tôi có thể làm được và có thể mở được trong Acrobat X:
%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>
70 byte.
Bây giờ, trình soạn thảo của tôi sử dụng kỷ luật dòng mới của Windows, nhưng Acrobat chấp nhận các quy ước của Windows, Mac hoặc Unix, vì vậy bằng cách sử dụng trình soạn thảo hex, tôi đã thay thế \ r \ n bằng \ r và loại bỏ hoàn toàn dòng mới cuối cùng, để lại cho tôi 67 byte
25 50 44 46 2D 31 2E 0D 74 72 61 69 6C 65 72 3C
3C 2F 52 6F 6F 74 3C 3C 2F 50 61 67 65 73 3C 3C
2F 4B 69 64 73 5B 3C 3C 2F 4D 65 64 69 61 42 6F
78 5B 30 20 30 20 33 20 33 5D 3E 3E 5D 3E 3E 3E
3E 3E 3E
Tôi đã thử gỡ bỏ từ điển cuối cùng (>>), nhưng Acrobat sẽ không có điều đó. Việc đọc PDF tích hợp vào Google Chrome (FoxIt) sẽ không mở nó.
Là một PostScript (HA! Xem những gì tôi đã làm ở đó?), Nếu bạn đồng ý với Acrobat "sửa chữa" tệp, nó có tới 3550 byte, hầu hết là siêu dữ liệu tùy chọn, nhưng nó để lại một số vi phạm thông số rõ ràng.
minimum allowed by the spec
và sau đó vượt lên trên. Câu trả lời tuyệt vời, cảm ơn bạn! :)
\n
được nhúng trong đó và khi giải mã Base64 không cung cấp nội dung tệp chính xác.
Tôi không thể lấy ví dụ hello world để mở.
Đối với một tệp nhỏ có nội dung văn bản:
%PDF-1.2
9 0 obj
<<
>>
stream
BT/ 9 Tf(Test)' ET
endstream
endobj
4 0 obj
<<
/Type /Page
/Parent 5 0 R
/Contents 9 0 R
>>
endobj
5 0 obj
<<
/Kids [4 0 R ]
/Count 1
/Type /Pages
/MediaBox [ 0 0 99 9 ]
>>
endobj
3 0 obj
<<
/Pages 5 0 R
/Type /Catalog
>>
endobj
trailer
<<
/Root 3 0 R
>>
%%EOF
Tôi nghĩ rằng tôi sẽ tạo một pdf nhỏ nhất hiển thị "Hello World". Các văn bản ở góc dưới bên trái. Xin lỗi về phông chữ 9 điểm, bất kỳ lớn hơn sẽ tốn thêm một byte :)
172 byte cho Adobe Reader X (nếu được lưu với các dòng mới chỉ có nguồn cấp dữ liệu và không có dòng mới hoặc byte rỗng):
%PDF-1.
1 0 obj<</Kids[<</Parent 1 0 R/Resources<<>>/Contents 2 0 R>>]>>endobj 2 0 obj<<>>stream
BT/ 9 Tf(Hello World)' ET
endstream
endobj trailer<</Root<</Pages 1 0 R>>>>
120 byte cho trình xem PDF dựng sẵn của Chrome:
%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>
Để dễ dàng thấy điều này trong Chrome, hãy dán URI này vào thanh địa chỉ (SO sẽ không cho phép tôi liên kết với nó và nó sẽ không hoạt động ở tất cả các trình duyệt khác):
data:application/pdf,%25PDF%201%200%20obj%3C%3C%2FPages%3C%3C%2FKids%5B%3C%3C%2FContents%3C%3C%3E%3Estream%0ABT%209%20Tf(Hello%20World)'%20ET%20endstream%3E%3E%5D%3E%3E%3E%3Eendobj%20trailer%3C%3C%2FRoot%201%200%20R%3E%3E
Trong Java, sử dụng cái này:
private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";
và sau đó
byte[] bytes = hexStringToByteArray(samplepdf);
...
public byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
return data;
}