Vnitřní fungování PDF zpracování
Interní fungování PDF zpracovatelského engine
Třídy Document, Page a Annotation, které používáte pro každodenní zpracování PDF, jsou fasádou nad nižší úrovní balíčku aspose_pdf.engine. Engine implementuje skutečnou PDF mechaniku: model objektů COS (Carousel Object Structure), ze kterého je postavena každá PDF soubor, parser a writer, kteří převádějí mezi objekty COS a PDF byty, syntézu vzhledu anotací, rasterizaci stránek, interní fungování fontových a obrazových kodeků a kryptografické primitivy stojící za šifrováním dokumentu a digitálními podpisy. Většina aplikací nikdy nemusí importovat přímo z aspose_pdf.engine— ale je to správné místo, kam se podívat, když potřebujete vlastní nástroje, forenzní PDF inspekci nebo chování, které high-level API neodhaluje.
Generování vzhledu pro jedinou anotaci
Interaktivní anotace jako čtverce, kruhy a razítka automaticky nenesou normální stream vzhledu (/AP /N). Volání Annotation.generate_appearance spustí interní syntézu vzhledu engine, aby na požádání vytvořilo takový stream z vlastností anotace.
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 operatorDávkové generování vzhledů napříč stránkami a dokumenty
AnnotationCollection.generate_appearances syntetizuje vzhledy pro každou způsobilou anotaci na stránce v jednom volání, přičemž přeskočí podtypy, které engine neví, jak vykreslit (například 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 dělá to samé napříč všemi stránkami v dokumentu a je idempotentní— druhé volání je nečinné, pokud již vzhledy existují:
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-opZploštění anotací do statického obsahu stránky
Document.flatten() vykresluje vzhled každé anotace přímo do proudu obsahu stránky (jako volání Do XObject) a následně odstraní samotný objekt anotace, takže stránka se vykresluje identicky v prohlížečích, které anotace zcela ignorují:
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()Po tomto volání je proud obsahu stránky delší než předtím (obsahuje nyní vložený čtverec) a doc.pages[0].annotations již neobsahuje zploštěnou anotaci.
Odvozování šifrovacích klíčů založených na hesle (revize 4 / AES-128)
EncryptionUtils implementuje odvození klíče a primitivy AES-CBC bezpečnostního manipulátoru PDF standardu přímo, nezávisle na Document API. To je užitečné pro vlastní nástroje nebo forenzní kontrolu šifrovaných 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Šifrování surového obsahu pomocí AES-CBC
Pro nízkoúrovňové potřeby EncryptionUtils.encrypt_aes_cbc() a decrypt_aes_cbc() pracují přímo s libovolným 16-, 24- nebo 32-bajtovým klíčem, aniž by procházely odvozením klíče založeným na hesle:
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) # TrueTipy a osvědčené postupy
- Upřednostněte vysokou úroveň
Document,PageaAnnotationfasády pro každodenní zpracování dokumentů. Balíčekaspose_pdf.engineje vnitřní implementací, na které jsou tyto třídy postaveny — sáhněte po něm jen když potřebujete vlastní nástroje, forenzní kontrolu nebo chování, které fasáda neodhaluje. - Přiřaďte argument
revisionk bezpečnostnímu handleru, na který cílíte:compute_owner_key_v4/compute_user_key_v4pokrývají revize 2–4 (40- a 128-bitové RC4/AES), zatímcocompute_hash_v5implementuje algoritmus revize 5/6 používaný AES-256. Míchání revizí a délek klíčů tiše vede k nesprávnému klíči. Document.generate_appearancesaAnnotationCollection.generate_appearancesjsou idempotentní — volajte je obezřetně před renderováním nebo zploštěním dokumentu, který jste nevytvořili sami.Document.flatten()je destruktivní: odstraňuje každou anotaci, kterou vloží do obsahu stránky. Dokončete nejprve jakoukoli jinou úpravu anotací, nebo pracujte s kopií.- Ne každá podtyp anotace má vestavěný syntetizér vzhledu —
TextaPopupjsou běžné příklady. Zkontrolujtehas_appearancepo volánígenerate_appearance()místo předpokladu, že operace uspěla.
Běžné problémy
| Problém | Příčina | Oprava |
|---|---|---|
EncryptionUtils.encrypt_aes_cbc/decrypt_aes_cbc vyvolá chybu “AES key must be 16, 24, or 32 bytes” | Byl zadán klíč neplatné délky | Vygenerujte klíč pomocí os.urandom(16), os.urandom(24) nebo os.urandom(32) |
EncryptionUtils.verify_password_v4 vrací None místo vyvolání | Zadané heslo neodpovídá odvozeným hodnotám U/O dokumentu | Explicitně zkontrolujte None před předáním výsledku do decrypt_aes_cbc |
Annotation.generate_appearance vrací False | Podtyp anotace nemá vestavěný syntetizér vzhledu (například Text nebo Popup) | Poskytněte své vlastní appearance_normal bajty, nebo použijte výchozí vykreslení prohlížeče |
Druhé volání Document.generate_appearances vrací 0 | Volání je idempotentní — anotace, které již mají has_appearance == True, jsou přeskočeny | Očekávané chování, ne chyba |
FAQ
Potřebuji importovat z aspose_pdf.engine pro každodenní zpracování dokumentů?
Ne. Třídy Document, Page a Annotation pokrývají standardní pracovní postupy dokumentů. Vrstva enginu je místem, kde je chování těchto tříd implementováno, a je nejvíce užitečná pro vlastní nástroje nebo přímou inspekci vnitřností PDF.
Jaký je rozdíl mezi Annotation.generate_appearance a AnnotationCollection.generate_appearances?
První vytvoří stream vzhledu pro jedinou anotaci a vrátí bool. Druhý provede totéž pro každou oprávněnou anotaci ve sbírce (anotace stránky nebo, pomocí Document.generate_appearances, každou stránku v dokumentu) a vrátí počet vytvořených vzhledů.
Proč metody odvození klíče přijímají argument revision?
Standardní bezpečnostní handler PDF se vyvíjel napříč revizemi ISO32000—Revize2 používá 40-bitový RC4, Revize3/4 podporují 128-bitový RC4 nebo AES a Revize5/6 (použité pro AES-256) používají zcela jiný hashovací algoritmus (compute_hash_v5). Argument revision vybírá, kterou odvození provádějí metody EncryptionUtils.
Mohu přímo inspektovat nebo vytvářet surové PDF objekty?
Ano. aspose_pdf.engine.cos zpřístupňuje model COS objektů—PdfObject, PdfDictionary, PdfArray, PdfStream, PdfName a související typy—které PdfCosWriter a PdfCosParser serializují do PDF bajtů a parsují z nich.
Kde se provádí vykreslování stránky na obrázek?
Document.render_page vrací RasterizedPage, objekt na úrovni engine s metodami to_png(), to_tiff() a save() pro převod vykreslené stránky na soubor s obrázkem.
API Reference Shrnutí
| Třída / Metoda | Popis: |
|---|---|
Annotation.generate_appearance(force) -> bool | Syntetizujte normální stream vzhledu pro jednu anotaci na vyžádání |
AnnotationCollection.generate_appearances(force) -> int | Hromadně generovat vzhledy pro každou oprávněnou anotaci na stránce |
Document.generate_appearances(force) -> int | Hromadně generovat vzhledy pro každou oprávněnou anotaci v dokumentu |
Document.flatten() -> Document | Vložit vzhledy anotací do obsahu stránky a odstranit anotace |
Document.render_page(page_index, dpi, scale, background, antialias) -> RasterizedPage | Rasterizovat stránku pomocí renderovacího pipeline enginu |
RasterizedPage | Vykreslená stránka v zabaleném formátu RGB s to_png(), to_tiff() a save() |
GeneratedAppearance | Interní výsledek syntézy vzhledu: bajty obsahu plus jakékoli požadované ExtGState/fontové zdroje |
EncryptionUtils | AES-CBC/RC4 šifrování a odvození klíče PDF standard-security-handler (Revize 2–6) |
PdfObject | Abstraktní základní třída pro každý objekt COS (Carousel Object Structure) |
PdfDictionary / PdfArray / PdfStream | Konkrétní typy kontejnerů COS, které tvoří strom nízkoúrovňového dokumentu |
PdfName / PdfNumber / PdfString / PdfBoolean / PdfNull | Primitivní typy hodnot COS |
PdfIndirectReference | Nepřímý odkaz COS (n g R) na jiný objekt |
PdfCosWriter | Serializuje v paměti COS PdfDocument do PDF bajtů |
PdfCosParser / LazyPdfObjectStore | Parsuje PDF bajty do objektů COS, materializuje je na vyžádání |
IncrementalUpdate / IncrementalWriter | Přidejte sekci inkrementální aktualizace do existujícího PDF místo jeho přepsání |
SimplePdf | Nativní-Python nízkoúrovňová reprezentace dokumentu, na které je postavena vysoceúrovňová Document API |
TextFragmentAbsorber / TextFragmentCollection | Nízkourovňová extrakce textových fragmentů u instance SimplePdf |
ImagePlacementAbsorber / ImagePlacement | Najděte, uložte, nahraďte nebo skryjte rastrové obrázky umístěné na stránce |
SigningUtils | Vygenerujte samopodepsané certifikáty a podpisy PKCS#7/CAdES pro digitální podepisování |
DssMaterial / ChainResult / RevocationResult / TimestampInfo | Podpora ověřování podpisu: DSS materiál, výsledky řetězce certifikátů, kontroly revokace a ověření časových razítek RFC 3161 |
StandardFonts | Metriky a kódování pro 14 standardních fontů PDF |
CidTextCodec | Kódovat a dekódovat řetězce zobrazení pro kompozitní (Type0) fonty |
Shading | Ukázková RGB barva napříč axiálními, radiálními a funkčně založenými stínováními |
Color / Matrix | Nízkoúrovňové primitivy pro barvu a 2-D afinní transformace používané v celém enginu |