รูปแบบไฟล์ PDF อธิบาย: โครงสร้าง, เลเยอร์ และมาตรฐาน
มีอะไรอยู่ข้างใน PDF จริงๆ บ้าง? แผนภาพพร้อมคำอธิบายประกอบที่ครอบคลุมสี่ส่วนทางกายภาพ (ส่วนหัว, ส่วนเนื้อหา, xref, ส่วนท้าย), หกเลเยอร์เนื้อหา (ข้อความ, รูปภาพ, ฟอนต์, คำอธิบายประกอบ, เวกเตอร์, ลายเซ็น), ข้อมูลเมตา และมาตรฐาน ISO (PDF/A, PDF/X, PDF/UA, PDF/E, PDF/VT) ที่สร้างขึ้นบนพื้นฐาน
PDF ไม่ใช่สิ่งเดียว มันเป็นคอนเทนเนอร์ไบนารีที่มีโครงสร้างเฉพาะบนดิสก์, ชุดเลเยอร์เนื้อหาที่ซ้อนกันอยู่ภายในคอนเทนเนอร์นั้น และชุดมาตรฐาน ISO ที่สร้างขึ้นบนข้อกำหนดพื้นฐาน เปิดไฟล์ใน hex editor แล้วโครงสร้างจะมองเห็นได้ในรูปแบบข้อความธรรมดาในบรรทัดแรกๆ เปิดไฟล์ในโปรแกรมดู แล้วเลเยอร์ต่างๆ จะแสดงผลรวมกันเป็นหน้าเดียว
คู่มือนี้เป็นข้อมูลอ้างอิงพร้อมป้ายกำกับ: โครงสร้างไฟล์ทางกายภาพ, เลเยอร์เนื้อหาที่ส่วนเนื้อหาเก็บไว้, ข้อมูลเมตาที่ล้อมรอบทุกอย่าง และมาตรฐาน (PDF/A, PDF/X, PDF/UA, PDF/E, PDF/VT) ที่จำกัดขอบเขตสำหรับการใช้งานเฉพาะกรณี

ต้องการใช้แผนภาพนี้บนบล็อกของคุณหรือไม่? คัดลอกโค้ดสำหรับฝังนี้:
สี่ส่วนทางกายภาพ
PDF ทุกไฟล์บนดิสก์มีโครงสร้างสี่ส่วนเหมือนกัน เรียงตามลำดับนี้:
1. ส่วนหัว (Header)
บรรทัดแรกของไฟล์ เริ่มต้นด้วย %PDF- ตามด้วยหมายเลขเวอร์ชันเสมอ:
%PDF-1.7เวอร์ชันมีตั้งแต่ 1.0 (เปิดตัวปี 1993) ถึง 2.0 (เปิดตัวปี 2017, ปัจจุบัน) ส่วนหัวตามด้วยบรรทัดแสดงความคิดเห็นที่มีไบต์ไบนารี ซึ่งส่งสัญญาณไปยัง FTP และเครื่องมือขนส่งอื่นๆ ว่านี่คือไฟล์ไบนารี
2. ส่วนเนื้อหา (Body) - วัตถุทางอ้อม (Indirect Objects)
เนื้อหาส่วนใหญ่ของไฟล์ หน้า ฟอนต์ รูปภาพ คำอธิบายประกอบ และช่องกรอกข้อมูลทุกอย่างเป็นวัตถุทางอ้อมที่มีหมายเลข:
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 /Parent 2 0 R /Contents 4 0 R /Resources << ... >> >>
endobjวัตถุแต่ละชิ้นมี ID (ตัวเลขก่อน 0 obj), หมายเลขรุ่น (generation number) (0, ใช้สำหรับการอัปเดตแบบเพิ่มส่วน) และข้อมูลระหว่าง << และ >> สำหรับพจนานุกรม (dictionaries) หรือ stream และ endstream สำหรับสตรีมไบนารี (ข้อมูลรูปภาพ, ข้อมูลฟอนต์, เนื้อหาที่บีบอัด)
วัตถุอ้างอิงถึงกันด้วยไวยากรณ์ <id> <gen> R (เช่น 3 0 R หมายถึง "วัตถุ 3, รุ่น 0") นี่คือวิธีที่หน้าอ้างอิงถึงฟอนต์ที่ใช้ หรือวิธีที่แคตตาล็อกอ้างอิงถึงรากของโครงสร้างหน้า
3. ตารางอ้างอิงโยง (Cross-Reference Table - xref)
ตารางค้นหาตำแหน่งไบต์ สำหรับวัตถุทุกชิ้นในส่วนเนื้อหา xref จะบันทึกตำแหน่งไบต์สัมบูรณ์ในไฟล์:
xref
0 6
0000000000 65535 f
0000000017 00000 n
0000000089 00000 n
0000000172 00000 n
0000000299 00000 n
0000000453 00000 nนี่คือสิ่งที่ทำให้ PDF สามารถเข้าถึงแบบสุ่มได้ โปรแกรมดูสามารถอ่าน xref, กระโดดไปยังตำแหน่งไบต์ของวัตถุ 3 ได้โดยตรง และแสดงผลหน้านั้นโดยไม่ต้องแยกวิเคราะห์ส่วนที่เหลือของไฟล์ นี่คือเหตุผลที่ PDF ของบทเดียวเปิดได้ทันที แม้ว่าไฟล์ต้นฉบับจะมี 500 หน้า
4. ส่วนท้าย (Trailer)
ส่วนสุดท้าย บอกโปรแกรมแยกวิเคราะห์ว่าจะหา xref ได้ที่ไหน และวัตถุใดคือราก:
trailer
<< /Size 6 /Root 1 0 R /Info 7 0 R >>
startxref
1893
%%EOFค่า startxref คือตำแหน่งไบต์ของตาราง xref เครื่องหมาย %%EOF คือจุดสิ้นสุดของไฟล์จริงๆ ส่วนท้ายคือสิ่งที่ทำให้การอัปเดตแบบเพิ่มส่วนเป็นไปได้: การเพิ่ม xref + trailer ใหม่ที่ส่วนท้ายช่วยให้คุณเพิ่มวัตถุได้โดยไม่ต้องเขียนไฟล์ทั้งหมดใหม่
หกเลเยอร์เนื้อหา
ภายในส่วนเนื้อหา เนื้อหาจะถูกจัดเก็บไว้ในหกประเภทเลเยอร์ หน้า PDF ที่แสดงผลทุกหน้าเป็นการรวมกันของเลเยอร์เหล่านี้:
1. ข้อความ (Text)
คำสั่งตำแหน่งสัญลักษณ์ (glyph) และการอ้างอิงฟอนต์ ไม่ใช่สตริงข้อความ PDF จะเก็บคำสั่งเช่น "วาดสัญลักษณ์ 42 จากฟอนต์ F3 ที่ตำแหน่ง (120, 540)" แทนที่จะเป็น "วาดตัวอักษร A ที่นี่" นี่คือเหตุผลที่ข้อความสามารถเลือกและค้นหาได้: โปรแกรมดูจะแมป ID สัญลักษณ์ย้อนกลับไปยังจุดรหัส Unicode ผ่านการแมป ToUnicode (หรือ CMap สำหรับฟอนต์ CJK)
เมื่อข้อความขาดการแมป ToUnicode คุณจะประสบปัญหาคลาสสิก "PDF ที่เลือกข้อความได้ แต่คัดลอกออกมาเป็นขยะ" ข้อความยังคงมองเห็นได้ แต่การแมปสัญลักษณ์กับ Unicode เสียหายหรือไม่สมบูรณ์
2. รูปภาพ (Images)
จัดเก็บเป็นสตรีมที่ฝังไว้ในรูปแบบต่างๆ:
- JPEG (ตัวกรอง DCTDecode): ภาพถ่าย, พบได้บ่อยที่สุด
- JPEG2000 (JPXDecode): การบีบอัดสูงกว่า, พบน้อยกว่า
- เทียบเท่า PNG (ตัวกรอง FlateDecode + Predictor): ภาพหน้าจอ, ภาพลายเส้น
- CCITT Group 4 (CCITTFaxDecode): ข้อความสแกนขาวดำ, ใช้ในการสแกนเพื่อเก็บถาวร
- JBIG2 (JBIG2Decode): ภาพแบบไบนารี, พบได้บ่อยในเอกสารที่ OCR แล้ว
รูปภาพสามารถลดขนาด, บีบอัดใหม่, หรือแทนที่ได้โดยไม่กระทบเนื้อหาอื่น
3. ฟอนต์ (Fonts)
ฝังเป็นโปรแกรมฟอนต์เต็ม, ส่วนย่อย (subset - รวมเฉพาะสัญลักษณ์ที่ใช้), หรืออ้างอิงด้วยชื่อ (ต้องติดตั้งบนระบบของผู้ดู) การทำ subset เป็นค่าเริ่มต้น - ช่วยลดขนาดไฟล์ได้อย่างมาก รูปแบบฟอนต์ที่รองรับ: Type1, TrueType, OpenType, และ CIDFont (สำหรับ CJK)
เมื่อมีการอ้างอิงฟอนต์แต่ไม่ได้ฝังและไม่ได้ติดตั้งบนระบบของผู้ดู โปรแกรมดูจะแทนที่ด้วยฟอนต์ที่คล้ายกัน - ซึ่งมักจะดูไม่ถูกต้อง PDF/A กำหนดให้ต้องฝังฟอนต์ทั้งหมดเพื่อป้องกันปัญหานี้
4. คำอธิบายประกอบ (Annotations)
ไฮไลท์, ความคิดเห็น, ลิงก์, ตราประทับ, ลายน้ำ, และช่องกรอกข้อมูล ทั้งหมดนี้คือคำอธิบายประกอบ พวกมันจะถูกวางซ้อนทับเนื้อหาของหน้า และสามารถเพิ่ม, แก้ไข, หรือลบได้โดยไม่เปลี่ยนแปลงหน้าเดิม
ช่องกรอกข้อมูลเป็นกรณีพิเศษ: คำอธิบายประกอบแบบวิดเจ็ตแบบโต้ตอบ (ส่วนที่มองเห็นได้) บวกกับพจนานุกรมฟิลด์ (ส่วนข้อมูล) เมื่อคุณกรอกแบบฟอร์มและบันทึก มีเพียงพจนานุกรมฟิลด์เท่านั้นที่เปลี่ยนแปลง - ตัวหน้าเองไม่ถูกแตะต้อง
5. กราฟิกเวกเตอร์ (Vector Graphics)
เส้น, รูปร่าง, เส้นโค้ง, และเส้นทางที่วาดด้วยตัวดำเนินการคล้าย PostScript (moveto, lineto, curveto) สามารถปรับขนาดได้ไม่จำกัดโดยไม่สูญเสียคุณภาพ กราฟ CAD ส่วนใหญ่, แผนภูมิ, และแผนภาพใน PDF คือกราฟิกเวกเตอร์
6. ลายเซ็นดิจิทัล (Digital Signatures)
ลายเซ็นที่ได้รับการสนับสนุนจาก PKI ซึ่งผูกติดกับช่วงไบต์ของไฟล์ พจนานุกรมลายเซ็นระบุว่า "ไบต์ 0 ถึง 12,547 และ 14,200 ถึงสิ้นสุดไฟล์ได้รับการลงนาม" - ช่วงเล็กๆ ตรงกลางสงวนไว้สำหรับค่าลายเซ็นเอง การเปลี่ยนแปลงใดๆ ในช่วงไบต์ที่ลงนามจะทำให้ลายเซ็นไม่ถูกต้อง ซึ่งเป็นวิธีที่ PDF ตรวจจับการปลอมแปลงหลังจากการลงนาม
PDF บางไฟล์มีลายเซ็นหลายรายการ ซึ่งซ้อนทับกันเป็นการอัปเดตแบบเพิ่มส่วน - ผู้ลงนามแต่ละรายจะลงนามในไฟล์ตามที่ปรากฏเมื่อได้รับ โดยรักษาห่วงโซ่ไว้
ข้อมูลเมตา: สองระบบคู่ขนาน
PDF มีระบบข้อมูลเมตา 2 ระบบที่มักจะขัดแย้งกัน:
พจนานุกรม /Info มาตรฐาน
จัดเก็บไว้ในส่วนท้าย ฟิลด์: Title, Author, Subject, Keywords, Creator (แอปที่ผู้ใช้สร้างเอกสาร), Producer (แอปที่สร้าง PDF), CreationDate, ModDate สตริงข้อความธรรมดา อ่านได้ง่ายด้วยเครื่องมือ PDF ใดๆ
สตรีมข้อมูลเมตา XMP
สตรีม XML แยกต่างหาก (Adobe XMP, อิงตาม RDF/XML) ที่รองรับสคีมาที่ซับซ้อนกว่า: Dublin Core, IPTC, สคีมาเฉพาะทางที่กำหนดเอง (โปรไฟล์สี, การจดทะเบียนลิขสิทธิ์, การจัดการเวอร์ชันต้นฉบับ)
โปรแกรมสร้าง PDF สมัยใหม่จะเขียนทั้งสองระบบ PDF เก่ามีเพียง /Info เท่านั้น PDF บางไฟล์มี /Info ที่ล้าสมัยจากเวอร์ชันก่อนหน้าและ XMP ที่ถูกต้องจากการแก้ไขล่าสุด - หรือกลับกัน เมื่อตรวจสอบ PDF เพื่อการปฏิบัติตามข้อกำหนดหรือการตรวจสอบทางนิติวิทยาศาสตร์ ให้ตรวจสอบทั้งสองระบบ
มาตรฐาน ISO ที่สร้างบน PDF
ข้อกำหนดพื้นฐานของ PDF คือ ISO 32000 มาตรฐานที่ได้มาหลายฉบับจำกัดขอบเขตของ PDF สำหรับกรณีการใช้งานเฉพาะ:
| มาตรฐาน | การใช้งาน | ข้อจำกัด |
|---|---|---|
| PDF/A | การเก็บถาวรระยะยาว | ฟอนต์ทั้งหมดฝังอยู่, ไม่มี JavaScript, ไม่มีเสียง/วิดีโอ, พื้นที่สีไม่ขึ้นกับอุปกรณ์ ระดับการปฏิบัติตามข้อกำหนด: PDF/A-1, A-2, A-3 (อนุญาตให้แนบไฟล์) |
| PDF/X | การผลิตสิ่งพิมพ์ | สี CMYK, ฟอนต์และโปรไฟล์สีที่ฝังอยู่, ไม่มี transparency (PDF/X-1a) หรือมี transparency ที่ควบคุมได้ (PDF/X-4) |
| PDF/UA | การเข้าถึง (Accessibility) | โครงสร้างแบบแท็ก (tagged structure tree), ข้อมูลเมตาภาษา, ข้อความสลับสำหรับรูปภาพ, ลำดับการอ่านเชิงตรรกะ |
| PDF/E | วิศวกรรม | โมเดล 3 มิติ (รูปแบบ U3D, PRC), ข้อมูลเมตาเฉพาะ CAD |
| PDF/VT | การพิมพ์ตามความต้องการแบบแปรผัน (Variable transactional printing) | ปรับให้เหมาะสมสำหรับการส่งจดหมายส่วนบุคคลปริมาณมาก |
PDF สามารถเป็นไปตามมาตรฐานหลายฉบับพร้อมกันได้ - PDF/A-2u (การเก็บถาวรพร้อมการแมป Unicode) บวกกับ PDF/UA (การเข้าถึง) เป็นเรื่องปกติสำหรับคลังเอกสารของรัฐบาลและกฎหมาย
PDF แบบ Linearized (ปรับให้เหมาะกับเว็บ)
PDF ที่ "linearized" หรือ "ปรับให้เหมาะกับเว็บ" จะจัดลำดับวัตถุในส่วนเนื้อหาใหม่ เพื่อให้วัตถุของหน้าแรกปรากฏในช่วงต้นของไฟล์ โปรแกรมดูเว็บสามารถแสดงผลหน้า 1 ได้หลังจากดาวน์โหลดเพียงประมาณ 50 KB แรก แทนที่จะต้องรอทั้งไฟล์ ส่วนท้ายจะถูกทำซ้ำที่ส่วนหน้า พร้อมกับตารางบอกใบ้ (hint table) ที่บอกโปรแกรมดูว่าแต่ละหน้าเริ่มต้นที่ใด
โปรแกรมสร้าง PDF สมัยใหม่ส่วนใหญ่รองรับ linearization เป็นตัวเลือก "บันทึกสำหรับเว็บ" รูปแบบนี้จะเพิ่มขนาดไฟล์ 2-5% แลกกับการแสดงผลหน้าแรกอย่างรวดเร็วผ่านการเชื่อมต่อที่ช้า
การเข้ารหัสและสิทธิ์การใช้งาน
PDF สามารถเข้ารหัสด้วยรหัสผ่าน (หรือใบรับรอง) และให้สิทธิ์การใช้งานแบบละเอียด: พิมพ์, คัดลอกข้อความ, แก้ไข, กรอกแบบฟอร์ม, ดึงข้อมูลเพื่อการเข้าถึง การเข้ารหัสจะถูกจัดเก็บไว้ในพจนานุกรม /Encrypt ของส่วนท้าย
ความแข็งแกร่งของการเข้ารหัสมีการพัฒนา: RC4 40 บิต (PDF ยุคแรก, แคร็กได้ง่ายในปัจจุบัน), RC4 128 บิต (ยังคงอ่อนแอ), AES-128, AES-256 การใช้งาน RC4 ดั้งเดิมของ Acrobat 5 ถูกแคร็กต่อสาธารณะในปี 2001 การเข้ารหัส PDF สมัยใหม่ (AES-256, PDF 2.0) นั้นแข็งแกร่งเมื่อใช้กับรหัสผ่านที่รัดกุม
หมายเหตุ: "สิทธิ์การใช้งาน" เป็นเพียงคำแนะนำ โปรแกรมดูที่เคารพสิทธิ์เหล่านั้นจะบังคับใช้ สิทธิ์การใช้งาน โปรแกรมดูที่ไม่สนใจ (หรือเครื่องมือที่ลบการเข้ารหัสออก) จะไม่บังคับใช้
PDFSub อ่าน PDF อย่างไร
PDFSub ประมวลผล PDF โดยใช้การเชื่อมต่อ PDFium ของ Rust (เอนจิ้นเดียวกับที่ขับเคลื่อนโปรแกรมดู PDF ของ Chromium) บวกกับ PaddleOCR สำหรับเอกสารที่สแกน สำหรับรายละเอียดสถาปัตยกรรมฉบับเต็มและการเปรียบเทียบกับเครื่องมือบนคลาวด์ โปรดดู ความปลอดภัยของเบราว์เซอร์เทียบกับคลาวด์สำหรับ PDF.
สำหรับการแปลง PDF เป็นรูปแบบอื่นพร้อมทั้งรักษาโครงสร้างที่อธิบายไว้ข้างต้น:
- PDF เป็น Excel - ดึงข้อความ + ตาราง, รักษาพิกัด
- OCR PDF - เพิ่มเลเยอร์ข้อความที่ค้นหาได้ให้กับ PDF ที่สแกน
- PDF เป็น Word - จัดรูปแบบข้อความใหม่ให้เป็นย่อหน้าที่แก้ไขได้
- บีบอัด PDF - ลดขนาดรูปภาพ, ทำ subset ฟอนต์
สำหรับเวิร์กโฟลว์การเก็บถาวรโดยเฉพาะ โปรดดู วิธีแปลง PDF เป็น PDF/A.
อ่านเพิ่มเติม
- ISO 32000-2 (ข้อกำหนด PDF 2.0) - เอกสารอ้างอิงที่เชื่อถือได้, ต้องเสียค่าใช้จ่าย
- คลังเอกสารอ้างอิง Adobe PDF - เอกสารอ้างอิงฟรีสำหรับ PDF 1.7
- PDF Association - กลุ่มอุตสาหกรรม, บทความฟรีและไฟล์ทดสอบการปฏิบัติตามข้อกำหนด
สำหรับหัวข้อเฉพาะเกี่ยวกับ PDF: คู่มือการปฏิบัติตามข้อกำหนด PDF สำหรับทนายความ, คู่มือการแปลง PDF/A.