Εσωτερικά της Μηχανής Επεξεργασίας PDF

Εσωτερικά της Μηχανής Επεξεργασίας 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())  # 2

Document.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
EncryptionUtilsAES-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 που χρησιμοποιούνται σε όλη τη μηχανή

Δείτε επίσης

 Ελληνικά