PDF ที่ถูกต้องที่สุดเท่าที่เป็นไปได้คืออะไร


139

จากความอยากรู้อยากเห็นอย่างง่าย ๆ เมื่อเห็นGIFที่เล็กที่สุดไฟล์ PDF ที่ถูกต้องที่เล็กที่สุดที่เป็นไปได้คืออะไร


ขึ้นอยู่กับว่าคุณสร้างมันขึ้นมา โอกาสที่คุณจะสามารถเขียนเล็ก ๆ น้อย ๆ ด้วยตัวคุณเอง (ในเครื่องมือแก้ไข) ได้ดีกว่าที่แอปพลิเคชันจะสร้าง
devnull

ลองป้อน "showpage" (ไม่ต้องใส่เครื่องหมายอัญประกาศ) เพื่อ ghostscript หรือ ps2pdf
devnull

คำตอบ:


194

นี่คือปัญหาที่น่าสนใจ. คุณสามารถเริ่มต้นด้วยสิ่งนี้:

%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

ซึ่งมีความสุข PDF 291 ไบต์ Acrobat เปิดมัน แต่มันก็ค่อนข้างบ่น มีหนึ่งหน้าในนั้นและมันคือ 3/72 "สแควร์ขั้นต่ำที่ได้รับอนุญาตโดยสเป็ค

อย่างไรก็ตาม Acrobat X ไม่ได้ยุ่งกับตารางตัวอ้างอิงโยงอีกต่อไปดังนั้นเราสามารถนำสิ่งนั้นออกมา:

%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 บ่น แต่เปิดมัน ตอนนี้เราอยู่ที่ 178 ไบต์ ปรากฎว่าคุณไม่ต้องการ / ขนาดในตัวอย่าง ตอนนี้เราอยู่ที่ 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>>

ปรากฎว่าคุณไม่ต้องการองค์ประกอบที่น่ารำคาญ / ประเภททั้งหมดในพจนานุกรมของคุณ:

%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>>

ตอนนี้เราอยู่ที่ 138 ไบต์

นอกจากนี้ยังปรากฎว่าเมื่อข้อมูลจำเพาะระบุว่า "จะเป็นการอ้างอิงทางอ้อม" และ / จำเป็นต้องมีและส่วนหัว "ต้อง" เป็น% PDF-1.0 พวกเขากำลังให้คำแนะนำที่หลวม นี่เป็นขนาดที่เล็กที่สุดที่ฉันสามารถทำได้และเปิดให้ใช้งานได้ใน Acrobat X:

%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>

70 ไบต์

ตอนนี้ตัวแก้ไขของฉันใช้ระเบียบวินัยการขึ้นบรรทัดใหม่ของ Windows แต่ Acrobat ยอมรับการประชุม Windows, Mac หรือ Unix ดังนั้นโดยใช้ตัวแก้ไขฐานสิบหกฉันแทนที่ \ r \ n ด้วย \ r และลบ newline สุดท้ายทั้งหมดซึ่งทำให้ฉันมี 67 ไบต์

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 

ฉันลองถอดพจนานุกรมสุดท้ายออก (>>) แต่ Acrobat คงไม่มีสิ่งนั้น การอ่านไฟล์ PDF ภายใน Google Chrome (FoxIt) จะไม่เปิดขึ้น

ในฐานะ PostScript (HA! ดูสิ่งที่ฉันทำที่นั่น?) ถ้าคุณยินยอมให้ Acrobat "ซ่อม" ไฟล์มันจะกระแทกได้สูงถึง 3550 ไบต์ส่วนใหญ่เป็นข้อมูลเมตาที่เป็นทางเลือก แต่มันอยู่เบื้องหลังการละเมิดข้อมูลจำเพาะจำนวนมาก


25
นอกจากนี้ยังปรากฎว่าเมื่อข้อกำหนดระบุว่า "จะเป็นการอ้างอิงทางอ้อม" และ / จำเป็นต้องมีและส่วนหัว "ต้อง" เป็น% PDF-1.0 พวกเขากำลังให้คำแนะนำที่หลวม ไม่คำแนะนำเหล่านั้นไม่หลวมนั่นเป็นข้อกำหนดสำหรับความถูกต้อง แม้ว่าผู้ดู PDF บางรายจะไม่บังคับใช้พวกเขา แต่ไม่ได้ติดตามพวกเขาก็หมายความว่าไม่มีความหมายและ OP ก็ขอ PDF ที่ถูกต้อง
mkl

23
ยอมรับแล้วเพราะคำตอบเริ่มต้นด้วยเครื่องหมายminimum allowed by the specจากนั้นไปเรื่อย ๆ คำตอบที่ดีขอบคุณ! :)
meshy

นั่นคือคำตอบที่ยอดเยี่ยม ทีนี้ลองดูไฟล์ PDF ที่ถูกต้องที่สุดพร้อมข้อความในบรรทัดเช่น "Hello World" ฉันคิดว่ามันจะง่ายพอ ๆ กับการเพิ่ม {stream BT ("Hello World") ET endstream} แต่จนถึงขณะนี้ไม่สามารถทำให้ Acrobat มีความสุขได้
neonzeon

1
นั่นคือสเป็ค กราฟของวัตถุใน PDF มีรอบ
ฐานราก

1
@towi เวอร์ชันที่เข้ารหัส base64 ของคุณมี\ns ฝังอยู่ในนั้นและเมื่อ base64-decoded ไม่ได้ให้เนื้อหาไฟล์ที่ถูกต้อง
Christopher Schultz

19

ฉันไม่สามารถเปิดตัวอย่าง Hello World ได้

สำหรับไฟล์ขนาดเล็กที่มีเนื้อหาข้อความ:

%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
สิ่งนี้จะไม่ทำงานคุณต้องกำหนดทรัพยากรแบบอักษรและเลือกภายในเนื้อหาของหน้าเพื่อให้ข้อความปรากฏขึ้น
yms

2
ไฟล์นี้เปิดได้จริงภายใต้ Mac OS X El Capitan ในขณะที่คำตอบที่ได้รับคะแนนสูงสุดด้วย PDF1.0 ไม่ได้
Devy

12
นอกจากนี้ยังเปิดภายใต้โครเมี่ยมข้อมูล: application / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 CiUlRU9G
ลุค Rehmann

8

ฉันคิดว่าฉันจะสร้างไฟล์ PDF ที่เล็กที่สุดที่แสดง "Hello World" ข้อความอยู่ที่มุมซ้ายล่าง ขออภัยเกี่ยวกับแบบอักษร 9 จุดขนาดใหญ่จะมีค่าใช้จ่ายไบต์พิเศษ :)

172 ไบต์สำหรับ Adobe Reader X (หากบันทึกไว้ด้วยการขึ้นบรรทัดใหม่เท่านั้นและไม่ขึ้นบรรทัดใหม่หรือ null-byte):

%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 ไบต์สำหรับโปรแกรมดู PDF ในตัวของ Chrome:

%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>

หากต้องการดูสิ่งนี้ใน Chrome ได้อย่างง่ายดายให้วาง URI นี้ในแถบที่อยู่ (ดังนั้นจะไม่ให้ฉันเชื่อมโยงกับมันและเบราว์เซอร์อื่นจะไม่ทำงานเลย):

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
ค่อนข้างเล็ก ;) ไม่ถูกต้องแม้ว่าตามสเป็ค
mkl

8
จะไม่เปิดใน Chrome สำหรับฉัน
ลุค Rehmann

0

ใน Java ให้ใช้สิ่งนี้:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

แล้ว

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

สหกรณ์ถามที่เป็นไปได้ในรูปแบบ PDF ไฟล์ที่ถูกต้องมีขนาดเล็กที่สุด ; ของคุณไม่ถูกต้องตามข้อกำหนด
mkl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.