การสร้าง PDF ที่ใหญ่กว่าเยอรมนี
(alexwlchan.net)- ข้อความที่แพร่กันบนอินเทอร์เน็ตว่า “ขนาดสูงสุดของ PDF คือ 381 กม. × 381 กม.” ไม่ใช่ ข้อจำกัดของฟอร์แมต PDF เอง แต่เป็นค่าที่มาจากข้อจำกัดในการติดตั้งใช้งานของ Adobe Acrobat 7.0
- ตั้งแต่ PDF 1.6 เป็นต้นมา สามารถใช้
/UserUnitเพื่อขยายหน่วยพื้นฐาน 1/72 นิ้ว ได้ และค่าสูงสุด75,000ของ Acrobat 7.0 สร้างเพดานที่15,000,000 นิ้ว - PDF ที่เขียนด้วยมือต้องประกอบด้วย
%PDF-1.6, รายการอ็อบเจ็กต์,xref,trailer,startxref,%%EOFและขนาดหน้ากระดาษจะถูกกำหนดด้วยการใช้/MediaBoxและ/UserUnitร่วมกัน - Acrobat แม้จะกำหนด
/MediaBoxเกิน 14,400 หรือ/UserUnitเกิน 75,000 ก็ยังแสดงเป็น 15,000,000 นิ้ว และค่าที่เกินของ/UserUnitจะถูกเพิกเฉยโดยไม่มีคำเตือน - macOS Preview.app เพิกเฉยต่อ
/UserUnitแต่ไม่ได้กำหนดเพดานของ/MediaBoxแบบเดียวกับ Acrobat จึงสามารถสร้างไฟล์ที่ถูกแสดงผลเหมือนเป็น PDF ที่ใหญ่กว่าจักรวาล ได้
ข้อจำกัด 381 กม. มาจากไหน
- มีการพูดซ้ำบนอินเทอร์เน็ตมานานว่าเอกสาร PDF มีขนาดสูงสุด 381 กม. × 381 กม.
- ตัวเลขนี้ไม่ได้มาจากข้อจำกัดของฟอร์แมต PDF แต่เกิดจากข้อจำกัดในการติดตั้งใช้งานของ Adobe Acrobat
- ตาม สเปก PDF 1.7 ข้อจำกัดของขนาดหน้ามีดังนี้
- ก่อน PDF 1.6 หน่วย user space พื้นฐานจะถูกตรึงไว้ที่ 1/72 นิ้ว
- หลัง Acrobat 5.0 ขนาดหน้าพื้นฐานสูงสุดคือ
14,400 × 14,400หน่วย หรือ 200 × 200 นิ้ว - ตั้งแต่ PDF 1.6 สามารถกำหนดขนาดของหน่วย user space พื้นฐานได้ด้วย
/UserUnitใน page dictionary - Acrobat 7.0 รองรับค่า
/UserUnitสูงสุด75,000ทำให้สร้างหน้ากระดาษที่มีมิติสูงสุด 15,000,000 นิ้ว ได้
15,000,000 นิ้วเท่ากับประมาณ 381 กม. และคำว่า “PDF version 7” ดูเหมือนจะไม่ได้หมายถึงเวอร์ชันของ PDF แต่หมายถึง Adobe Acrobat 7.0
โครงสร้างพื้นฐานของ PDF ที่เขียนด้วยมือ
- ไฟล์ PDF จะมีเลขเวอร์ชันที่ต้นไฟล์และสัญลักษณ์ EOF ที่ท้ายไฟล์
- ตัวอย่าง:
%PDF-1.6 - สัญลักษณ์ปิดท้าย:
%%EOF
- ตัวอย่าง:
- หลังเลขเวอร์ชันจะเป็น รายการอ็อบเจ็กต์ ที่แสดงหน้า ข้อความ กราฟิก ฯลฯ
xrefคือ ตารางอ้างอิงข้าม ที่บอกตำแหน่งของอ็อบเจ็กต์- โปรแกรมอ่าน PDF จะตรวจสอบว่าแต่ละอ็อบเจ็กต์อยู่ห่างจากจุดเริ่มต้นไฟล์กี่ไบต์
trailerเก็บเมทาดาทาของเอกสารทั้งฉบับ- จำนวนหน้า
- มีการเข้ารหัสหรือไม่
- อ็อบเจ็กต์รากของเอกสาร
startxrefชี้ไปยังตำแหน่งเริ่มต้นของตารางxref- โปรแกรมอ่าน PDF จะหาค่า
startxrefจากท้ายไฟล์แล้วกระโดดไปที่ตารางxref
- โปรแกรมอ่าน PDF จะหาค่า
- หากอ้างอิง บทความสร้างไฟล์ PDF แบบง่าย ก็สามารถสร้าง PDF ที่มีสี่เหลี่ยมสีแดงด้วยมือได้
การนิยามอ็อบเจ็กต์และหน้า
- PDF ตัวอย่างประกอบด้วยอ็อบเจ็กต์หลัก 4 รายการ
- อ็อบเจ็กต์ 1: stream object สำหรับวาดสี่เหลี่ยมสีแดง
- อ็อบเจ็กต์ 2: อ็อบเจ็กต์
Pageที่นิยามหน้าเดี่ยว - อ็อบเจ็กต์ 3: อ็อบเจ็กต์
Pagesที่เก็บข้อมูลหลายหน้า - อ็อบเจ็กต์ 4: อ็อบเจ็กต์
Catalogที่ให้โครงสร้างหลักของเอกสาร
- อ็อบเจ็กต์
Pageจะเชื่อมเนื้อหาหน้าเข้ากับการอ้างอิงอ็อบเจ็กต์อื่น1 0 Rหมายถึงอ้างอิงอ็อบเจ็กต์หมายเลข 1 generation number 03 0 Rหมายถึงอ้างอิงอ็อบเจ็กต์Pagesซึ่งเป็นชุดของหน้า
- หากเขียน PDF ด้วยมือ ทุกครั้งที่ตำแหน่งอ็อบเจ็กต์เปลี่ยนก็ต้องแก้ค่าตาราง
xrefใหม่ทั้งหมด จึงยุ่งยากมาก - ในอัปเดตวันที่ 16 เมษายน 2025 มีการแก้ค่าผิดของ
xref 0 4ในโค้ดตัวอย่าง- ในตารางอ้างอิงข้ามจริงมี 5 รายการ จึงต้องเป็น
xref 0 5
- ในตารางอ้างอิงข้ามจริงมี 5 รายการ จึงต้องเป็น
ขยายหน้าด้วย /MediaBox และ /UserUnit
- ขนาดหน้ากระดาษของ PDF ถูกกำหนดในอ็อบเจ็กต์
Pageแต่ละตัว /MediaBox [0 0 300 300]จะสร้างหน้าที่มีความกว้างและความสูงอย่างละ 300 หน่วย- หน่วยพื้นฐานคือ 1/72 นิ้ว
- 300 หน่วยมีค่าเท่ากับประมาณ 4.17 นิ้ว
- หากเปลี่ยน
/MediaBoxเป็น600 600Acrobat จะแสดงหน้ากระดาษเป็น8.33 x 8.33 in - ค่า
/MediaBoxสูงสุด14400 14400ที่ Acrobat ยอมรับได้จะแสดงเป็น 200 × 200 นิ้ว- หากเกินค่านี้ Acrobat จะแสดงคำเตือน
- เมื่อเพิ่ม
/UserUnitก็สามารถขยายหน่วย user space พื้นฐานได้/UserUnit 2จะทำให้มิติทั้งสองด้านของหน้าคูณสอง- เมื่อใช้
/MediaBox [0 0 14400 14400]ร่วมกับ/UserUnit 2Acrobat จะแสดงเป็น400.00 x 400.00 in
- หากใช้
/UserUnit 75000Acrobat จะแสดงหน้ากระดาษเป็น 15,000,000.00 × 15,000,000.00 นิ้ว- ค่านี้เท่ากับประมาณ 381 กม. × 381 กม. และตรงกับคำกล่าวอ้างเดิม
- ไฟล์ตัวอย่าง: biggest.pdf
ความต่างในการจัดการของ Acrobat และ Preview
- Acrobat แม้จะตั้งค่า
/MediaBoxหรือ/UserUnitให้ใหญ่กว่านี้ ก็ยังแสดงขนาดหน้ากระดาษเป็น 15,000,000 นิ้ว อยู่ดี - หากตั้งค่า
/UserUnitมากกว่า75000ค่าจะถูกจำกัดโดยไม่มีคำเตือนหรือข้อผิดพลาด - ดูเหมือนว่า
/UserUnitจะไม่ค่อยมีการใช้งานจริงมากนัก- คำตอบบน Stack Overflow ก็ระบุว่าค่านี้ไม่ได้ถูกใช้อย่างแพร่หลาย
- หาอ้างอิงตัวอย่างบนอินเทอร์เน็ตได้ยาก
- macOS Preview.app ไม่รองรับ
/UserUnit- มันจะประมวลผล PDF ทุกไฟล์ด้วยหน่วยพื้นฐาน 1/72 นิ้ว
- แต่ Preview.app ต่างจาก Acrobat ตรงที่ไม่ได้กำหนดเพดานสูงของ
/MediaBox- มันยอมรับความกว้างที่เป็น
1ตามด้วยเลข 0 อีก 12 ตัวได้ - ความกว้างนี้อยู่ในระดับประมาณระยะห่างระหว่างโลกกับดวงจันทร์
- มันยอมรับความกว้างที่เป็น
- หากใส่ค่า
/MediaBoxที่ใหญ่กว่านี้ ก็สามารถสร้างไฟล์ที่ Preview แสดงผลว่าเป็น PDF ที่มีขนาดราว 37 ล้านล้านปีแสงกำลังสอง ได้- ไฟล์ตัวอย่าง: universe.pdf
- เอกสารส่วนใหญ่เป็นพื้นที่ว่าง และมีคำเตือนว่าไม่ควรสั่งพิมพ์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
PDF นั้นในเชิงเทคนิคแล้วน่าหวาดหวั่นในหลายด้าน แต่ความที่มันเป็น ไฟล์นิ่งแบบพึ่งพาตัวเองได้ครบ ที่เก็บไว้ในมือเราได้ ถือว่ายอดเยี่ยมเมื่อเทียบกับเว็บไซต์แบบไดนามิก/SaaS ที่เป็นปฏิปักษ์ต่อผู้ใช้และอาจหายไปเมื่อไรก็ได้
PDF/A ใกล้เคียงกับ PDF ที่แท้จริงมากกว่า และตัดขยะอันตรายส่วนใหญ่ออกไปได้
ถ้าคุณชอบลูกเล่น PDF แปลก ๆ ก็มีไฟล์ polyglot ที่เป็นทั้ง PDF/A, CSV และซาวด์แทร็ก Amiga soundtracker mod ไปพร้อมกัน: https://www.lab6.com/6
https://www.nytimes.com/2009/07/18/technology/companies/18am...
หลายคนกังวลเรื่องการรัน JavaScript แต่กลับใช้ไฟล์ PDF กันแบบไม่คิดอะไรมาก
ถ้าจะเปลี่ยน PDF ทั่วไปให้เป็น PDF/A ด้วยซอฟต์แวร์โอเพนซอร์ส ดูเหมือนว่ามีแค่วิธีแปลงเป็น PostScript ด้วย Ghostscript แล้วค่อยแปลงกลับ ซึ่ง Ghostscript ใช้ไลเซนส์ Affero เลยอาจมีปัญหาตามมาอีกหลายอย่าง
มีเวอร์ชัน GPL เก่าอยู่เหมือนกันและใช้ได้กับ PDF ส่วนใหญ่ แต่ก็เป็นของที่อายุราว 15 ปีแล้ว
ที่ทำงานเก่าของฉันต้องจัดการกับ PDF/A และมันไม่สนุกเลยแม้แต่น้อย
แค่ประกอบย่อหน้าขึ้นมาใหม่ก็ใช้แรงมากแล้ว ยังไม่ต้องพูดถึงการพาร์สตาราง
สำหรับสิ่งที่แทบเป็นมาตรฐานโดยพฤตินัย มันควรดีกว่านี้ และคู่มือ PDF ก็แย่มากจริง ๆ
ถ้าจะเทียบกัน ลองดู PNG: ความกว้างและความสูงสูงสุดคือ 2147483647 หรือ 2^31 - 1
เนื่องจากความหนาแน่นต่ำสุดที่กำหนดได้ด้วยชังก์ pHYs คือ 1 พิกเซลต่อเมตร ดังนั้น 2 พันล้านเมตรจึงใหญ่กว่าเส้นผ่านศูนย์กลางดวงอาทิตย์ที่ 1.39 กิกะเมตร: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
ชังก์ sCAL ใช้เลขทศนิยมแบบลอยตัว ASCII จึงแสดงขนาดทางกายภาพที่ใหญ่กว่านั้นได้อีกมาก
แผนที่โลกมาตราส่วน 1:10,000,000 จะมีความกว้างไม่ถึง 10 เมตรตามเกณฑ์ pHYs แต่ตาม sCAL จะกว้างราว 40,000km
พอเริ่มวัดความกว้างของ PDF เป็นหน่วย กิโลเมตร คุณก็รู้แล้วว่ากำลังอ่านบทความเทคนิคที่ดีอยู่
ทำให้นึกถึง PDF ที่ทำไว้เมื่อกว่าสิบปีก่อน ด้วยการอิมพลีเมนต์ Game of Life ใน PostScript
ดูเหมือนจะยังใช้ได้อยู่ แต่ทำให้ macOS Preview แครช: https://andrewcutler.net/docs/joke/life.pdf
เพียงแต่ไม่เห็นแอนิเมชัน เห็นแค่สถานะสุดท้าย ส่วนตัวดู PDF ของ Firefox แสดงแอนิเมชันได้เล็กน้อย
Skim ก็คล้ายกับ Preview แต่ไม่แสดงเส้นตาราง
บทความนี้ทำให้นึกถึงการละเล่นทางปัญญาของ Umberto Eco
โดยเฉพาะ “On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1”: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
https://en.wikipedia.org/wiki/On_Exactitude_in_Science
Preview ต่างจาก Acrobat ตรงที่ไม่มีเพดานบนของค่าที่ใส่ใน MediaBox ได้ และมันยอมรับความกว้างระดับเลข 1 ตามด้วยศูนย์ 12 ตัวด้วย
ใน document inspector จะแสดงขนาดหน้าเป็น 352777777777.78 x 10.59cm และความกว้างนี้ก็ประมาณระยะห่างระหว่างโลกกับดวงจันทร์
เอาดาวเคราะห์ทุกดวงในระบบสุริยะมาเรียงกันก็ยังใส่ในเอกสารนี้ได้แบบเหลือ ๆ
สรุปแล้วก็ต้องมีไม้บรรทัดอยู่ดี
352777777777.78cm คือ 3,527,777.7777778km
เป็นการทดลองที่สนุกดีนะ alexwlchan
แต่ในบทความมีพลาดเล็ก ๆ อยู่สองจุด: ตรงที่เขียนว่า “15,000,000,000.00 in” และ “ขนาดหน้าคือ 15 พันล้านนิ้ว” ที่จริงควรเป็น 15 ล้านนิ้ว
คุณบอกว่าการจัดรูปแบบข้อความยาก แต่ตัวอย่าง PDF ที่มีแค่คำว่า “Hello World” สองคำ เพียงกำหนดออบเจ็กต์ฟอนต์ แล้วในสตรีมใช้
Tfเพื่อเลือกฟอนต์ ใช้Tdเพื่อกำหนดตำแหน่ง และใช้Tjเพื่อเขียนข้อความก็พอขอบคุณสำหรับตัวอย่างข้อความด้วย ดูคล้ายกับที่ฉันกำลังลองทำอยู่ แต่คงพลาดอะไรบางอย่างไปแน่ ๆ
จากสเปกดูเหมือนว่าจะจำเป็น
ตรงนี้ทำให้อยากดัดแปลงคำพูดของ Steven Wright
“ฉันมีแผนที่สหรัฐฯ อยู่แผ่นหนึ่ง ขนาดเท่าของจริง”
ไม่แน่ใจว่าด้านบนของแผนที่คือทิศที่ฉันกำลังเคลื่อนที่ หรือคือทิศเหนือกันแน่ และแผนที่สมัยก่อนก็มีทิศเหนืออยู่ด้านบนเสมอ แต่ Google Maps ดูเหมือนจะไม่เป็นแบบนั้น เลยยิ่งงง
พอหมุน 90 องศา แผนที่ก็หมุนตาม เลยสับสนว่าอะไรที่หมุนกันแน่ ระหว่างแผนที่หรือฉัน
ตอนหยุดนิ่ง แผนที่ก็คงไม่รู้ว่าฉันกำลังมุ่งไปทางไหน ดังนั้นถ้าอยากรู้ทิศทาง ดูเหมือนว่าต้องเริ่มเคลื่อนที่ก่อน
ถ้ายกสมาร์ตโฟนไว้ตรงหน้า ด้านบนของแผนที่จะหันขึ้นไปทางท้องฟ้า ก็เลยไม่แน่ใจว่าควรต้องมองแผนที่จากด้านบนลงมาหรือเปล่า
อยากรู้เคล็ดลับในการใช้ Google Maps บนมือถือให้เก่ง
https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
https://scomedy.com/quotes/10779
คำว่า “อย่าพิมพ์” ฟังดูเหมือนเป็นคำพูดที่พร้อมจะกลายเป็นระเบิดงานพิมพ์
ครั้งสุดท้ายที่ฉันใช้เครื่องพิมพ์ การยกเลิกงานพิมพ์บน Windows แทบเป็นไปไม่ได้เลย
ยุคที่เครื่องพิมพ์ Wi-Fi เปิดโล่งหรือมีความปลอดภัยหละหลวมช่างเป็นช่วงเวลาที่สนุกดี
วิธีเดียวที่ฉันเจอว่าเชื่อถือได้จริงคือปิดเครื่องพิมพ์ แล้วลบงานพิมพ์ออกจากคิว
ใช้ไม่ได้ถ้าเครื่องพิมพ์ไม่ได้อยู่ข้างตัว และฉันก็ไม่เข้าใจว่าทำไมมันต้องยากขนาดนี้
ราว 30 ปีก่อน ตอนสัมภาษณ์ฝึกงานภาคฤดูร้อนของ Microsoft ผู้สัมภาษณ์ก็ถามคำถามที่คล้ายกับนี้มาก โดยยก Excel ขึ้นมาเป็นตัวอย่าง
หัวข้อแบบนี้เป็นวัสดุชั้นดีเสมอสำหรับดูทั้งความอยากรู้อยากเห็นของคน และความสามารถในการแยกแยะปัญหาที่อาจเกิดขึ้น