Wstęp
Aspose.PDF FOSS dla Python zawiera podpakiet aspose_pdf.generated z czterema modułami: document.py, forms.py, pdfa.py i security.py. Żaden z nich nie jest ponownie eksportowany z pakietu najwyższego poziomu aspose_pdf, więc każda klasa w tym przewodniku jest importowana przy użyciu pełnej, kropkowej ścieżki — from aspose_pdf.generated.document import Document, a nie from aspose_pdf import Document.
Cztery moduły przyjmują dwa różne podejścia. generated.document, generated.forms i generated.pdfa definiują własne klasy: niezależne implementacje, które odzwierciedlają strukturę głównego pakietu Document, UnsignedContent/UnsignedContentAbsorber oraz PdfAValidateOptions/PdfAValidationResult — przydatne dla kodu napisanego w oparciu o tę lustrzaną strukturę przestrzeni nazw, ale stanowią rzeczywisty, odrębny zestaw klas, a nie aliasy. generated.security natomiast w ogóle nie wprowadza ponownej implementacji: importuje CompromiseCheckResult, SignaturesCompromiseDetector oraz enumy walidacji bezpośrednio z aspose_pdf.security i aspose_pdf.validation i ponownie je eksportuje, więc oba ścieżki importu odwołują się do tego samego obiektu klasy.
Ten przewodnik obejmuje wszystkie cztery i wyraźnie wskazuje, gdzie klasa generated zachowuje się inaczej niż jej odpowiednik w głównym pakiecie o tej samej nazwie — Document i UnsignedContentAbsorber istnieją w dwóch miejscach z dwoma różnymi implementacjami, co jest dokładnie tym rodzajem sytuacji, którą łatwo pomylić przy importowaniu wyłącznie na podstawie nazwy.
Aspose.PDF FOSS dla Python jest pakietem Python, aspose-pdf-foss-for-python, wydanym na licencji MIT, wymagającym Python 3.11 lub nowszego. Jego moduł najwyższego poziomu nosi nazwę aspose_pdf; zobacz sekcję Szybki start poniżej, aby uzyskać informacje o instalacji. Pakiet podstawowy zależy wyłącznie od cryptography i asn1crypto; dodatkowe opcje dodają dekodowanie obrazów oparte na Pillow, obsługę czcionek WOFF2 opartą na Brotli oraz układ tekstu złożonego oparty na HarfBuzz.
Kluczowe funkcje
Implementacja drugiego dokumentu
aspose_pdf.generated.document.Document implementuje ten sam podstawowy cykl życia co główny aspose_pdf.Document — load_from(), save(), encrypt()/decrypt()/change_passwords(), optimize()/optimize_resources(), repair(), flatten() oraz validate()/check() — na tym samym silniku aspose_pdf.engine.simple_pdf.SimplePdf. Odzwierciedla podzbiór głównego Document: nie posiada autorstwa stron w stylu pages.add(), nie ma form/outlines/attachments oraz nie posiada render_page(). Ponieważ nazwa klasy koliduje z Document głównego pakietu, zaimportuj ją pod aliasem, gdy oba są potrzebne w tym samym module.
from aspose_pdf import Document
from aspose_pdf.generated.document import Document as CompatDocument
with Document() as document:
document.pages.add()
document.save("source.pdf")
compat = CompatDocument()
compat.load_from("source.pdf")
print(compat.page_count, compat.is_encrypted)
compat.optimize(compress_images=True)
compat.save("optimized.pdf", overwrite=True)
compat.dispose()
Pakowanie niepodpisanej zawartości
aspose_pdf.generated.forms.UnsignedContentAbsorber i UnsignedContent zapewniają kontener dla niepodpisanych pól formularza, stron i adnotacji. To różni się od poziomu najwyższego aspose_pdf.UnsignedContentAbsorber(document), który przyjmuje rzeczywisty Document i filtruje jego form_fields/annotations pod kątem elementów, których atrybut is_signed/signed jest fałszywy. Wersja generated.forms nie przyjmuje w ogóle dokumentu — extract() po prostu pakuje wszystko, co pages, form_fields i annotations przekażesz jej jako argumenty nazwane, do instancji UnsignedContent, co jest przydatne, gdy niepodpisane elementy zostały już wcześniej zebrane w innym miejscu i potrzebują jedynie wspólnego kontenera oraz jego mutatorów w stylu add_page()/remove_page().
from aspose_pdf.generated.forms import UnsignedContentAbsorber
absorber = UnsignedContentAbsorber()
content = absorber.extract(
form_fields=["signature_field", "initials_field"],
annotations=["review_stamp"],
)
print(absorber.has_extracted(), content.form_fields, content.annotations)
content.add_page("page-1")
absorber.reset()
print(absorber.get_extracted())
PDF/A Opcje walidacji i wyniki
aspose_pdf.generated.pdfa.PdfAValidateOptions zbiera ustawienia walidacji i źródła danych wejściowych; PdfAValidationResult zbiera wynik. PdfAValidateOptions.add_input() sprawdza ścieżkę w postaci łańcucha znaków przy użyciu Path.exists() przed jej zaakceptowaniem i podnosi PdfIOException, jeśli plik jest nieobecny, dzięki czemu wywołujący dowiaduje się o nieprawidłowej ścieżce wejściowej od razu, a nie dopiero w czasie walidacji.
from aspose_pdf import Document
from aspose_pdf.exceptions import PdfIOException
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult
with Document() as document:
document.pages.add()
document.save("candidate.pdf")
options = PdfAValidateOptions()
options.set_option("pdfa_version", "PDF/A-2b")
options.add_input("candidate.pdf")
print(options.get_options(), options.inputs)
try:
options.add_input("missing.pdf")
except PdfIOException as error:
print(f"rejected: {error}")
result = PdfAValidationResult()
result.add_error("Missing /OutputIntent for PDF/A-2b")
print(result.is_valid, result.to_dict())
Ponownie eksportowane typy bezpieczeństwa i walidacji
aspose_pdf.generated.security importuje CompromiseCheckResult i SignaturesCompromiseDetector bezpośrednio z aspose_pdf.security, a CertificationLevel, RevocationStatus, TrustStatus, ValidationMethod, ValidationMode, ValidationOptions, ValidationResult i ValidationStatus z aspose_pdf.validation. W przeciwieństwie do Document i UnsignedContentAbsorber, nie ma tutaj niezależnej ponownej implementacji — oba ścieżki importu zwracają ten sam obiekt.
from aspose_pdf.generated.security import SignaturesCompromiseDetector
from aspose_pdf.security import SignaturesCompromiseDetector as CanonicalDetector
assert SignaturesCompromiseDetector is CanonicalDetector
detector = SignaturesCompromiseDetector(document=None)
result = detector.check()
print(result.compromised, result.reasons)
Szybki start
Zainstaluj pakiet, a następnie utwórz dokument z głównym Document, zapisz go i przetwórz przy użyciu opcji generated.pdfa oraz obiektów wynikowych.
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .from aspose_pdf import Document
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult
with Document() as document:
page = document.pages.add()
page.add_text("PDF/A candidate", x=72, y=740, font_size=20)
document.save("candidate.pdf")
options = PdfAValidateOptions()
options.set_option("pdfa_version", "PDF/A-2b")
options.add_input("candidate.pdf")
result = PdfAValidationResult()
if not options.inputs:
result.add_error("No inputs registered")
print(result.to_dict())
Obsługiwane formaty
| Format | Rozszerzenie | Odczyt | Zapis |
|---|---|---|---|
| Tak | Tak |
Odczyt i zapis PDF jest Aspose.PDF FOSS dla podstawowej funkcji Python. Każda klasa w tym przewodniku — główny Document, lustrzany generated.document.Document oraz pomocnicze PDF/A — działa na wejściu i wyjściu PDF poprzez wspólny silnik SimplePdf; aspose_pdf.generated zmienia, którą klasę importujesz, a nie jaki format pliku jest przetwarzany.
Open Source i licencjonowanie
Aspose.PDF FOSS dla Python jest wydany na licencji MIT: brak ograniczeń użytkowania, brak opłat za uruchomienie oraz brak wymagań rejestracyjnych dla zastosowań komercyjnych i prywatnych. Kod źródłowy jest hostowany pod adresem github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python, a pakiet jest publikowany na PyPI jako aspose-pdf-foss-for-python.