Το PDF δεν είναι μορφή εγγράφου όπως το Word ή το RTF. Αυτές οι μορφές αποθηκεύουν μια ακολουθία περιεχομένου την οποία ερμηνεύει ένας αποδοτέας (renderer) τη στιγμή της εμφάνισης, επομένως η έξοδος εξαρτάται από τις όποιες γραμματοσειρές και τη μηχανή διάταξης (layout engine) τυχαίνει να υπάρχουν. Το PDF αποθηκεύει το αποτέλεσμα αυτής της διαδικασίας: ακριβείς οδηγίες απόδοσης, προγράμματα γραμματοσειρών, συμπιεσμένες ροές εικόνων και ένα γράφημα αντικειμένων (object graph) που τα δένει μαζί σε μια αυτοτελή (self-contained) περιγραφή κάθε σελίδας. Το αρχείο φέρει αρκετές πληροφορίες για να αναπαραγάγει κάθε σελίδα πανομοιότυπα σε οποιονδήποτε συμβατό αποδοτέα, το οποίο είναι ταυτόχρονα ο κύριος σχεδιαστικός του στόχος και η πηγή του μεγαλύτερου μέρους της πολυπλοκότητας που συναντάτε όταν προσπαθείτε να δημιουργήσετε, να αναλύσετε ή να τροποποιήσετε ένα προγραμματιστικά
Το μοντέλο αντικειμένου
Κάθε PDF είναι μια συλλογή αριθμημένων αντικειμένων. Ένα αντικείμενο μπορεί να είναι boolean, ακέραιος, πραγματικός αριθμός, όνομα, συμβολοσειρά, πίνακας (array), λεξικό, ροή ή null. Σχεδόν ό,τι έχει ενδιαφέρον είναι ένα λεξικό, το οποίο είναι ένα σύνολο ζευγών κλειδιού-τιμής όπου τα κλειδιά είναι ονόματα και οι τιμές είναι οποιοσδήποτε άλλος τύπος αντικειμένου, συμπεριλαμβανομένων αναφορών σε άλλα αντικείμενα βάσει αριθμού και πλήθους γενεών (generation count). Μια ροή (stream) είναι ένα λεξικό ακολουθούμενο από μια ακολουθία byte, συνήθως συμπιεσμένη
Το λεξικό του καταλόγου (catalog) είναι η ρίζα. Δείχνει στο δέντρο σελίδων, το οποίο οργανώνει τα λεξικά σελίδων σε μια δομή ισορροπημένου δέντρου αντί για μια επίπεδη λίστα, επομένως η πλοήγηση στη σελίδα 5.000 ενός εγγράφου 10.000 σελίδων δεν απαιτεί τη διάσχιση κάθε προηγούμενου περιγραφέα σελίδας. Κάθε λεξικό σελίδας αναφέρεται στις ροές περιεχομένου του (μία ή περισσότερες ακολουθίες τελεστών περιγραφής σελίδας), στο λεξικό πόρων του (το οποίο με τη σειρά του παραπέμπει σε περιγραφείς γραμματοσειρών, χρωματικούς χώρους και XObjects εικόνων) και στο media box (τον χώρο συντεταγμένων στον οποίο ζει η σελίδα). Η αρχή των συντεταγμένων βρίσκεται στην κάτω αριστερή γωνία, με το θετικό Y να τρέχει προς τα πάνω, σε μονάδες του 1/72 της ίντσας
Στο τέλος του αρχείου βρίσκεται ο πίνακας διασταυρούμενων αναφορών (cross-reference table), ο οποίος αντιστοιχίζει κάθε αριθμό αντικειμένου στη μετατόπιση byte (byte offset) του στο αρχείο. Αυτό είναι που επιτρέπει την τυχαία πρόσβαση: ένα πρόγραμμα προβολής διαβάζει πρώτα τον πίνακα διασταυρούμενων αναφορών, στη συνέχεια αναζητά απευθείας όποια αντικείμενα χρειάζεται. Το PDF 1.5 εισήγαγε ροές διασταυρούμενων αναφορών, οι οποίες συμπιέζουν τον πίνακα σε ένα αντικείμενο ροής και συσκευάζουν (pack) σχετιζόμενα αντικείμενα σε ροές αντικειμένων, μειώνοντας αισθητά το μέγεθος του αρχείου για έγγραφα με πολλά μικρά αντικείμενα
Ροές περιεχομένου και το μοντέλο γραφικών
Το οπτικό περιεχόμενο μιας σελίδας ζει σε μία ή περισσότερες ροές περιεχομένου. Κάθε ροή είναι μια ακολουθία τελεστών PDF διάσπαρτη με τους τελεστές τους (operands). Ο τελεστής κειμένου BT ξεκινά ένα αντικείμενο κειμένου, το Tf επιλέγει μια γραμματοσειρά και μέγεθος από το λεξικό πόρων, το Td τοποθετεί τον δρομέα (cursor) κειμένου, το Tj ή TJ χρωματίζει μια συμβολοσειρά, και το ET κλείνει το αντικείμενο κειμένου. Τα διανυσματικά γραφικά ακολουθούν ένα παρόμοιο μοτίβο: το m ορίζει ένα σημείο εκκίνησης διαδρομής (path), το l προσαρτά ένα τμήμα γραμμής, το c προσαρτά μια καμπύλη Bezier, και το f ή S γεμίζει (fills) ή χαράζει (strokes) τη διαδρομή
Η κατάσταση γραφικών (graphics state) διέπει οτιδήποτε συμβαίνει μεταξύ των τελεστών: τρέχουσα μήτρα μετασχηματισμού, πλάτος γραμμής, χρωματικός χώρος, χρώμα γεμίσματος (fill), χρώμα πινελιάς (stroke) και τη διαδρομή αποκοπής (clipping path). Τελεστές όπως οι q και Q ωθούν (push) και εξάγουν (pop) την κατάσταση γραφικών σε μια στοίβα (stack), και έτσι το PDF υλοποιεί τοπικούς μετασχηματισμούς συντεταγμένων και προσωρινές παρακάμψεις (overrides) κατάστασης χωρίς να επηρεάζει το πλαίσιο γύρω τους. Τα Form XObjects το γενικεύουν αυτό: μια αυτοτελής ροή περιεχομένου με το δικό της λεξικό πόρων που μπορεί να ζωγραφιστεί (painted) σε μια σελίδα σε αυθαίρετες θέσεις και κλίμακες με έναν μόνο τελεστή Do
Ενσωμάτωση γραμματοσειρών και εξαγωγή κειμένου
Το PDF μπορεί να παραπέμπει σε γραμματοσειρές ονομαστικά (by name) και να βασίζεται στο πρόγραμμα προβολής για να αντικαταστήσει (substitute) κάτι, αλλά στην πράξη οποιοδήποτε έγγραφο σκοπεύετε να μοιραστείτε πρέπει να ενσωματώνει τα δεδομένα της γραμματοσειράς. Μια γραμματοσειρά Type 1 ή TrueType/OpenType ενσωματωμένη σε ένα PDF φέρει ένα λεξικό περιγραφέα γραμματοσειράς που δείχνει σε μια ροή αρχείου γραμματοσειράς. Για τις γραμματοσειρές TrueType, αυτή η ροή περιέχει το δυαδικό πρόγραμμα γραμματοσειράς· για τις Type 1, είναι τα δεδομένα PFB. Η υποσύνολη (Subsetting), που είναι αυτό που κάνει κάθε σοβαρή γεννήτρια (generator) PDF, αφαιρεί σύμβολα (glyphs) που δεν αναφέρονται από το έγγραφο, διατηρώντας το μέγεθος των αρχείων διαχειρίσιμο ακόμη και για μεγάλες γραμματοσειρές Unicode
Η εξαγωγή κειμένου είναι το σημείο όπου η ενσωμάτωση γραμματοσειρών μπορεί να προκαλέσει προβλήματα. Η οπτική αναπαράσταση ενός χαρακτήρα καθορίζεται από ένα γλύμμα (glyph) στο ενσωματωμένο πρόγραμμα γραμματοσειράς. Η τιμή Unicode αυτού του χαρακτήρα καθορίζεται από μια ροή ToUnicode CMap προσαρτημένη στο λεξικό γραμματοσειράς. Όταν το ToUnicode CMap λείπει ή είναι εσφαλμένο, ένα πρόγραμμα προβολής PDF μπορεί να αποδώσει κείμενο ευανάγνωστα αλλά δεν μπορεί να το εξαγάγει ως κείμενο Unicode με νόημα, και γι' αυτό η αντιγραφή-επικόλληση από ορισμένα PDF παράγει "σκουπίδια". Το Tagged PDF (PDF με ετικέτες, ISO 32000 §14.8) προσθέτει ένα δεύτερο επίπεδο: ένα δέντρο λογικής δομής που αντιστοιχίζει το περιεχόμενο της σελίδας σε σεμασιολογικούς ρόλους του εγγράφου όπως παραγράφους, επικεφαλίδες και κελιά πίνακα. Οι αναγνώστες οθόνης (screen readers) και οι μηχανές αναδιάταξης (reflow engines) χρησιμοποιούν το δέντρο δομής αντί της ακατέργαστης σειράς ροής περιεχομένου, γεγονός που εξηγεί γιατί ένα PDF με οπτικά καλή διάταξη μπορεί να εξακολουθεί να είναι μη προσβάσιμο εάν η επισήμανση (tagging) απουσιάζει ή είναι λάθος
Σταδιακές ενημερώσεις και ψηφιακές υπογραφές
Όταν αποθηκεύετε αλλαγές σε ένα υπάρχον PDF χωρίς να το ξαναγράψετε από την αρχή, τα νέα αντικείμενα προσαρτώνται μετά το αρχικό σώμα του αρχείου (file body) μαζί με μια νέα ενότητα διασταυρούμενων αναφορών (cross-reference section) και ένα νέο λεξικό τρέιλερ (trailer). Το ενημερωμένο τρέιλερ δείχνει στα νέα δεδομένα διασταυρούμενων αναφορών, και τα αντικείμενα που έχουν αντικατασταθεί (superseded) παραμένουν στο αρχείο, αλλά απλώς δεν αναφέρονται από τη νέα αλυσίδα διασταυρούμενων αναφορών. Αυτό είναι σταδιακή ενημέρωση (incremental update), και έχει δύο σημαντικές συνέπειες
Πρώτον, το αρχείο μεγαλώνει με κάθε κύκλο αποθήκευσης. Ένα έγγραφο που επεξεργάζεται και αποθηκεύεται επανειλημμένα συσσωρεύει στρώματα παρωχημένων αντικειμένων. Εργαλεία όπως το QPDF μπορούν να γραμμικοποιήσουν (linearize) ή να συμπιέσουν-και-ξαναγράψουν (compress-and-rewrite) ένα αρχείο για την ανάκτηση αυτού του χώρου, αλλά η προεπιλογή είναι η συσσώρευση. Δεύτερον, οι ψηφιακές υπογραφές εξαρτώνται από τις σταδιακές ενημερώσεις για το μοντέλο ακεραιότητάς τους (integrity model). Μια υπογραφή ISO 32000 καλύπτει ένα εύρος byte (byte range) του αρχείου, συνήθως τα πάντα εκτός από το σύμβολο κράτησης θέσης (placeholder) για την ίδια την τιμή της υπογραφής. Οποιεσδήποτε αλλαγές μετά την υπογραφή που εμφανίζονται ως πρόσθετες σταδιακές ενημερώσεις είναι ορατές σε έναν αναγνώστη επικύρωσης (validating reader) ως τροποποιήσεις που έγιναν μετά την υπογραφή, το οποίο είναι ακριβώς το ίχνος ελέγχου (audit trail) που θέλετε. Ωστόσο, αυτό σημαίνει επίσης ότι ορισμένες τροποποιήσεις, όπως η προσθήκη υπογραφής έγκρισης ή η συμπλήρωση πεδίων φόρμας, επιτρέπονται ρητά από το πρότυπο χωρίς να ακυρώνεται η αρχική υπογραφή, υπό την προϋπόθεση ότι οι αλλαγές συμμορφώνονται με τις ρυθμίσεις αδειών του εγγράφου (ISO 32000-2 §12.7.6). Μια τροποποίηση που εμπίπτει εκτός αυτών των αδειών επισημαίνεται ως μη εξουσιοδοτημένη. Η σωστή κατανόηση αυτής της διάκρισης έχει σημασία όταν δημιουργείτε έγγραφα που θα προσυπογραφούν (countersigned) σε επόμενο στάδιο
Επίπεδα συμμόρφωσης και η γενεαλογία του ISO 32000
Το PDF ξεκίνησε ως ιδιόκτητη (proprietary) μορφή της Adobe το 1993, απορρόφησε το μοντέλο απεικόνισης του PostScript και, μέσω δεκαπέντε εκδόσεων, συσσώρευσε χαρακτηριστικά: κρυπτογράφηση στο 1.1, διαδραστικές φόρμες (interactive forms) στο 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) και πρόσθεσε ρητή υποστήριξη για συσχετιζόμενα αρχεία (associated files) και εμπλουτισμένα μέσα (rich media)
Τα υποπρότυπα (substandards) προέρχονται από την ίδια βάση. Το PDF/A (ISO 19005) ανταλλάσσει (trades) χαρακτηριστικά για σταθερότητα αρχειοθέτησης: καθόλου κρυπτογράφηση, καθόλου εξαρτήσεις από εξωτερικό περιεχόμενο, όλες οι γραμματοσειρές ενσωματωμένες, χρωματικοί χώροι ανεξάρτητοι από συσκευή, απαιτούνται μεταδεδομένα (metadata) XMP. Το PDF/A-1 βασίζεται στο PDF 1.4, το PDF/A-2 στο PDF 1.7, το PDF/A-3 επιτρέπει ενσωματωμένα αρχεία οποιασδήποτε μορφής. Το PDF/X (ISO 15930) είναι το υποσύνολο παραγωγής εκτυπώσεων: προθέσεις εξόδου (output intents), bleed και trim boxes, χωρίς διαφάνεια σε παλαιότερα επίπεδα συμμόρφωσης. Το PDF/UA (ISO 14289) επιβάλλει (mandates) δομή με ετικέτες (tagged), αντιστοιχίσεις Unicode (mappings) και μεταδεδομένα γλώσσας για προσβασιμότητα. Αυτές δεν είναι ανταγωνιστικές μορφές· είναι σύνολα πρόσθετων περιορισμών πάνω στον πυρήνα του PDF, και ένα μόνο αρχείο μπορεί να συμμορφώνεται σε περισσότερα από ένα ταυτόχρονα (simultaneously) υπό την προϋπόθεση ότι οι περιορισμοί δεν συγκρούονται
Για οποιονδήποτε γράφει κώδικα που δημιουργεί ή επεξεργάζεται PDF, η πρακτική βάση (baseline) είναι το ISO 32000-2 με προσεκτική προσοχή στις ενότητες που καλύπτουν το μοντέλο διασταυρούμενων αναφορών (§7.5), την κατάσταση γραφικών (§8.4), τους τελεστές κατάστασης κειμένου (§9.3), τους περιγραφείς γραμματοσειρών και το ToUnicode (§9.6 και §9.10), τις διαδραστικές φόρμες (§12.7) και τις ψηφιακές υπογραφές (§12.8). Το πρότυπο είναι εκτενές (long), αλλά οι περισσότερες προγραμματιστικές εργασίες PDF αγγίζουν μια στενή φέτα του (narrow slice) επανειλημμένα. Η κατανόηση του μοντέλου αντικειμένων και του μηχανισμού διασταυρούμενων αναφορών είναι το σημείο εισόδου· οτιδήποτε άλλο είναι εξειδίκευση από εκεί και πέρα