PDF hợp lệ nhỏ nhất có thể là gì?


139

Vì tò mò đơn giản, đã xem GIF nhỏ nhất , tệp PDF hợp lệ nhỏ nhất có thể là gì?


Phụ thuộc vào cách bạn tạo ra nó. Rất có thể là bạn sẽ có thể tự viết một cái nhỏ hơn (trong trình chỉnh sửa) so với những gì ứng dụng sẽ tạo ra.
devnull

Hãy thử cho "showpage" (trích dẫn w / o) vào ghostscript hoặc ps2pdf.
devnull

Câu trả lời:


194

Đâ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.


25
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. Không, những đề xuất không lỏng lẻo, đó là những yêu cầu về tính hợp lệ. Ngay cả khi một số người xem PDF không thực thi chúng, không tuân theo chúng có nghĩa là sự vô hiệu và OP đã yêu cầu một tệp PDF hợp lệ.
mkl

23
Được chấp nhận vì câu trả lời bắt đầu với minimum allowed by the specvà sau đó vượt lên trên. Câu trả lời tuyệt vời, cảm ơn bạn! :)
lưới

Xin vui lòng, đó là một câu trả lời tuyệt vời. Bây giờ, làm thế nào về pdf hợp lệ nhỏ nhất với một dòng văn bản trong đó, như "Hello World". Tôi nghĩ rằng nó sẽ đơn giản như việc thêm {stream BT ("Hello World") cuối dòng} nhưng cho đến nay không thể làm cho Acrobat hài lòng.
neemonyon

1
Đó là thông số kỹ thuật. Biểu đồ của các đối tượng trong PDF có chu kỳ.
bệ

1
@towi Phiên bản được mã hóa base64 của bạn có \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.
Christopher Schultz

19

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

2
Điều này sẽ không hoạt động, bạn cần xác định một tài nguyên phông chữ và chọn nó bên trong nội dung trang cho văn bản để hiển thị.
yms

2
tệp này thực sự mở dưới Mac OS X El Capitan trong khi câu trả lời được đánh giá cao nhất với PDF1.0 thì không.
Devy

12
Cũng mở dưới chrome, dữ liệu: application / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Luke REHMANN

8

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

2
Khá nhỏ. ;) Không hợp lệ, mặc dù, theo thông số kỹ thuật.
mkl

8
Sẽ không mở trong Chrome cho tôi.
Luke Rehmann

0

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;
}

OP yêu cầu tệp PDF hợp lệ nhỏ nhất có thể ; của bạn không hợp lệ theo thông số kỹ thuật.
mkl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.