3 คะแนน โดย GN⁺ 2024-02-01 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ข้อความที่แพร่กันบนอินเทอร์เน็ตว่า “ขนาดสูงสุดของ 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 ตัวอย่างประกอบด้วยอ็อบเจ็กต์หลัก 4 รายการ
    • อ็อบเจ็กต์ 1: stream object สำหรับวาดสี่เหลี่ยมสีแดง
    • อ็อบเจ็กต์ 2: อ็อบเจ็กต์ Page ที่นิยามหน้าเดี่ยว
    • อ็อบเจ็กต์ 3: อ็อบเจ็กต์ Pages ที่เก็บข้อมูลหลายหน้า
    • อ็อบเจ็กต์ 4: อ็อบเจ็กต์ Catalog ที่ให้โครงสร้างหลักของเอกสาร
  • อ็อบเจ็กต์ Page จะเชื่อมเนื้อหาหน้าเข้ากับการอ้างอิงอ็อบเจ็กต์อื่น
    • 1 0 R หมายถึงอ้างอิงอ็อบเจ็กต์หมายเลข 1 generation number 0
    • 3 0 R หมายถึงอ้างอิงอ็อบเจ็กต์ Pages ซึ่งเป็นชุดของหน้า
  • หากเขียน PDF ด้วยมือ ทุกครั้งที่ตำแหน่งอ็อบเจ็กต์เปลี่ยนก็ต้องแก้ค่าตาราง xref ใหม่ทั้งหมด จึงยุ่งยากมาก
  • ในอัปเดตวันที่ 16 เมษายน 2025 มีการแก้ค่าผิดของ xref 0 4 ในโค้ดตัวอย่าง
    • ในตารางอ้างอิงข้ามจริงมี 5 รายการ จึงต้องเป็น xref 0 5

ขยายหน้าด้วย /MediaBox และ /UserUnit

  • ขนาดหน้ากระดาษของ PDF ถูกกำหนดในอ็อบเจ็กต์ Page แต่ละตัว
  • /MediaBox [0 0 300 300] จะสร้างหน้าที่มีความกว้างและความสูงอย่างละ 300 หน่วย
    • หน่วยพื้นฐานคือ 1/72 นิ้ว
    • 300 หน่วยมีค่าเท่ากับประมาณ 4.17 นิ้ว
  • หากเปลี่ยน /MediaBox เป็น 600 600 Acrobat จะแสดงหน้ากระดาษเป็น 8.33 x 8.33 in
  • ค่า /MediaBox สูงสุด 14400 14400 ที่ Acrobat ยอมรับได้จะแสดงเป็น 200 × 200 นิ้ว
    • หากเกินค่านี้ Acrobat จะแสดงคำเตือน
  • เมื่อเพิ่ม /UserUnit ก็สามารถขยายหน่วย user space พื้นฐานได้
    • /UserUnit 2 จะทำให้มิติทั้งสองด้านของหน้าคูณสอง
    • เมื่อใช้ /MediaBox [0 0 14400 14400] ร่วมกับ /UserUnit 2 Acrobat จะแสดงเป็น 400.00 x 400.00 in
  • หากใช้ /UserUnit 75000 Acrobat จะแสดงหน้ากระดาษเป็น 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 ความคิดเห็น

 
GN⁺ 2024-02-01
ความคิดเห็นจาก Hacker News
  • PDF นั้นในเชิงเทคนิคแล้วน่าหวาดหวั่นในหลายด้าน แต่ความที่มันเป็น ไฟล์นิ่งแบบพึ่งพาตัวเองได้ครบ ที่เก็บไว้ในมือเราได้ ถือว่ายอดเยี่ยมเมื่อเทียบกับเว็บไซต์แบบไดนามิก/SaaS ที่เป็นปฏิปักษ์ต่อผู้ใช้และอาจหายไปเมื่อไรก็ได้
    PDF/A ใกล้เคียงกับ PDF ที่แท้จริงมากกว่า และตัดขยะอันตรายส่วนใหญ่ออกไปได้
    ถ้าคุณชอบลูกเล่น PDF แปลก ๆ ก็มีไฟล์ polyglot ที่เป็นทั้ง PDF/A, CSV และซาวด์แทร็ก Amiga soundtracker mod ไปพร้อมกัน: https://www.lab6.com/6

    • พอ Amazon เริ่มดึงหนังสือคืนจากบัญชี ความหมายของการ เก็บไว้ในมือเราเอง ก็ยิ่งสำคัญขึ้น
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF คือ ไฟล์ที่รันได้
      หลายคนกังวลเรื่องการรัน JavaScript แต่กลับใช้ไฟล์ PDF กันแบบไม่คิดอะไรมาก
    • จนกระทั่งไม่นานมานี้ PDF/A ก็ยังไม่มีวิธีง่าย ๆ ในการตรวจสอบว่าไฟล์นั้นเป็น PDF/A จริงหรือไม่ ตอนนี้มี veraPDF แล้ว แต่ก็เป็นซอฟต์แวร์ที่ค่อนข้างซับซ้อน
      ถ้าจะเปลี่ยน PDF ทั่วไปให้เป็น PDF/A ด้วยซอฟต์แวร์โอเพนซอร์ส ดูเหมือนว่ามีแค่วิธีแปลงเป็น PostScript ด้วย Ghostscript แล้วค่อยแปลงกลับ ซึ่ง Ghostscript ใช้ไลเซนส์ Affero เลยอาจมีปัญหาตามมาอีกหลายอย่าง
      มีเวอร์ชัน GPL เก่าอยู่เหมือนกันและใช้ได้กับ PDF ส่วนใหญ่ แต่ก็เป็นของที่อายุราว 15 ปีแล้ว
      ที่ทำงานเก่าของฉันต้องจัดการกับ PDF/A และมันไม่สนุกเลยแม้แต่น้อย
    • เพราะความทรมานจากโปรเจ็กต์ที่ต้องพาร์ส PDF หลายล้านไฟล์จากหลายแหล่ง ฉันเลยยากจะให้อภัยคำพูดที่ว่า “PDF เป็นฟอร์แมตที่ยอดเยี่ยม”
      แค่ประกอบย่อหน้าขึ้นมาใหม่ก็ใช้แรงมากแล้ว ยังไม่ต้องพูดถึงการพาร์สตาราง
      สำหรับสิ่งที่แทบเป็นมาตรฐานโดยพฤตินัย มันควรดีกว่านี้ และคู่มือ PDF ก็แย่มากจริง ๆ
    • ถ้ามองจากคนที่ทำงานสายกราฟิก PDF ที่แท้จริงคือ PDF/X
  • ถ้าจะเทียบกัน ลองดู PNG: ความกว้างและความสูงสูงสุดคือ 2147483647 หรือ 2^31 - 1
    เนื่องจากความหนาแน่นต่ำสุดที่กำหนดได้ด้วยชังก์ pHYs คือ 1 พิกเซลต่อเมตร ดังนั้น 2 พันล้านเมตรจึงใหญ่กว่าเส้นผ่านศูนย์กลางดวงอาทิตย์ที่ 1.39 กิกะเมตร: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    ชังก์ sCAL ใช้เลขทศนิยมแบบลอยตัว ASCII จึงแสดงขนาดทางกายภาพที่ใหญ่กว่านั้นได้อีกมาก

    • sCAL ใกล้เคียงกับการบอกขนาดของวัตถุที่ภาพแทนอยู่ มากกว่าขนาดของตัวภาพเอง
      แผนที่โลกมาตราส่วน 1:10,000,000 จะมีความกว้างไม่ถึง 10 เมตรตามเกณฑ์ pHYs แต่ตาม sCAL จะกว้างราว 40,000km
  • พอเริ่มวัดความกว้างของ PDF เป็นหน่วย กิโลเมตร คุณก็รู้แล้วว่ากำลังอ่านบทความเทคนิคที่ดีอยู่

    • การ์ด microSD สามารถเก็บระยะทางได้หลายล้านไมล์ในพื้นที่เล็กจิ๋ว
  • ทำให้นึกถึง PDF ที่ทำไว้เมื่อกว่าสิบปีก่อน ด้วยการอิมพลีเมนต์ Game of Life ใน PostScript
    ดูเหมือนจะยังใช้ได้อยู่ แต่ทำให้ macOS Preview แครช: https://andrewcutler.net/docs/joke/life.pdf

    • บน Sonoma นั้น Preview ไม่แครช
      เพียงแต่ไม่เห็นแอนิเมชัน เห็นแค่สถานะสุดท้าย ส่วนตัวดู PDF ของ Firefox แสดงแอนิเมชันได้เล็กน้อย
      Skim ก็คล้ายกับ Preview แต่ไม่แสดงเส้นตาราง
    • บน Mac OS Monterey ก็ไม่แครช และแสดงแค่ภาพเรนเดอร์ Game of Life แบบนิ่ง
  • บทความนี้ทำให้นึกถึงการละเล่นทางปัญญาของ 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...

  • Preview ต่างจาก Acrobat ตรงที่ไม่มีเพดานบนของค่าที่ใส่ใน MediaBox ได้ และมันยอมรับความกว้างระดับเลข 1 ตามด้วยศูนย์ 12 ตัวด้วย
    ใน document inspector จะแสดงขนาดหน้าเป็น 352777777777.78 x 10.59cm และความกว้างนี้ก็ประมาณระยะห่างระหว่างโลกกับดวงจันทร์
    เอาดาวเคราะห์ทุกดวงในระบบสุริยะมาเรียงกันก็ยังใส่ในเอกสารนี้ได้แบบเหลือ ๆ

    • คำนวณแล้วเอกสารนั้นมีพื้นที่ราว 373km² เล็กกว่าเยอรมนีมาก
      สรุปแล้วก็ต้องมีไม้บรรทัดอยู่ดี
    • มีเลข 7 เกินมา 1 ตัว
      352777777777.78cm คือ 3,527,777.7777778km
    • ถ้าไม่ใช่พื้นที่ว่างเปล่า แต่เติมด้วยเนื้อหาจริง ๆ ก็ชวนสงสัยว่าขนาด ไฟล์ ของ PDF แบบนั้นจะเป็นเท่าไร
  • เป็นการทดลองที่สนุกดีนะ alexwlchan
    แต่ในบทความมีพลาดเล็ก ๆ อยู่สองจุด: ตรงที่เขียนว่า “15,000,000,000.00 in” และ “ขนาดหน้าคือ 15 พันล้านนิ้ว” ที่จริงควรเป็น 15 ล้านนิ้ว
    คุณบอกว่าการจัดรูปแบบข้อความยาก แต่ตัวอย่าง PDF ที่มีแค่คำว่า “Hello World” สองคำ เพียงกำหนดออบเจ็กต์ฟอนต์ แล้วในสตรีมใช้ Tf เพื่อเลือกฟอนต์ ใช้ Td เพื่อกำหนดตำแหน่ง และใช้ Tj เพื่อเขียนข้อความก็พอ

    • ฉันก็คิดไว้อยู่แล้วว่าน่าจะพลาดตัวเลขตรงไหนสักแห่ง และจะรีบแก้เร็ว ๆ นี้
      ขอบคุณสำหรับตัวอย่างข้อความด้วย ดูคล้ายกับที่ฉันกำลังลองทำอยู่ แต่คงพลาดอะไรบางอย่างไปแน่ ๆ
    • สงสัยว่า xref ตอนท้าย PDF นี่จำเป็นไหม
      จากสเปกดูเหมือนว่าจะจำเป็น
    • ช่วยนับจำนวนเลข 0 ให้หน่อยได้ไหม ว่าทำไม “15,000,000,000.00 in” ถึงเป็น 15 ล้าน ไม่ใช่ 15 พันล้าน?
    • ถ้าบอกว่า “อย่าพิมพ์ออกมา” แล้วจะรู้ได้อย่างไรว่าพับได้มากกว่า 7 ครั้งหรือเปล่า?
  • ตรงนี้ทำให้อยากดัดแปลงคำพูดของ Steven Wright
    “ฉันมีแผนที่สหรัฐฯ อยู่แผ่นหนึ่ง ขนาดเท่าของจริง

    • ฉันมีแผนที่สหรัฐฯ อยู่ในมือถือ แต่เวลาใช้บอกทางมันชวนสับสนนิดหน่อย
      ไม่แน่ใจว่าด้านบนของแผนที่คือทิศที่ฉันกำลังเคลื่อนที่ หรือคือทิศเหนือกันแน่ และแผนที่สมัยก่อนก็มีทิศเหนืออยู่ด้านบนเสมอ แต่ Google Maps ดูเหมือนจะไม่เป็นแบบนั้น เลยยิ่งงง
      พอหมุน 90 องศา แผนที่ก็หมุนตาม เลยสับสนว่าอะไรที่หมุนกันแน่ ระหว่างแผนที่หรือฉัน
      ตอนหยุดนิ่ง แผนที่ก็คงไม่รู้ว่าฉันกำลังมุ่งไปทางไหน ดังนั้นถ้าอยากรู้ทิศทาง ดูเหมือนว่าต้องเริ่มเคลื่อนที่ก่อน
      ถ้ายกสมาร์ตโฟนไว้ตรงหน้า ด้านบนของแผนที่จะหันขึ้นไปทางท้องฟ้า ก็เลยไม่แน่ใจว่าควรต้องมองแผนที่จากด้านบนลงมาหรือเปล่า
      อยากรู้เคล็ดลับในการใช้ Google Maps บนมือถือให้เก่ง
    • 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...
    • ในบรรดามุกที่เกี่ยวข้องกัน ฉันชอบอันที่ว่า “ฉันอยากสักรูปตัวเองทั้งร่างลงบนร่างกายของตัวเอง แต่ให้ใหญ่ขึ้นอีก 2 นิ้ว” เสมอ
      https://scomedy.com/quotes/10779
  • คำว่า “อย่าพิมพ์” ฟังดูเหมือนเป็นคำพูดที่พร้อมจะกลายเป็นระเบิดงานพิมพ์
    ครั้งสุดท้ายที่ฉันใช้เครื่องพิมพ์ การยกเลิกงานพิมพ์บน Windows แทบเป็นไปไม่ได้เลย
    ยุคที่เครื่องพิมพ์ Wi-Fi เปิดโล่งหรือมีความปลอดภัยหละหลวมช่างเป็นช่วงเวลาที่สนุกดี

    • บน Windows การยกเลิกงานพิมพ์ก็ยังคงเป็นไปไม่ได้อยู่ดี
      วิธีเดียวที่ฉันเจอว่าเชื่อถือได้จริงคือปิดเครื่องพิมพ์ แล้วลบงานพิมพ์ออกจากคิว
      ใช้ไม่ได้ถ้าเครื่องพิมพ์ไม่ได้อยู่ข้างตัว และฉันก็ไม่เข้าใจว่าทำไมมันต้องยากขนาดนี้
    • วิธีที่ชัวร์กว่านิดหน่อยคือถอดปลั๊กเครื่องพิมพ์ แล้วโยนคอมพิวเตอร์ออกไปนอกหน้าต่าง
    • ทันทีที่อ่านคำว่า “อย่าพิมพ์” ปฏิกิริยาแรกที่ผุดขึ้นมาในหัวคือ “คุณไม่ใช่แม่ฉันสักหน่อย”
  • ราว 30 ปีก่อน ตอนสัมภาษณ์ฝึกงานภาคฤดูร้อนของ Microsoft ผู้สัมภาษณ์ก็ถามคำถามที่คล้ายกับนี้มาก โดยยก Excel ขึ้นมาเป็นตัวอย่าง
    หัวข้อแบบนี้เป็นวัสดุชั้นดีเสมอสำหรับดูทั้งความอยากรู้อยากเห็นของคน และความสามารถในการแยกแยะปัญหาที่อาจเกิดขึ้น