Εσωτερικά της Μηχανής Επεξεργασίας PDF
Εσωτερικά της Μηχανής Επεξεργασίας PDF
Οι κλάσεις Document, Page και Annotation που χρησιμοποιείτε για την καθημερινή επεξεργασία PDF είναι μια προσκηνή πάνω από ένα χαμηλότερου επιπέδου πακέτο aspose_pdf.engine. Η μηχανή υλοποιεί την πραγματική μηχανική των PDF: το μοντέλο αντικειμένων COS (Carousel Object Structure) από το οποίο κατασκευάζεται κάθε αρχείο PDF, τον αναλυτή και τον γράφτη που μετατρέπουν μεταξύ αντικειμένων COS και bytes PDF, τη σύνθεση εμφάνισης σημειώσεων, την rasterization σελίδων, τα εσωτερικά στοιχεία κωδικοποιητών γραμματοσειρών και εικόνων, και τα κρυπτογραφικά πρωτόκολλα πίσω από την κρυπτογράφηση εγγράφων και τις ψηφιακές υπογραφές. Οι περισσότερες εφαρμογές δεν χρειάζεται ποτέ να εισάγουν απευθείας από το aspose_pdf.engine — αλλά είναι το σωστό σημείο για να κοιτάξετε όταν χρειάζεστε προσαρμοσμένα εργαλεία, εγκληματολογική επιθεώρηση PDF, ή συμπεριφορά που δεν εκθέτει το υψηλού επιπέδου API.
Δημιουργία Εμφάνισης για Μία Σημείωση
Οι διαδραστικές σημειώσεις όπως τετράγωνα, κύκλοι και σφραγίδες δεν μεταφέρουν αυτόματα ένα κανονικό ρεύμα εμφάνισης (/AP /N). Η κλήση του Annotation.generate_appearance ενεργοποιεί τα εσωτερικά της μηχανής για σύνθεση εμφάνισης ώστε να δημιουργήσει ένα κατόπιν ζήτησης από τις ιδιότητες της σημείωσης.
from aspose_pdf import Document
doc = Document()
doc.pages.add()
ann = doc.pages[0].annotations.add(
"Square", (100, 100, 200, 200), "", properties={"C": [1, 0, 0], "IC": [0, 1, 0]}
)
print(ann.has_appearance) # False -- no appearance stream yet
ann.generate_appearance()
print(ann.has_appearance) # True -- the engine synthesised one
print(b"1 0 0 RG" in ann.appearance_normal) # True -- red stroke operator
print(b"0 1 0 rg" in ann.appearance_normal) # True -- green fill operatorΜαζική Δημιουργία Εμφανίσεων σε Σελίδες και Έγγραφα
AnnotationCollection.generate_appearances συνθέτει εμφανίσεις για κάθε επιλέξιμη σημείωση σε μια σελίδα σε μία κλήση, παραλείποντας υποτύπους που η μηχανή δεν ξέρει πώς να αποδώσει (όπως Text):
from aspose_pdf import Document
doc = Document()
doc.pages.add()
page = doc.pages[0]
page.annotations.add("Square", (0, 0, 50, 50), "")
page.annotations.add("Circle", (60, 0, 110, 50), "")
page.annotations.add("Text", (0, 60, 20, 80), "") # unsupported subtype -> skipped
print(page.annotations.generate_appearances()) # 2Document.generate_appearances κάνει το ίδιο σε κάθε σελίδα του εγγράφου, και είναι ιδεπομετρική — μια δεύτερη κλήση δεν κάνει τίποτα όταν οι εμφανίσεις ήδη υπάρχουν:
from aspose_pdf import Document
doc = Document()
doc.pages.add()
doc.pages.add()
doc.pages[0].annotations.add("Square", (0, 0, 50, 50), "")
doc.pages[1].annotations.add(
"Line", (0, 0, 50, 50), "", properties={"L": [0, 0, 50, 50]}
)
print(doc.generate_appearances()) # 2 -- one per page
print(doc.generate_appearances()) # 0 -- already generated, no-opΙσοπεδίαση Σχολίων σε Στατικό Περιεχόμενο Σελίδας
Document.flatten() σχεδιάζει την εμφάνιση κάθε σχολίου απευθείας στο ρεύμα περιεχομένου της σελίδας (ως κλήση Do XObject) και στη συνέχεια αφαιρεί το ίδιο το αντικείμενο του σχολίου, ώστε η σελίδα να αποδίδεται ταυτόσημα σε προβολείς που αγνοούν εντελώς τα σχόλια:
from aspose_pdf import Document
doc = Document()
doc.pages.add()
doc.pages[0].annotations.add(
"Square", (100, 100, 200, 200), "", properties={"C": [0, 0, 0]}
)
doc.flatten()Μετά από αυτήν την κλήση το ρεύμα περιεχομένου της σελίδας είναι μεγαλύτερο από πριν (τώρα περιέχει το ενσωματωμένο τετράγωνο) και το doc.pages[0].annotations δεν περιέχει πλέον το ισοπεδωμένο σχόλιο.
Παραγωγή Κλειδιών Κρυπτογράφησης Βασισμένων σε Κωδικό (Έκδοση 4 / AES-128)
EncryptionUtils υλοποιεί την παραγωγή κλειδιών του τυπικού διαχειριστή ασφαλείας PDF και τις AES-CBC πρωτογενείς απευθείας, ανεξάρτητα από το Document API. Αυτό είναι χρήσιμο για προσαρμοσμένα εργαλεία ή δικανική επιθεώρηση κρυπτογραφημένων PDF:
import os
from aspose_pdf.engine.encryption import EncryptionUtils
file_id = os.urandom(16)
user_pwd = "mypassword"
# Derive the owner (O) and user (U) key material for Revision 4 (128-bit AES)
o_value = EncryptionUtils.compute_owner_key_v4("owner", user_pwd, 16, 4)
u_value, enc_key = EncryptionUtils.compute_user_key_v4(
user_pwd, o_value, -4, file_id, 16, 4
)
# Encrypt data with the derived file-encryption key
plaintext = b"Confidential PDF content"
ciphertext = EncryptionUtils.encrypt_aes_cbc(enc_key, plaintext)
# Re-derive the key from the password before trusting it to decrypt
verified_key = EncryptionUtils.verify_password_v4(
user_pwd, u_value, o_value, -4, file_id, 16, 4
)
print(verified_key is not None) # True -- password matches
decrypted = EncryptionUtils.decrypt_aes_cbc(verified_key, ciphertext)
print(decrypted == plaintext) # TrueΚρυπτογράφηση Ακατέργαστου Περιεχομένου με AES-CBC
Για ανάγκες χαμηλότερου επιπέδου, το EncryptionUtils.encrypt_aes_cbc() και το decrypt_aes_cbc() λειτουργούν απευθείας σε οποιοδήποτε κλειδί 16, 24 ή 32 byte χωρίς καθόλου να περνούν από παραγωγή κλειδιού βασισμένη σε κωδικό:
import os
from aspose_pdf.engine.encryption import EncryptionUtils
key = os.urandom(32) # AES-256; 16 and 24-byte keys are also accepted
plaintext = b"Hello, PDF AES 256!"
ciphertext = EncryptionUtils.encrypt_aes_cbc(key, plaintext)
decrypted = EncryptionUtils.decrypt_aes_cbc(key, ciphertext)
print(decrypted == plaintext) # TrueΣυμβουλές και Καλές Πρακτικές
- Προτιμήστε τη υψηλού επιπέδου διεπαφή
Document,PageκαιAnnotationγια καθημερινή επεξεργασία εγγράφων. Το πακέτοaspose_pdf.engineείναι η εσωτερική υλοποίηση πάνω στην οποία χτίζονται αυτές οι κλάσεις — χρησιμοποιήστε το μόνο όταν χρειάζεστε προσαρμοσμένα εργαλεία, δικανική επιθεώρηση ή συμπεριφορά που η διεπαφή δεν εκθέτει. - Ταιριάξτε το όρισμα
revisionμε το χειριστή ασφαλείας που στοχεύετε: ταcompute_owner_key_v4/compute_user_key_v4καλύπτουν τις Εκδόσεις 2–4 (40- και 128-bit RC4/AES), ενώ τοcompute_hash_v5υλοποιεί τον αλγόριθμο Έκδοσης 5/6 που χρησιμοποιείται από το AES-256. Ο συνδυασμός εκδόσεων και μηκών κλειδιών σιωπηρά παράγει το λάθος κλειδί. Document.generate_appearancesκαιAnnotationCollection.generate_appearancesείναι ιδεομερείς — καλέστε τα προφυλακτικά πριν από την απόδοση ή την εξομάλυνση ενός εγγράφου που δεν δημιουργήσατε εσείς.Document.flatten()είναι καταστροφικό: αφαιρεί κάθε σημείωση που ενσωματώνει στο περιεχόμενο της σελίδας. Ολοκληρώστε τυχόν άλλες επεξεργασίες σημειώσεων πρώτα, ή εργαστείτε σε αντίγραφο.- Δεν έχει κάθε υποτύπο σημείωσης ενσωματωμένο συνθετικό εμφάνισης — τα
TextκαιPopupείναι κοινά παραδείγματα. Ελέγξτε τοhas_appearanceμετά την κλήση τουgenerate_appearance()αντί να υποθέτετε ότι πέτυχε.
Συνηθισμένα προβλήματα
| Πρόβλημα | Αιτία | Διόρθωση |
|---|---|---|
EncryptionUtils.encrypt_aes_cbc/decrypt_aes_cbc προκαλεί σφάλμα “AES key must be 16, 24, or 32 bytes” | Δόθηκε κλειδί με μη έγκυρο μήκος | Δημιουργήστε το κλειδί με os.urandom(16), os.urandom(24) ή os.urandom(32) |
EncryptionUtils.verify_password_v4 επιστρέφει None αντί να εγείρει | Ο παρεχόμενος κωδικός πρόσβασης δεν ταιριάζει με τις προεξαγόμενες τιμές U/O του εγγράφου | Ελέγξτε ρητά για None πριν περάσετε το αποτέλεσμα στο decrypt_aes_cbc |
Annotation.generate_appearance επιστρέφει False | Ο υποτύπος της σημείωσης δεν διαθέτει ενσωματωμένο συνθέτη εμφάνισης (για παράδειγμα Text ή Popup) | Παρέχετε τα δικά σας appearance_normal bytes, ή αποδεχτείτε την προεπιλεγμένη απόδοση του προβολέα |
Μια δεύτερη κλήση στο Document.generate_appearances επιστρέφει 0 | Η κλήση είναι idempotent — οι σημειώσεις που ήδη έχουν has_appearance == True παραλείπονται | Αναμενόμενη συμπεριφορά, όχι σφάλμα |
FAQ
Χρειάζεται να εισάγω από το aspose_pdf.engine για καθημερινή επεξεργασία εγγράφων;
Όχι. Οι κλάσεις Document, Page και Annotation καλύπτουν τυπικές ροές εργασίας εγγράφων. Η στρώση μηχανής είναι όπου υλοποιείται η συμπεριφορά αυτών των κλάσεων, και είναι πιο χρήσιμη για προσαρμοσμένα εργαλεία ή για άμεση επιθεώρηση των εσωτερικών στοιχείων του PDF.
Ποια είναι η διαφορά μεταξύ Annotation.generate_appearance και AnnotationCollection.generate_appearances;
Η πρώτη δημιουργεί ένα ρεύμα εμφάνισης για μία μόνο σημείωση και επιστρέφει ένα bool. Η δεύτερη κάνει το ίδιο για κάθε επιλέξιμη σημείωση σε μια συλλογή (τις σημειώσεις μιας σελίδας ή, μέσω Document.generate_appearances, κάθε σελίδα του εγγράφου) και επιστρέφει τον αριθμό των εμφανίσεων που δημιούργησε.
Γιατί οι μέθοδοι παράγωγης κλειδιού λαμβάνουν ένα όρισμα revision;
Ο τυπικός διαχειριστής ασφαλείας του PDF έχει εξελιχθεί μέσα από τις εκδόσεις ISO 32000 — Η Έκδοση 2 χρησιμοποιεί 40-bit RC4, οι Εκδόσεις 3/4 υποστηρίζουν 128-bit RC4 ή AES, και οι Εκδόσεις 5/6 (που χρησιμοποιούνται για AES-256) χρησιμοποιούν εντελώς διαφορετικό αλγόριθμο κατακερματισμού (compute_hash_v5). Το όρισμα revision επιλέγει ποια παράγωγη θα εκτελέσουν οι μέθοδοι EncryptionUtils.
Μπορώ να επιθεωρήσω ή να δημιουργήσω ακατέργαστα αντικείμενα PDF απευθείας;
Ναι. Το aspose_pdf.engine.cos εκθέτει το μοντέλο αντικειμένων COS — PdfObject, PdfDictionary, PdfArray, PdfStream, PdfName και σχετικούς τύπους — που PdfCosWriter και PdfCosParser σειριοποιούν σε και αναλύουν από τα byte του PDF.
Πού πραγματοποιείται η απόδοση σελίδας-σε-εικόνα;
Document.render_page επιστρέφει ένα RasterizedPage, ένα αντικείμενο επιπέδου μηχανής με μεθόδους to_png(), to_tiff() και save() για τη μετατροπή μιας αποδοθείσας σελίδας σε αρχείο εικόνας.
API Reference Σύνοψη
| Κλάση / Μέθοδος | Περιγραφή |
|---|---|
Annotation.generate_appearance(force) -> bool | Συνθέστε τη ροή κανονικής εμφάνισης για μία σημείωση κατά ζήτηση |
AnnotationCollection.generate_appearances(force) -> int | Δημιουργήστε μαζικά εμφανίσεις για κάθε επιλέξιμη σημείωση σε μια σελίδα |
Document.generate_appearances(force) -> int | Δημιουργήστε μαζικά εμφανίσεις για κάθε επιλέξιμη σημείωση στο έγγραφο |
Document.flatten() -> Document | Ενσωματώστε τις εμφανίσεις των σημειώσεων στο περιεχόμενο της σελίδας και αφαιρέστε τις σημειώσεις |
Document.render_page(page_index, dpi, scale, background, antialias) -> RasterizedPage | Ραστεροποιήστε μια σελίδα μέσω της γραμμής επεξεργασίας απόδοσης της μηχανής |
RasterizedPage | Μια αποδομένη σελίδα σε συσκευασμένη μορφή RGB, με to_png(), to_tiff() και save() |
GeneratedAppearance | Εσωτερικό αποτέλεσμα της σύνθεσης εμφάνισης: bytes περιεχομένου και τυχόν απαιτούμενους πόρους ExtGState/font |
EncryptionUtils | AES-CBC/RC4 κρυπτογράφηση και παραγωγή κλειδιού του PDF standard-security-handler (Αναθεωρήσεις 2–6) |
PdfObject | Αφηρημένη βασική κλάση για κάθε αντικείμενο COS (Carousel Object Structure) |
PdfDictionary / PdfArray / PdfStream | Συγκεκριμένοι τύποι κοντέινερ COS που συνθέτουν το χαμηλού επιπέδου δέντρο εγγράφου |
PdfName / PdfNumber / PdfString / PdfBoolean / PdfNull | Πρωτόγονοι τύποι τιμών COS |
PdfIndirectReference | Μια έμμεση αναφορά COS (n g R) σε άλλο αντικείμενο |
PdfCosWriter | Σειριοποιεί ένα COS PdfDocument εντός μνήμης σε PDF bytes |
PdfCosParser / LazyPdfObjectStore | Αναλύει PDF bytes σε αντικείμενα COS, υλοποιώντας τα κατά απαίτηση |
IncrementalUpdate / IncrementalWriter | Προσθέτει μια ενότητα αυξητικής ενημέρωσης σε υπάρχον PDF αντί να το ξαναγράψει |
SimplePdf | Η εγγενής-Python χαμηλού επιπέδου αναπαράσταση εγγράφου πάνω στην οποία χτίζεται το υψηλού επιπέδου Document API |
TextFragmentAbsorber / TextFragmentCollection | Εξαγωγή τμημάτων κειμένου χαμηλού επιπέδου σε ένα παράδειγμα SimplePdf |
ImagePlacementAbsorber / ImagePlacement | Εντοπίστε, αποθηκεύστε, αντικαταστήστε ή κρύψτε τις raster εικόνες που τοποθετούνται σε μια σελίδα |
SigningUtils | Δημιουργήστε αυτο-υπογεγραμμένα πιστοποιητικά και υπογραφές PKCS#7/CAdES για ψηφιακή υπογραφή |
DssMaterial / ChainResult / RevocationResult / TimestampInfo | Υποστήριξη επαλήθευσης υπογραφών: υλικό DSS, αποτελέσματα αλυσίδας πιστοποιητικών, έλεγχοι ανάκλησης και επαλήθευση χρονικής σήμανσης RFC 3161 |
StandardFonts | Μετρικές και κωδικοποιήσεις για τις 14 τυπικές γραμματοσειρές PDF |
CidTextCodec | Κωδικοποίηση και αποκωδικοποίηση show-strings για composite (Type0) fonts |
Shading | Δειγματοληψία χρώματος RGB σε σκιάσεις αξονικές, ακτινικές και βάσει συνάρτησης |
Color / Matrix | Πρωτόγονα χαμηλού επιπέδου χρώματος και 2-Δ affine-transform που χρησιμοποιούνται σε όλη τη μηχανή |