PDF feldolgozó motor belső részei
PDF Feldolgozó Motor Belső Működése
A Document, Page és Annotation osztályok, amelyeket a mindennapi PDF feldolgozáshoz használsz, egy felületet képeznek egy alacsonyabb szintű aspose_pdf.engine csomag felett. A motor valósítja meg a PDF tényleges mechanikáját: a COS (Carousel Object Structure) objektummodellt, amelyből minden PDF fájl felépül, a parsert és írót, amelyek a COS objektumok és a PDF bájtok között konvertálnak, az annotációk megjelenésének szintézisét, az oldal rasterizálását, a betűtípus- és kép-kódoló belső működését, valamint a kriptográfiai primitíveket, amelyek a dokumentum titkosítását és digitális aláírásait biztosítják. A legtöbb alkalmazásnak soha nem kell közvetlenül a aspose_pdf.engine-ből importálni — de ez a megfelelő hely, ha egyedi eszközökre, forenzikus PDF vizsgálatra vagy olyan viselkedésre van szükséged, amelyet a magas szintű API nem tesz elérhetővé.
Megjelenés létrehozása egyetlen annotációhoz
Az interaktív annotációk, mint a négyzetek, körök és pecsétek, nem viselik automatikusan a normál megjelenítési adatfolyamot (/AP /N). A Annotation.generate_appearance meghívása elindítja a motor megjelenés-szintézis belső folyamatait, hogy a kérésre egyet építsen az annotáció tulajdonságai alapján.
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 operatorMegjelenések Tömeges Létrehozása Oldalak és Dokumentumok Között
A AnnotationCollection.generate_appearances egy hívásban szintetizálja a megjelenéseket minden jogos annotációra egy oldalon, kihagyva azokat az altípusokat, amelyeket a motor nem tud renderelni (például 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()) # 2A Document.generate_appearances ugyanezt végzi a dokumentum minden oldalán, és idempotens — a második hívás hatástalan, ha a megjelenések már léteznek:
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-opAnnotációk laposítása statikus oldal tartalomra
Document.flatten() minden annotáció megjelenését közvetlenül az oldal tartalmi adatfolyamába rajzolja (mint egy Do XObject meghívás), majd eltávolítja magát az annotációobjektust, így az oldal azonos módon jelenik meg azokban a megjelenítőkben, amelyek teljesen figyelmen kívül hagyják az annotációkat:
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()E hívás után az oldal tartalmi adatfolyama hosszabb lesz, mint korábban (most már tartalmazza a beágyazott négyzetet), és doc.pages[0].annotations már nem tartalmazza a laposított annotációt.
Jelszó alapú titkosítási kulcsok származtatása (4. revízió / AES-128)
EncryptionUtils közvetlenül megvalósítja a PDF szabványos biztonsági kezelő kulcsgenerálását és a AES-CBC primitívákat, függetlenül a Document API-tól. Ez hasznos egyedi eszközök vagy titkosított PDF-ek kriminalisztikai vizsgálata esetén:
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) # TrueNyers tartalom titkosítása AES-CBC segítségével
Alacsonyabb szintű igények esetén a EncryptionUtils.encrypt_aes_cbc() és a decrypt_aes_cbc() közvetlenül bármely 16, 24 vagy 32 bájtos kulcson dolgozik, anélkül, hogy jelszó alapú kulcsgeneráláson menne keresztül:
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) # TrueTippek és bevált gyakorlatok
- Használja a magas szintű
Document,PageésAnnotationfelületet a mindennapi dokumentumfeldolgozáshoz. Aaspose_pdf.enginecsomag a belső megvalósítás, amelyre ezek az osztályok épülnek — csak akkor nyúlja meg, ha egyedi eszközökre, forenzikus vizsgálatra vagy olyan viselkedésre van szüksége, amelyet a felület nem fed le. - Igazítsa a
revisionargumentumot a célzott biztonsági kezelőhöz: acompute_owner_key_v4/compute_user_key_v4lefedi a 2–4. revíziókat (40- és 128-bites RC4/AES), míg acompute_hash_v5a AES-256 által használt 5/6. revízió algoritmust valósítja meg. A revíziók és kulcshosszak keverése hallgatólagosan hibás kulcsot eredményez. Document.generate_appearancesésAnnotationCollection.generate_appearancesidempotens — hívja őket óvatosan, mielőtt renderelne vagy laposítana egy dokumentumot, amelyet nem saját maga hozott létre.Document.flatten()destruktív: eltávolítja az összes annotációt, amelyet a lap tartalmába rajzol. Fejezze be előbb a többi annotáció szerkesztését, vagy dolgozzon egy másolaton.- Nem minden annotáció alaltípusa rendelkezik beépített megjelenés-szintetizátorral — a
Textés aPopupgyakori példák. Ellenőrizze ahas_appearance-t agenerate_appearance()meghívása után, ahelyett, hogy feltételezné, hogy sikerült.
Gyakori problémák
| Probléma | Oka | Javítás |
|---|---|---|
EncryptionUtils.encrypt_aes_cbc/decrypt_aes_cbc hibát dob: „AES key must be 16, 24, or 32 bytes” | Érvénytelen hosszúságú kulcsot adtak meg | Generálja a kulcsot a(z) os.urandom(16), os.urandom(24) vagy os.urandom(32) segítségével |
EncryptionUtils.verify_password_v4 visszaad None értéket ahelyett, hogy hibát dobna | A megadott jelszó nem egyezik a dokumentum által származtatott U/O értékekkel | Explicit módon ellenőrizze a(z) None meglétét, mielőtt az eredményt átadná a(z) decrypt_aes_cbc-nek |
Annotation.generate_appearance visszatér False | Az annotáció altípusa nem rendelkezik beépített megjelenítő szintetizátorral (például Text vagy Popup) | Adja meg saját appearance_normal bájtjait, vagy fogadja el a megjelenítő alapértelmezett renderelését |
A Document.generate_appearances második hívása visszatér 0 | A hívás idempotens — azok az annotációk, amelyek már rendelkeznek has_appearance == True értékkel, kihagyásra kerülnek | Várható viselkedés, nem hiba |
FAQ
Importálnom kell a aspose_pdf.engine-ból a mindennapi dokumentumfeldolgozáshoz?
Nem. A Document, Page és Annotation osztályok fedik le a szabványos dokumentum-munkafolyamatokat. A motorrétegben valósul meg ezen osztályok viselkedése, és leginkább egyéni eszközökhez vagy a PDF belső szerkezetének közvetlen vizsgálatához hasznos.
Mi a különbség a Annotation.generate_appearance és a AnnotationCollection.generate_appearances között?
Az első egy megjelenítési adatfolyamot szintetizál egyetlen annotációhoz, és visszaad egy bool értéket. A második ugyanezt végzi minden jogosult annotáción egy gyűjteményben (egy oldal annotációi, vagy a Document.generate_appearances segítségével a dokumentum minden oldala), és visszaadja a létrehozott megjelenítések számát.
Miért kapnak a kulcs-származtatási módszerek revision argumentumot?
A PDF szabványos biztonsági kezelője az ISO 32000 revíziók során fejlődött — a 2-es revízió 40 bites RC4-et használ, a 3/4-es revíziók 128 bites RC4-et vagy AES-t támogatnak, és az 5/6-os revíziók (amelyek a AES-256 esetében használatosak) teljesen más hash-algoritmust alkalmaznak (compute_hash_v5). A revision argumentum határozza meg, hogy a EncryptionUtils módszerek melyik származtatást hajtják végre.
Megvizsgálhatok vagy közvetlenül építhetek nyers PDF objektumokat?
Igen. A aspose_pdf.engine.cos közzéteszi a COS objektummodellt — PdfObject, PdfDictionary, PdfArray, PdfStream, PdfName és a kapcsolódó típusok — amelyek a PdfCosWriter és a PdfCosParser segítségével sorosíthatók PDF bájtokra és onnan is értelmezhetők.
Hol történik az oldal-kép renderelés?
Document.render_page visszaad egy RasterizedPage, egy engine-level objektum to_png(), to_tiff() és save() metódusokkal a megjelenített oldal képfájllá alakításához.
API Reference összegzés
| Osztály / Metódus | Leírás |
|---|---|
Annotation.generate_appearance(force) -> bool | Szintetizálja a normál appearance stream-et egy annotációhoz igény szerint |
AnnotationCollection.generate_appearances(force) -> int | Kötegelt módon generálja a appearances-t minden jogosult annotációra egy oldalon |
Document.generate_appearances(force) -> int | Kötegelt módon generálja a appearances-t minden jogosult annotációra a dokumentumban |
Document.flatten() -> Document | Beágyazza az annotation appearances-t az oldal tartalmába, és eltávolítja az annotációkat |
Document.render_page(page_index, dpi, scale, background, antialias) -> RasterizedPage | Rasterizálj egy oldalt a motor renderelési csővezetékén keresztül |
RasterizedPage | Egy renderelt oldal csomagolt RGB formátumban, to_png(), to_tiff() és save() |
GeneratedAppearance | A megjelenés szintézisének belső eredménye: tartalom bájtok és a szükséges ExtGState/font erőforrások |
EncryptionUtils | AES-CBC/RC4 titkosítás és a PDF szabványos biztonsági kezelő kulcs származtatása (Revisions 2–6) |
PdfObject | Absztrakt alaposztály minden COS (Carousel Object Structure) objektum számára |
PdfDictionary / PdfArray / PdfStream | Konkrét COS tárolótípusok, amelyek az alacsony szintű dokumentumfát alkotják |
PdfName / PdfNumber / PdfString / PdfBoolean / PdfNull | Primitív COS értéktípusok |
PdfIndirectReference | Egy COS közvetett hivatkozás (n g R) egy másik objektumra |
PdfCosWriter | Serializál egy memóriában lévő COS PdfDocument PDF bájtokra |
PdfCosParser / LazyPdfObjectStore | PDF bájtokat elemzi COS objektumokká, igény szerint materializálja őket |
IncrementalUpdate / IncrementalWriter | Fűzz hozzá egy inkrementális frissítési szekciót egy meglévő PDF-hez a teljes újraírás helyett |
SimplePdf | A natív-Python alacsony szintű dokumentumábrázolás, amelyre a magas szintű Document API épül |
TextFragmentAbsorber / TextFragmentCollection | Alacsony szintű szövegrészlet-kivonás egy SimplePdf példányon |
ImagePlacementAbsorber / ImagePlacement | Keresse meg, mentse, cserélje vagy rejtse el az oldalon elhelyezett raszteres képeket |
SigningUtils | Önáltal aláírt tanúsítványok és PKCS#7/CAdES aláírások generálása digitális aláíráshoz |
DssMaterial / ChainResult / RevocationResult / TimestampInfo | Aláírás-ellenőrzés támogatása: DSS anyag, tanúsítványlánc eredmények, visszavonási ellenőrzések és az RFC3161 időbélyeg ellenőrzése |
StandardFonts | Mérőszámok és kódolások a 14 PDF Standard betűtípushoz |
CidTextCodec | Kódolja és dekódolja a show-strings-et a kompozit (Type0) betűtípusokhoz |
Shading | RGB szín mintavételezése axialis, radiális és függvényalapú árnyalásokban |
Color / Matrix | Alacsony szintű szín- és 2-D affine-transform primitívek, amelyeket a motor mindenhol használ |