Gestionarea documentelor
Gestionarea documentelor
Clasa Document este punctul de intrare pentru aproape fiecare operație în Aspose.PDF FOSS pentru Python: crearea unui PDF nou, încărcarea unuia existent, editarea paginilor sale și scrierea rezultatului înapoi. Acest ghid parcurge ciclul de viață al documentului, operațiile de colecție de pagini, optimizarea, fluxurile de lucru cu fișiere multiple, criptarea și excepțiile pe care ar trebui să le gestionați.
Ciclul de viață al documentului: Creare, deschidere și salvare
Document() fără argumente creează un document gol, în memorie. Treceți o cale de fișier, bytes brut, sau orice flux binar citibil ca prim argument (sau apelați load_from() explicit) pentru a încărca în schimb un PDF existent. save() acceptă o cale sau un flux binar scriibil, cum ar fi io.BytesIO.
from aspose_pdf import Document
# Create a new, empty document and add a blank page
doc = Document()
doc.pages.add()
doc.save("hello.pdf")
# Re-open it — a path, bytes, or a binary stream all work
reopened = Document("hello.pdf")
print(reopened.page_count) # 1
# ...or load explicitly onto an existing instance
another = Document()
another.load_from("hello.pdf")
reopened.close()
another.dispose()
doc.dispose()save() ridică FileExistsError dacă calea destinație există deja, cu excepția cazului în care furnizați overwrite=True. close() este un alias pentru dispose(); ambele sunt idempotente, așa că apelarea lor de mai multe ori este sigură.
Doar PDF este implementat ca destinație de salvare — aceasta este funcția principală, complet funcțională a bibliotecii. Transmiterea unei valori de export precum SaveFormat.PPTX sau DocFormat.HTML către save() ridică UnsupportedFeatureException în loc să scrie un fișier etichetat greșit, astfel încât un export eșuat este întotdeauna evident, nu silențios.
Gestionarea colecției de pagini
doc.pages este un PageCollection. Suportă len(), iterare și indexare bazată pe zero (doc.pages[0]), plus add(), insert(index, page) și delete(index) pentru editări structurale. Fiecare Page expune index, rect (the MediaBox), și rotation.
from aspose_pdf import Document
doc = Document()
doc.pages.add() # page 0
doc.pages.add() # page 1
doc.pages.insert(1, None) # insert a blank page at index 1
print(doc.page_count) # 3
first_page = doc.pages[0]
print(first_page.rect) # (0, 0, 612, 792)
for page in doc.pages:
print(page.index, page.rotation)
doc.pages.delete(1) # remove the page we inserted
doc.save("pages_demo.pdf", overwrite=True)pages.add(page=None) adaugă o pagină goală atunci când este apelat fără argument. pages.insert() restrânge un indice în afara intervalului la cea mai apropiată poziție validă în loc să genereze o eroare.
Optimizarea și comprimarea documentelor
Document.optimize rulează deduplicarea imaginii/fluxului, colectarea gunoiului pentru obiecte neutilizate și comprimarea fluxului într-un singur apel. Transmite o instanță OptimizationOptions pentru a controla ce tehnici sunt executate; omite-o pentru a utiliza profilul standard de curățare.
from aspose_pdf import Document, OptimizationOptions
doc = Document("large_report.pdf")
options = OptimizationOptions()
options.remove_unused_objects = True
options.link_duplicate_streams = True
options.image_compression_quality = 60
options.subset_fonts = True
doc.optimize(options)
doc.save("large_report_optimized.pdf", overwrite=True)optimize_resources() este un alias pentru optimize(). Dacă vrei doar comprimarea fluxului fără trecerea de curățare structurală, apelează direct doc.compress_streams().
Îmbinarea, despărțirea și editarea fișierelor
Pentru documentele pe care le ai deja deschise, Document.merge() adaugă alte instanțe Document la cea curentă:
from aspose_pdf import Document
base = Document("part1.pdf")
extra = Document("part2.pdf")
base.merge(extra)
base.save("combined.pdf", overwrite=True)Pentru fluxuri de lucru de tip fișier-la-fișier fără a deschide un Document tu însuți, plugin-urile low-code Merger și Splitter primesc un obiect MergeOptions/SplitOptions construit din intrările și ieșirile FileDataSource:
from aspose_pdf import Merger, MergeOptions, Splitter, SplitOptions, FileDataSource
# Merge two files into one
merge_options = MergeOptions()
merge_options.add_input(FileDataSource("part1.pdf"))
merge_options.add_input(FileDataSource("part2.pdf"))
merge_options.add_output(FileDataSource("combined.pdf"))
Merger().process(merge_options)
# Split the result into one file per page
split_options = SplitOptions()
split_options.add_input(FileDataSource("combined.pdf"))
split_options.add_output(FileDataSource("combined_page1.pdf"))
split_options.add_output(FileDataSource("combined_page2.pdf"))
Splitter().process(split_options)PdfFileEditor oferă aceeași familie de operații ca o fațadă care returnează True/False în loc să arunce, ceea ce este convenabil pentru scripturi batch:
from aspose_pdf import PdfFileEditor
with PdfFileEditor() as editor:
ok = editor.concatenate(["part1.pdf", "part2.pdf"], "combined.pdf")
if not ok:
print("concatenate failed:", editor.last_exception)
editor.extract("combined.pdf", "first_page_only.pdf", page_from=1, page_to=1)PdfFileEditor.extract() and .insert() take bazat pe 1 numerele de pagină, spre deosebire PageCollectionare indexare de la 0 — vezi Probleme comune mai jos.
Criptare și securitatea documentului
Document.encrypt(user_password, owner_password=None, permissions=-4) criptează documentul în memorie; decrypt(password) și change_passwords(old, new_user, new_owner=None) inversează sau rotesc parolele. is_encrypted și permissions raportează starea curentă.
from aspose_pdf import Document
from aspose_pdf.exceptions import PdfSecurityException
doc = Document()
doc.pages.add()
doc.encrypt("user-pass", "owner-pass", permissions=-4)
doc.save("secured.pdf", overwrite=True)
try:
Document("secured.pdf", password="wrong-pass")
except PdfSecurityException as exc:
print("could not open:", exc)
reopened = Document("secured.pdf", password="user-pass")
print(reopened.is_encrypted) # True
reopened.decrypt("user-pass")
reopened.save("unsecured.pdf", overwrite=True)Deschiderea unui document criptat fără parolă, sau cu o parolă greșită, aruncă PdfSecurityException — prinde această clasă (din aspose_pdf.exceptions) în loc să presupui că încărcarea reușește întotdeauna.
Metadate, validare și gestionarea excepțiilor
Metadatele documentului sunt stocate în doc.info (un simplu dict[str, str]), iar doc.version / doc.id expun versiunea antetului PDF și identificatorul de fișier din trailer. validate() (alias check()) raportează integritatea structurală; repair() încearcă să repare probleme comune, cum ar fi o listă de pagini lipsă sau un MediaBox în afara intervalului.
from aspose_pdf import Document, PdfLoadLimits
from aspose_pdf.exceptions import AsposePdfException, PdfIOException
doc = Document()
doc.pages.add()
doc.info["Title"] = "Quarterly Report"
doc.info["Author"] = "Reporting Bot"
doc.save("report.pdf", overwrite=True)
# Load untrusted input under an explicit resource-limit policy
safe_limits = PdfLoadLimits(max_input_bytes=50 * 1024 * 1024, max_pages=1000)
try:
untrusted = Document("incoming.pdf", limits=safe_limits)
if not untrusted.validate():
untrusted.repair()
except (AsposePdfException, PdfIOException) as exc:
print("failed to process incoming.pdf:", exc)PdfLoadLimits limitează memoria și numărul de obiecte pentru fișiere neîncredere; apelează PdfLoadLimits.unlimited() pentru a dezactiva toate limitele când ai încredere deplină în sursă. AsposePdfException este clasa de bază pentru întreaga ierarhie de excepții (inclusiv PdfIOException și PdfSecurityException), astfel încât un singur except AsposePdfException prinde orice eroare ridicată de bibliotecă.
Sfaturi și cele mai bune practici
- Apelă întotdeauna
dispose()(sauclose()) pe unDocumentcând ai terminat cu el, sau folosește-l ca o variabilă locală cu durată scurtă — motorul păstrează conținutul paginilor decodate și imaginile în memorie până la eliminare. - Transmite
overwrite=Truecătresave()când rescrii o cale pe care ai creat-o deja în aceeași execuție; valoarea implicită esteFalseși ridicăFileExistsError. - Preferă
doc.optimize()înainte de a livra un PDF generat — este un apel unic care elimină obiectele neutilizate și comprimă fluxurile și, de obicei, reduce dimensiunea rezultatului vizibil. - Setează explicit o politică
PdfLoadLimitsori de câte ori încarci PDF-uri dintr-o sursă neîncredere (încărcări, atașamente de email, extrageri web); valorile implicite sunt generoase, dar limitate, nu constituie o limită de securitate pe care să te bazezi orbește. - Prinde
AsposePdfException(sau o subclasă specifică, cum ar fiPdfSecurityException) în jurul apelurilor de încărcare/salvare în loc deExceptionsimplu — este baza comună pentru fiecare eroare pe care o ridică biblioteca.
Probleme comune
| Problemă | Cauză | Remediere |
|---|---|---|
FileExistsError pe save() | Calea destinație există deja și overwrite a rămas la valoarea implicită False | Transmite save(path, overwrite=True) |
UnsupportedFeatureException pe save() | A fost solicitat un save_format non-PDF (de ex. SaveFormat.PPTX, DocFormat.HTML) | Salvează ca PDF — orice altă valoare SaveFormat/DocFormat generează UnsupportedFeatureException în loc să scrie ieșirea |
PdfSecurityException: Password required for encrypted document | S-a deschis un PDF criptat fără un argument password | Transmite Document(path, password="...") sau apelează load_from(path, password="...") |
Numere de pagină off-by-one între PageCollection și PdfFileEditor | doc.pages[i] este indexat de la 0; argumentele de pagină PdfFileEditor.extract()/.insert() sunt indexate de la 1 | Adaugă sau scade 1 când convertești între cele două API-uri |
IndexError: Page index out of range. din pages.delete() | Indicele transmis către delete() nu există în colecție | Verifică doc.page_count (sau len(doc.pages)) înainte de a șterge |
FAQ
Trebuie să am o licență pentru a folosi Aspose.PDF FOSS pentru Python?
Nu. Aceasta este ediția open-source (licențiată sub MIT); nu există niciun fișier de licență sau pas de activare de configurat.
Pot exporta un Document în formate altele decât PDF?
Nu în această versiune. save() implementează doar ieșire PDF — furnizarea unei alte valori SaveFormat/DocFormat declanșează UnsupportedFeatureException în loc să producă un fișier etichetat greșit.
Care este diferența dintre Document.merge() și pluginul Merger?
Document.merge() combină instanțele Document pe care le ai deja deschise în memorie. Merger (cu MergeOptions și FileDataSource) este un înveliș de conveniență file-to-file care deschide, îmbină și salvează pentru tine într-un singur apel — util pentru scripturi batch simple care nu au nevoie niciodată de obiectul intermediar Document.
De ce pages.insert() nu aruncă niciodată o excepție pentru un index în afara intervalului?
PageCollection.insert() limitează indexul la intervalul valid (valorile negative devin 0, valorile care depășesc sfârșitul devin len(doc.pages)) în loc să arunce, astfel încât o inserare nu eșuează niciodată doar din cauza valorii indexului.
Cum pot încărca în siguranță un PDF dintr-o sursă neîncredere?
Construiți un PdfLoadLimits cu limite explicite (max_input_bytes, max_pages, max_objects și așa mai departe) și transmiteți-l ca argument limits= pentru Document(...) sau load_from(). Fiecare câmp are deja o valoare finită implicită, dar restricționarea acestora la dimensiunea de intrare așteptată reduce resursele pe care un fișier defect le poate consuma.
API Reference Rezumat
| Clasă / Metodă | Descriere: |
|---|---|
Document() / Document.load_from | Creează un document gol sau încarcă unul dintr-o cale, din octeți sau dintr-un flux binar |
Document.save | Scrie documentul într-o cale sau într-un flux scriibil (numai PDF) |
Document.dispose() / Document.close() | Eliberează resursele motorului; idempotent |
Document.pages | PageCollection al documentului |
Document.info | Metadatele documentului ca un dict[str, str] |
Document.optimize / Document.optimize_resources / Document.compress_streams() | Eliminați resursele neutilizate și comprimați fluxurile |
Document.merge() | Adăugați alte instanțe Document la aceasta |
Document.encrypt / Document.decrypt / Document.change_passwords | Aplicați, eliminați sau rotiți parolele documentului |
Document.validate() / Document.check() / Document.repair() | Verifică și încearcă să repari integritatea structurală |
PageCollection.add() / .insert() / .delete() / .item() | Editări structurale ale colecției de pagini (bazat pe 0) |
Page.rect / Page.rotation / Page.index | Geometrie și poziție pe pagină |
OptimizationOptions | Steaguri granulare consumate de Document.optimize |
MergeOptions / Merger | Plugin de îmbinare fișier-la-fișier |
SplitOptions / Splitter | Plugin de împărțire fișier-la-fișier, o pagină pe ieșire |
FileDataSource | Intrare/ieșire bazată pe fișiere pentru API-urile pluginului |
PdfFileEditor | Fațadă pentru concatenate(), extract(), insert(), delete(), append() (pagini numerotate de la 1) |
PdfLoadLimits | Politică imutabilă de limitare a resurselor pentru intrare nesigură |
AsposePdfException | Clasă de bază pentru fiecare excepție ridicată de bibliotecă |
PdfSecurityException | Ridicată pentru parole lipsă/incorecte și erori de permisiune |
PdfIOException | Ridicată pentru erori I/O în timpul procesării PDF |
Vezi și:
- API Reference: Documentație completă a clasei și a metodelor pentru
aspose_pdf - Bază de cunoștințe: Ghiduri practice orientate pe sarcini
- Prezentare generală a produsului: Rezumat al caracteristicilor și capabilităților
- Începeți / Instalare: instalare și configurare
- Aspose.PDF for Python — Enterprise Documentation