จากความอยากรู้อยากเห็นอย่างง่าย ๆ เมื่อเห็นGIFที่เล็กที่สุดไฟล์ PDF ที่ถูกต้องที่เล็กที่สุดที่เป็นไปได้คืออะไร
จากความอยากรู้อยากเห็นอย่างง่าย ๆ เมื่อเห็นGIFที่เล็กที่สุดไฟล์ PDF ที่ถูกต้องที่เล็กที่สุดที่เป็นไปได้คืออะไร
คำตอบ:
นี่คือปัญหาที่น่าสนใจ. คุณสามารถเริ่มต้นด้วยสิ่งนี้:
%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 ไบต์ส่วนใหญ่เป็นข้อมูลเมตาที่เป็นทางเลือก แต่มันอยู่เบื้องหลังการละเมิดข้อมูลจำเพาะจำนวนมาก
minimum allowed by the spec
จากนั้นไปเรื่อย ๆ คำตอบที่ดีขอบคุณ! :)
\n
s ฝังอยู่ในนั้นและเมื่อ base64-decoded ไม่ได้ให้เนื้อหาไฟล์ที่ถูกต้อง
ฉันไม่สามารถเปิดตัวอย่าง 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
ฉันคิดว่าฉันจะสร้างไฟล์ 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
ใน 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;
}