Τεχνικό Άρθρο

Σύγκριση των Βιβλιοθηκών PDF της losLab για Delphi: HotPDF, PDFium Component και PDFlibPas

Τρεις βιβλιοθήκες. Τρεις διαφορετικές δουλειές. Η επιλογή της λάθος βιβλιοθήκης σας κοστίζει εβδομάδες παρακάμψεων, και η επιλογή και των τριών όταν χρειάζεστε μόνο μία, σας κοστίζει επιβάρυνση συντήρησης που δεν είχατε προϋπολογίσει. Εδώ υπάρχει μια άμεση περιγραφή του τι κάνει πραγματικά κάθε βιβλιοθήκη PDF της losLab, πού ταιριάζει και πού παραδίδει τη σκυτάλη στα αδέρφια της

HotPDF: δημιουργία PDF από το μηδέν στο Delphi

Το HotPDF είναι ένα εγγενές στοιχείο VCL για τη δημιουργία εγγράφων PDF. Το μοντέλο του είναι προστακτικό και επικεντρωμένο στη σελίδα: κατασκευάζετε ένα στιγμιότυπο THotPDF, ορίζετε ιδιότητες εγγράφου, καλείτε την BeginDoc, σχεδιάζετε στην CurrentPage, προσθέτετε σελίδες όπως απαιτείται και κλείνετε με την EndDoc. Η σειρά έχει σημασία επειδή η BeginDoc δεσμεύει το λεξικό κρυπτογράφησης και τις ρυθμίσεις συμπίεσης τη στιγμή που εκτελείται· οτιδήποτε εκχωρηθεί μετά από αυτό το σημείο αγνοείται σιωπηλά αντί να εφαρμοστεί αναδρομικά

Η επιφάνεια σχεδίασης καλύπτει ολόκληρο το σύνολο τελεστών PDF σε επίπεδο Delphi: TextOut για τοποθετημένο κείμενο Unicode, SetFont με ενσωμάτωση TrueType, διανυσματικά πρωτόγονα (γραμμές, καμπύλες Bezier, ελλείψεις, ορθογώνια), τοποθέτηση εικόνας από αρχείο ή μνήμη και δημιουργία γραμμωτού κώδικα (barcode). Οι συντεταγμένες είναι σε σημεία (points) από την κάτω αριστερή γωνία με το Y να αυξάνεται προς τα πάνω, κάτι που μπερδεύει τους πάντες έστω μια φορά. Η κατάσταση της γραμματοσειράς δεν επιβιώνει από την AddPage, επομένως απαιτείται κλήση της SetFont μετά από κάθε αλλαγή σελίδας

Τα πεδία AcroForm είναι στοιχεία πρώτης κατηγορίας. Μπορείτε να προσθέσετε πεδία κειμένου, πλαίσια ελέγχου (checkboxes), κουμπιά επιλογής (radio buttons), σύνθετα πλαίσια (combo boxes), πλαίσια λίστας (list boxes) και κουμπιά πίεσης (push buttons) απευθείας σε ένα αντικείμενο σελίδας με μία μόνο κλήση το καθένα. Το HotPDF μπορεί επίσης να φορτώσει ένα υπάρχον PDF μέσω της LoadFromFile και να συμπληρώσει ή να διαβάσει τιμές πεδίων, γεγονός που το καθιστά χρήσιμο σε δύο ξεχωριστές ροές εργασίας: την κατασκευή φορμών και την αυτοματοποίηση της συμπλήρωσής τους

Η κρυπτογράφηση αντιμετωπίζεται επίσης σε επίπεδο εγγράφου. Η CryptKeyLength επιλέγει το σχήμα (40-bit RC4 έως AES-256), η ActivateProtection το οπλίζει και η ProtectOptions ορίζει τις σημαίες άδειας ISO. Οι δύο λειτουργίες αναθεώρησης AES-256 (R5 και R6, ελεγχόμενες από την UseAES256R6) υπάρχουν επειδή η αναθεώρηση 6 διορθώνει μια γνωστή αδυναμία της αναθεώρησης 5 αλλά απαιτεί πρόγραμμα προβολής συμβατό με PDF 2.0· Η επιλογή μεταξύ τους είναι απόφαση συμβατότητας, όχι ευκολίας

Η υποστήριξη ψηφιακής υπογραφής στο HotPDF καλύπτει τα βασικά προφίλ PAdES, επομένως είναι κατάλληλο για ροές εργασίας όπου η υπογραφή πρέπει να πληροί τις απαιτήσεις ETSI EN 319 142. Εάν η ανάγκη σας είναι μόνο η δημιουργία εξόδου, το HotPDF είναι η βιβλιοθήκη στην οποία πρέπει να απευθυνθείτε πρώτα

PDFium Component: απόδοση, προβολή και ανάγνωση υπαρχόντων PDF

Το PDFium Component περιβάλλει τον κινητήρα PDFium της Google ως στοιχείο VCL, κάτι που του δίνει έναν θεμελιωδώς διαφορετικό ρόλο από το HotPDF. Όπου το HotPDF γράφει, το PDFium Component διαβάζει και αποδίδει. Το βασικό αντικείμενο είναι το TPdf, ένας διαχειριστής εγγράφων που ανοίγει ένα αρχείο ορίζοντας την FileName και στη συνέχεια Active := True. Οι αποτυχίες φόρτωσης δεν εγείρονται ως εξαιρέσεις· η Active απλώς παραμένει False, οπότε ο έλεγχός της μετά την εκχώρηση δεν είναι προαιρετικός

Η απόδοση εκτελείται μέσω του TPdfView, ενός οπτικού στοιχείου που ρίχνετε σε μια φόρμα και το συνδέετε με ένα στιγμιότυπο TPdf μέσω PdfView.Pdf := Pdf. Η λειτουργία ζουμ και προσαρμογής ζουν στην προβολή, όχι στο έγγραφο. Μια λεπτομέρεια που μπερδεύει τον κόσμο: Οι ιδιότητες Pdf.PageNumber και PdfView.PageNumber είναι ανεξάρτητες. Η ρύθμιση της μίας δεν ενημερώνει την άλλη και τα API εξαγωγής που βασίζονται στην προβολή (πλαίσια λέξεων, μονάδες ανάγνωσης) χρησιμοποιούν την τρέχουσα σελίδα της προβολής, όχι του εγγράφου

Στην εξαγωγή κειμένου είναι όπου το PDFium Component δεν έχει άμεσο ανταγωνιστή στη σειρά της losLab. Η ReadablePageContent επιστρέφει δομημένο κείμενο με επίγνωση της σειράς ανάγνωσης, η PageWordBoxes δίνει ορθογώνια οριοθέτησης σε επίπεδο λέξης και η DocumentReadingUnits διατρέχει ολόκληρο το έγγραφο. Για εργασίες προσβασιμότητας, η IsTagged σας λέει εάν υπάρχει δέντρο δομής και η ValidatePdfUa εκτελεί έναν έλεγχο συμμόρφωσης UA. Αυτά τα API καθιστούν το PDFium Component τη φυσική επιλογή για κάθε ροή εργασίας που πρέπει να κατανοήσει τι υπάρχει μέσα σε ένα υπάρχον PDF αντί να παράγει ένα νέο

Η συμπλήρωση φόρμας λειτουργεί επίσης από την πλευρά του PDFium, μέσω του ίδιου επιπέδου AcroForm που εκθέτει ο υποκείμενος κινητήρας. Είναι κατάλληλο όταν το έγγραφο προέλευσης υπάρχει ήδη και αυτοματοποιείτε την ολοκλήρωσή του αντί να κατασκευάζετε μόνοι σας τα πεδία της φόρμας

PDFlibPas: χειρισμός, υπογραφή συμμόρφωσης και άμεση πρόσβαση σε αρχεία

Το PDFlibPas (έκδοση 3.73.0) βρίσκεται στο άλλο άκρο του φάσματος πολυπλοκότητας. Εκθέτει τρία επίπεδα API πάνω από το ίδιο μοντέλο εγγράφου: μια επίπεδη πρόσοψη που βασίζεται σε δείκτες (TPDFlib) συμβατή με τη σύμβαση κλήσης Quick-PDF, ένα πλήρες επίπεδο δέντρου αντικειμένων (TPDFDocument) και έναν αναλυτή ροής (TSmartPDFReader / TSmartPDFWriter) που λειτουργεί απευθείας στα byte του αρχείου χωρίς να φορτώνει ολόκληρο το γράφημα αντικειμένων

Το επίπεδο ροής (streaming) είναι αυτό που κάνει το PDFlibPas τη σωστή επιλογή για μεγάλα έγγραφα. Το TSmartPDFWriter μπορεί να προσαρτήσει μια σταδιακή ενημέρωση σε ένα αρχείο στο δίσκο χωρίς να ανακατασκευάσει ολόκληρο τον πίνακα παραπομπών (cross-reference table), που είναι ο μηχανισμός πίσω από την αποτελεσματική επανεγγραφή (resaving) και τις σφραγίδες μακροπρόθεσμης επικύρωσης PAdES. Για ροές εργασίας υπογραφής βαθμού συμμόρφωσης, όπου ο υπογεγραμμένος κατακερματισμός (hash) πρέπει να καλύπτει ένα συγκεκριμένο εύρος byte και η υπογραφή εφαρμόζεται χωρίς επανεγγραφή του εγγράφου, αυτό το επίπεδο είναι η μόνη βιώσιμη διαδρομή

Ο χειρισμός εγγράφων στο επίπεδο TPDFDocument περιλαμβάνει συγχώνευση με την Merge, επιλεκτική αντιγραφή σελίδων μέσω της CopyPagesFromDoc με συμβολοσειρά εύρους και διακυβέρνηση έκδοσης μέσω των SetMinimumVersion και LockSaveVersion. Το κλείδωμα έκδοσης εγείρει το σφάλμα 602 εάν επιχειρήσετε να αποθηκεύσετε μια δυνατότητα που θα ωθούσε την έξοδο πάνω από την κλειδωμένη έκδοση, το οποίο είναι χρήσιμο όταν πρέπει να εγγυηθείτε ότι η έξοδος παραμένει εντός μιας συγκεκριμένης αναθεώρησης PDF για σκοπούς αρχειοθέτησης

Η υποστήριξη PDF/A (ISO 19005) βρίσκεται στον πάγκο εργασίας συμμόρφωσης του PDFlibPas. Σημειώστε ότι η κρυπτογράφηση και το PDF/A αποκλείονται αμοιβαία από τις προδιαγραφές: δεν μπορείτε να έχετε και τα δύο σε ένα αρχείο. Οι ροές εργασίας που χρειάζονται ένα κρυπτογραφημένο αντίγραφο διανομής και ένα αντίγραφο αρχειοθέτησης PDF/A πρέπει να παράγουν δύο ξεχωριστά τεχνουργήματα (artifacts)

Επιλέγοντας ανάμεσά τους

Το τυπικό δέντρο αποφάσεων είναι σύντομο. Εάν δημιουργείτε ένα νέο έγγραφο από δεδομένα, χρησιμοποιήστε το HotPDF. Εάν αποδίδετε ή εξάγετε κείμενο από ένα υπάρχον έγγραφο σε μια εφαρμογή Delphi VCL, χρησιμοποιήστε το PDFium Component. Εάν χειρίζεστε, συγχωνεύετε ή υπογράφετε για συμμόρφωση υπάρχοντα PDF σε κλίμακα ή με σημασιολογία σταδιακής αποθήκευσης (incremental-save), χρησιμοποιήστε το PDFlibPas. Πολλά συστήματα παραγωγής χρησιμοποιούν δύο από τα τρία: Το HotPDF για τη δημιουργία της εξόδου και το PDFlibPas για την εφαρμογή μιας σφραγίδας μακροπρόθεσμης επικύρωσης πριν από την αρχειοθέτηση, για παράδειγμα, ή το PDFium Component για προεπισκόπηση του τι παρήγαγε το HotPDF πριν την αποστολή του στα επόμενα στάδια

Και τα τρία παραδίδονται ως εγγενής πηγαίος κώδικας Pascal για Delphi και C++Builder, χωρίς εξαρτήσεις χρόνου εκτέλεσης (runtime dependencies) πέρα από τη VCL. Το PDFium Component επιπλέον ενσωματώνει το DLL του PDFium, το οποίο καλύπτει τις εργασίες απόδοσης και ανάλυσης του κινητήρα. Η σελίδα προϊόντος κάθε βιβλιοθήκης περιέχει την πλήρη αναφορά API και το τρέχον ιστορικό εκδόσεων

Λεπτομέρειες για τις επιμέρους βιβλιοθήκες: Στοιχείο HotPDF, Στοιχείο PDFium Component και PDFlibPas