PDF ไม่ใช่รูปแบบเอกสารในแบบที่ Word หรือ RTF เป็น รูปแบบเหล่านั้นจัดเก็บลำดับของเนื้อหาที่โปรแกรมแสดงผล (renderer) จะตีความในขณะที่แสดงผล ดังนั้นผลลัพธ์จึงขึ้นอยู่กับฟอนต์และเอนจินเค้าโครง (layout engine) ใดๆ ที่มีอยู่ PDF จัดเก็บผลลัพธ์ของกระบวนการนั้น: คำสั่งการแสดงผลที่แม่นยำ โปรแกรมฟอนต์ สตรีมภาพที่ถูกบีบอัด และกราฟวัตถุที่เชื่อมโยงสิ่งเหล่านี้เข้าด้วยกันเป็นคำอธิบายที่สมบูรณ์ในตัวเองของแต่ละหน้า ไฟล์นี้มีข้อมูลเพียงพอที่จะทำซ้ำแต่ละหน้าให้เหมือนกันทุกประการบนโปรแกรมแสดงผลที่สอดคล้องตามมาตรฐาน ซึ่งนี่เป็นทั้งเป้าหมายการออกแบบหลักและแหล่งที่มาของความซับซ้อนส่วนใหญ่ที่คุณพบเมื่อพยายามสร้าง แปลง หรือแก้ไขมันด้วยการเขียนโปรแกรม
โมเดลวัตถุ (The object model)
ทุก PDF คือกลุ่มของวัตถุที่มีหมายเลขกำกับ วัตถุสามารถเป็นค่าบูลีน จำนวนเต็ม จำนวนจริง ชื่อ สตริง อาร์เรย์ พจนานุกรม สตรีม หรือค่าว่าง (null) สิ่งที่น่าสนใจเกือบทั้งหมดคือพจนานุกรม ซึ่งเป็นชุดของคู่คีย์-ค่าที่คีย์คือชื่อและค่าคือวัตถุประเภทอื่นใดๆ รวมถึงการอ้างอิงถึงวัตถุอื่นโดยใช้หมายเลขและ generation count สตรีมคือพจนานุกรมที่ตามด้วยลำดับไบต์ ซึ่งโดยทั่วไปจะถูกบีบอัด
พจนานุกรมแคตตาล็อก (catalog dictionary) คือรูท (root) มันชี้ไปที่แผนผังหน้า (page tree) ซึ่งจัดระเบียบพจนานุกรมหน้าในโครงสร้างต้นไม้ที่สมดุลแทนที่จะเป็นรายการแบนๆ ดังนั้นการนำทางไปยังหน้าที่ 5,000 ของเอกสาร 10,000 หน้าจึงไม่จำเป็นต้องสำรวจตัวระบุหน้าก่อนหน้าทั้งหมด พจนานุกรมของแต่ละหน้าอ้างอิงถึงสตรีมเนื้อหา (หนึ่งหรือหลายลำดับของตัวดำเนินการคำอธิบายหน้า) พจนานุกรมทรัพยากรของมัน (ซึ่งจะอ้างอิงถึงตัวอธิบายฟอนต์ พื้นที่สี และรูปภาพ XObjects) และสื่อบอกซ์ (พื้นที่พิกัดที่หน้าอาศัยอยู่) จุดกำเนิดพิกัดอยู่ที่มุมล่างซ้าย โดยค่า Y บวกวิ่งขึ้นด้านบน ในหน่วย 1/72 นิ้ว
ที่ส่วนท้ายของไฟล์คือตารางอ้างอิงข้าม (cross-reference table) ซึ่งแมปหมายเลขวัตถุแต่ละอันเข้ากับออฟเซ็ตไบต์ในไฟล์ สิ่งนี้ทำให้เกิดการเข้าถึงแบบสุ่ม (random access): โปรแกรมดูเอกสารจะอ่านตารางอ้างอิงข้ามก่อน จากนั้นจึงค้นหาไปยังวัตถุใดก็ตามที่ต้องการโดยตรง PDF 1.5 เปิดตัวสตรีมอ้างอิงข้าม ซึ่งบีบอัดตารางให้เป็นวัตถุสตรีมและแพ็ควัตถุที่เกี่ยวข้องกันไว้ในออบเจ็กต์สตรีม ซึ่งช่วยลดขนาดไฟล์ได้อย่างเห็นได้ชัดสำหรับเอกสารที่มีวัตถุขนาดเล็กจำนวนมาก
สตรีมเนื้อหาและโมเดลกราฟิก (Content streams and the graphics model)
เนื้อหาภาพของหน้าอาศัยอยู่ในสตรีมเนื้อหาหนึ่งสตรีมหรือมากกว่า แต่ละสตรีมคือลำดับของตัวดำเนินการ PDF ที่แทรกด้วยตัวถูกดำเนินการ ตัวดำเนินการข้อความ BT เริ่มต้นวัตถุข้อความ Tf เลือกฟอนต์และขนาดจากพจนานุกรมทรัพยากร Td วางตำแหน่งเคอร์เซอร์ข้อความ Tj หรือ TJ ระบายสตริง และ ET ปิดวัตถุข้อความ กราฟิกเวกเตอร์ใช้รูปแบบที่คล้ายกัน: m กำหนดจุดเริ่มต้นของเส้นทาง l ต่อท้ายส่วนของเส้นตรง c ต่อท้ายเส้นโค้ง Bezier และ f หรือ S เติม (fill) หรือวาดเส้นขอบ (stroke) ของเส้นทาง
สถานะกราฟิกควบคุมทุกสิ่งที่เกิดขึ้นระหว่างตัวดำเนินการ: เมทริกซ์การแปลงสภาพปัจจุบัน ความกว้างของเส้น พื้นที่สี สีเติม สีเส้นขอบ และเส้นทางคลิป ตัวดำเนินการเช่น q และ Q ผลัก (push) และดึง (pop) สถานะกราฟิกลงบนสแต็ก ซึ่งนี่คือวิธีที่ PDF ใช้การแปลงสภาพพิกัดท้องถิ่นและการแทนที่สถานะชั่วคราวโดยไม่ส่งผลกระทบต่อบริบทที่อยู่รอบๆ Form XObjects สร้างภาพรวมนี้: สตรีมเนื้อหาที่สมบูรณ์ในตัวเองพร้อมพจนานุกรมทรัพยากรของตนเองที่สามารถระบายลงบนหน้าในตำแหน่งและมาตราส่วนที่กำหนดเองด้วยตัวดำเนินการ Do เพียงตัวเดียว
การฝังฟอนต์และการแยกข้อความ (Font embedding and text extraction)
PDF สามารถอ้างอิงฟอนต์ด้วยชื่อและพึ่งพาโปรแกรมดูเอกสารในการทดแทนบางสิ่ง แต่ในทางปฏิบัติ เอกสารใดๆ ที่คุณตั้งใจจะแชร์จะต้องฝังข้อมูลฟอนต์ ฟอนต์ Type 1 หรือ TrueType/OpenType ที่ฝังอยู่ใน PDF จะมีพจนานุกรมตัวอธิบายฟอนต์ที่ชี้ไปยังสตรีมไฟล์ฟอนต์ สำหรับฟอนต์ TrueType สตรีมนั้นมีโปรแกรมฟอนต์ไบนารี; สำหรับ Type 1 จะเป็นข้อมูล PFB การทำเซ็ตย่อย (Subsetting) ซึ่งเป็นสิ่งที่เครื่องมือสร้าง PDF ที่จริงจังทุกตัวทำ จะลบกลิฟ (glyphs) ที่ไม่ได้อ้างอิงโดยเอกสารออกไป ทำให้ขนาดไฟล์สามารถจัดการได้แม้จะเป็นฟอนต์ Unicode ขนาดใหญ่ก็ตาม
การแยกข้อความคือจุดที่การฝังฟอนต์ส่งผลสะท้อนกลับ การแสดงภาพของอักขระถูกกำหนดโดยกลิฟในโปรแกรมฟอนต์ที่ฝังไว้ ค่า Unicode ของอักขระนั้นถูกกำหนดโดยสตรีม ToUnicode CMap ที่แนบมากับพจนานุกรมฟอนต์ เมื่อ ToUnicode CMap ขาดหายไปหรือไม่ถูกต้อง โปรแกรมดู PDF สามารถแสดงข้อความให้อ่านออกได้แต่ไม่สามารถแยกข้อความออกมาเป็น Unicode ที่มีความหมายได้ ซึ่งเป็นเหตุผลว่าทำไมการคัดลอก-วางจาก PDF บางไฟล์จึงให้ผลเป็นขยะ (garbage) Tagged PDF (ISO 32000 §14.8) เพิ่มเลเยอร์ที่สอง: แผนผังโครงสร้างตรรกะที่แมปเนื้อหาของหน้ากับบทบาทเชิงความหมายของเอกสาร เช่น ย่อหน้า หัวเรื่อง และเซลล์ตาราง โปรแกรมอ่านหน้าจอและเอนจินจัดรูปแบบใหม่ใช้แผนผังโครงสร้างแทนการเรียงลำดับสตรีมเนื้อหาดิบ ซึ่งอธิบายว่าทำไม PDF ที่จัดวางภาพมาอย่างดีจึงอาจยังเข้าถึงไม่ได้หากการแท็กไม่มีอยู่หรือผิดพลาด
การอัปเดตแบบเพิ่มส่วนและลายเซ็นดิจิทัล (Incremental updates and digital signatures)
เมื่อคุณบันทึกการเปลี่ยนแปลงไปยัง PDF ที่มีอยู่โดยไม่ต้องเขียนใหม่ตั้งแต่ต้น วัตถุใหม่จะถูกต่อท้ายส่วนของเนื้อหาไฟล์ดั้งเดิมพร้อมกับส่วนการอ้างอิงข้ามใหม่และพจนานุกรมตัวอย่างส่วนท้าย (trailer dictionary) ใหม่ ตัวอย่างส่วนท้ายที่อัปเดตจะชี้ไปที่ข้อมูลอ้างอิงข้ามใหม่ และวัตถุที่ถูกแทนที่จะยังคงอยู่ในไฟล์แต่ไม่ได้ถูกอ้างอิงโดยเชนอ้างอิงข้ามใหม่ นี่คือการอัปเดตแบบเพิ่มส่วน และมันมีผลที่ตามมาที่สำคัญสองประการ
ประการแรก ไฟล์จะโตขึ้นในทุกๆ รอบการบันทึก เอกสารที่แก้ไขและบันทึกซ้ำๆ จะสะสมชั้นของวัตถุที่ล้าสมัย เครื่องมือเช่น QPDF สามารถทำให้ไฟล์เป็นเชิงเส้นหรือบีบอัดแล้วเขียนไฟล์ใหม่เพื่อเรียกคืนพื้นที่นั้น แต่ค่าเริ่มต้นคือการสะสม ประการที่สอง ลายเซ็นดิจิทัลอาศัยการอัปเดตแบบเพิ่มส่วนสำหรับโมเดลความสมบูรณ์ ลายเซ็น ISO 32000 ครอบคลุมช่วงไบต์ของไฟล์ โดยทั่วไปจะครอบคลุมทั้งหมด ยกเว้นตัวแทน (placeholder) สำหรับค่าลายเซ็นเอง การเปลี่ยนแปลงหลังการเซ็นใดๆ ที่ปรากฏเป็นการอัปเดตแบบเพิ่มส่วนเพิ่มเติม จะสามารถมองเห็นได้โดยโปรแกรมอ่านที่ทำการตรวจสอบว่าเป็นการแก้ไขที่เกิดขึ้นหลังจากการเซ็น ซึ่งนั่นคือบันทึกการตรวจสอบ (audit trail) ที่คุณต้องการพอดี อย่างไรก็ตาม นี่หมายความว่าการปรับเปลี่ยนบางอย่าง เช่น การเพิ่มลายเซ็นอนุมัติหรือการกรอกฟอร์ม ได้รับอนุญาตอย่างชัดเจนโดยมาตรฐานโดยไม่ทำให้ลายเซ็นต้นฉบับเป็นโมฆะ โดยมีเงื่อนไขว่าการเปลี่ยนแปลงนั้นสอดคล้องกับการตั้งค่าการอนุญาตของเอกสาร (ISO 32000-2 §12.7.6) การปรับเปลี่ยนที่อยู่นอกเหนือการอนุญาตเหล่านั้นจะถูกทำเครื่องหมายว่าไม่ได้รับอนุญาต การทำความเข้าใจความแตกต่างนี้ให้ถูกต้องเป็นสิ่งสำคัญเมื่อคุณสร้างเอกสารที่จะถูกลงนามร่วมในภายหลัง
ระดับความสอดคล้องและสายวิวัฒนาการ ISO 32000 (Conformance levels and the ISO 32000 lineage)
PDF เริ่มต้นจากการเป็นรูปแบบที่เป็นกรรมสิทธิ์ของ Adobe ในปี 1993 นำเอาโมเดลภาพของ PostScript มาใช้ และตลอดสิบห้าเวอร์ชันได้สะสมคุณสมบัติต่างๆ: การเข้ารหัสใน 1.1, ฟอร์มแบบโต้ตอบใน 1.2, ลายเซ็นดิจิทัลและโครงสร้างตรรกะใน 1.3, ความโปร่งใสใน 1.4, ออบเจ็กต์สตรีมใน 1.5, การเข้ารหัส AES ใน 1.6 Adobe นำเสนอ PDF 1.7 ต่อ ISO ในปี 2007 และผลลัพธ์ที่ได้คือ ISO 32000-1:2008 ISO 32000-2:2020 ครอบคลุม PDF 2.0 ซึ่งได้กระชับหลายพื้นที่ที่ระบุไว้ไม่เพียงพอ ปรับปรุงการสืบทอดคีย์ AES-256 (รุ่นปรับปรุงที่ 6 แทนที่รุ่นปรับปรุงที่ 5) และเพิ่มการสนับสนุนที่ชัดเจนสำหรับไฟล์ที่เกี่ยวข้องและสื่อสมบูรณ์ (rich media)
มาตรฐานย่อยสืบทอดมาจากฐานเดียวกัน PDF/A (ISO 19005) แลกเปลี่ยนคุณสมบัติเพื่อความเสถียรในการจัดเก็บเอกสาร: ไม่มีการเข้ารหัส, ไม่มีการพึ่งพาเนื้อหาภายนอก, ฟอนต์ทั้งหมดถูกฝัง, พื้นที่สีไม่ขึ้นกับอุปกรณ์, ต้องมีข้อมูลเมตา XMP PDF/A-1 อิงจาก PDF 1.4, PDF/A-2 อิงจาก PDF 1.7, PDF/A-3 อนุญาตให้ฝังไฟล์รูปแบบใดก็ได้ PDF/X (ISO 15930) เป็นชุดย่อยสำหรับการผลิตสิ่งพิมพ์: เอาต์พุตที่ตั้งใจ กล่องการพิมพ์และกล่องครอบ ไม่มีความโปร่งใสในระดับความสอดคล้องรุ่นเก่า PDF/UA (ISO 14289) กำหนดให้มีโครงสร้างที่ถูกแท็ก การแมป Unicode และข้อมูลเมตาภาษาสำหรับการเข้าถึงสิ่งอำนวยความสะดวก เหล่านี้ไม่ใช่รูปแบบที่แข่งขันกัน มันเป็นชุดของข้อจำกัดเพิ่มเติมที่อยู่บนส่วนแกนของ PDF และไฟล์เดียวสามารถสอดคล้องกับมาตรฐานมากกว่าหนึ่งชุดพร้อมกันได้ตราบใดที่ข้อจำกัดไม่ขัดแย้งกัน
สำหรับใครก็ตามที่เขียนโค้ดเพื่อสร้างหรือประมวลผล PDF พื้นฐานในทางปฏิบัติคือ ISO 32000-2 โดยต้องให้ความสนใจอย่างระมัดระวังในส่วนที่ครอบคลุมถึงโมเดลการอ้างอิงข้าม (§7.5), สถานะกราฟิก (§8.4), ตัวดำเนินการสถานะข้อความ (§9.3), ตัวอธิบายฟอนต์และ ToUnicode (§9.6 และ §9.10), ฟอร์มแบบโต้ตอบ (§12.7), และลายเซ็นดิจิทัล (§12.8) มาตรฐานมีความยาว แต่งานเอกสาร PDF ส่วนใหญ่จะแตะเพียงส่วนแคบๆ ซ้ำๆ การทำความเข้าใจโมเดลวัตถุและกลไกการอ้างอิงข้ามคือจุดเริ่มต้น ส่วนที่เหลือคือความเชี่ยวชาญเฉพาะทางนับจากนั้น