Jak tworzyć dokumenty przy użyciu wygenerowanego modułu zgodności w Python

Jak tworzyć dokumenty przy użyciu wygenerowanego modułu zgodności w Python

Aspose.PDF FOSS dla Python dostarcza podpakiet kompatybilności generated (aspose_pdf.generated), który odzwierciedla stabilny podzbiór głównego interfejsu API — klasę Document z podstawowymi operacjami cyklu życia, plus UnsignedContent/UnsignedContentAbsorber oraz PdfAValidateOptions/PdfAValidationResult. Istnieje dla wywołujących, którzy potrzebują tego węższego interfejsu wyraźnie, zamiast pełnoprawnych klas najwyższego poziomu, a jego klasy nie są importowane automatycznie przez import aspose_pdf — importujesz je bezpośrednio z aspose_pdf.generated.*. Pakiet jest czystym Python i jest instalowany poleceniem poniżej.

Przewodnik krok po kroku

Krok 1: Zainstaluj pakiet

Zainstaluj pakiet FOSS Aspose.PDF:

git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .

Zweryfikuj instalację, importując wygenerowany Document i wypisując komunikat potwierdzający:

import aspose_pdf
from aspose_pdf.generated.document import Document
print("aspose-pdf-foss-for-python is ready.")

Krok 2: Zaimportuj wymagane klasy

Klasy kompatybilności generated znajdują się w aspose_pdf.generated.document, aspose_pdf.generated.forms i aspose_pdf.generated.pdfa — zaimportuj je wyraźnie przez podmoduł:

import aspose_pdf
from aspose_pdf.generated.document import Document
from aspose_pdf.generated.forms import UnsignedContent, UnsignedContentAbsorber
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult

Krok 3: Utwórz i załaduj dokument

Document(source) ładuje się od razu, gdy podane jest źródło; wywołanie Document() bez argumentu tworzy pustą instancję, którą możesz później załadować przy pomocy load_from. Oba akceptują ścieżkę do pliku, bytes lub strumień binarny:

from aspose_pdf.generated.document import Document

document = Document("report.pdf")
print(f"Loaded {len(document.pages)} page(s)")

empty_doc = Document()
empty_doc.load_from("report.pdf")

Krok 7: Wyodrębnij niepodpisaną zawartość formularza

UnsignedContentAbsorber wyodrębnia strony, pola formularza i adnotacje, które nie były częścią podpisu cyfrowego. Wywołaj extract(), aby uruchomić wyodrębnianie, has_extracted(), aby sprawdzić, czy zostało wykonane, oraz get_extracted(), aby ponownie pobrać wynik bez ponownego wyodrębniania:

from aspose_pdf.generated.forms import UnsignedContentAbsorber

absorber = UnsignedContentAbsorber()
unsigned = absorber.extract()
print(f"Unsigned pages: {len(unsigned.pages)}")
print(f"Unsigned form fields: {len(unsigned.form_fields)}")

if absorber.has_extracted():
    same_result = absorber.get_extracted()

Krok 8: Ręcznie zbuduj kontener UnsignedContent

UnsignedContent jest również prostym kontenerem, który możesz samodzielnie wypełnić przy pomocy add_page, add_form_field i add_annotation — każdy ma odpowiadającą metodę remove_*, a reset() czyści wszystkie trzy kolekcje jednocześnie:

from aspose_pdf.generated.forms import UnsignedContent

content = UnsignedContent()
content.add_page("page-1")
content.add_annotation("signature-placeholder")
print(content)  # UnsignedContent(pages=1, form_fields=0, annotations=1)

content.remove_annotation("signature-placeholder")
content.reset()

Krok 9: Skonfiguruj i uruchom walidację PDF/A

PdfAValidateOptions zbiera wejścia i ustawienia dla uruchomienia walidacji. add_input(source) rejestruje wejście, set_option(key, value) przechowuje nazwioną opcję, a get_options() zwraca kopię przechowywanych opcji. PdfAValidationResult zawiera wynik — add_error(message) oznacza wynik jako nieprawidłowy i dodaje go do errors, a to_dict() renderuje is_valid i errors jako zwykły słownik:

from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult

options = PdfAValidateOptions()
options.add_input("report.pdf")
options.set_option("pdfa_version", "1b")
print(options.get_options())

result = PdfAValidationResult()
result.add_error("Font 'Arial' is not embedded")
print(result.is_valid)   # False
print(result.to_dict())

Typowe problemy i rozwiązania

ImportError or AttributeError przy dostępie aspose_pdf.generated

Podpakiet generated nie jest ponownie eksportowany przez import aspose_pdf — importuj każdą klasę z jej konkretnego podmodułu, na przykład from aspose_pdf.generated.document import Document, zamiast oczekiwać, że aspose_pdf.generated.Document będzie działać po zwykłym import aspose_pdf.

Mieszanie wygenerowanego Document z głównym aspose_pdf.Document

aspose_pdf.Document (klasa najwyższego poziomu ponownie eksportowana przez import aspose_pdf) ma większy interfejs — dodaje metody takie jak validate_pdfa, iter_pages i redact_text, których aspose_pdf.generated.document.Document nie implementuje. Jeśli metoda brakuje w wygenerowanym Document, sprawdź, czy nie należy ona do klasy najwyższego poziomu Document.

save() raises AsposePdfException: Cannot save a disposed document

close()/dispose() zwalnia wewnętrzny stan dokumentu na stałe — usunięty Document nie może być zapisany, zoptymalizowany ani naprawiony. Wykonaj wszystkie pozostałe operacje przed wywołaniem close(), albo przeładuj ze źródła przy użyciu nowego wywołania Document(...).

change_passwords raises PdfSecurityException: Document is not encrypted

change_passwords zmienia hasło tylko w dokumencie, który jest już zaszyfrowany. Najpierw wywołaj encrypt(password), albo sprawdź document.is_encrypted przed próbą zmiany hasła.

PdfAValidationResult.add_error raises TypeError

add_error wymaga argumentu str. Przekonwertuj obiekty wyjątków lub inne szczegóły błędu na łańcuch znaków (str(error)) przed przekazaniem ich do add_error.

Najczęściej zadawane pytania

Dlaczego aspose_pdf.generated istnieje obok głównego aspose_pdf.Document?

Odwzorowuje węższy, stabilny podzbiór Aspose.PDF API dla kodu napisanego w oparciu o tę zredukowaną powierzchnię. Nowy kod, który nie wymaga tego podzbioru kompatybilności, powinien zazwyczaj używać poziomu najwyższego aspose_pdf.Document, który obsługuje więcej operacji (PDF/A konwersja, iteracja stron, redakcja tekstu i inne).

Czy UnsignedContentAbsorber.extract() przyjmuje Document do skanowania?

extract() przyjmuje argumenty pozycyjne i nazwane, które są używane do wypełnienia zwracanych kolekcji pages, form_fields i annotations obiektu UnsignedContent — przekaż kolekcje, które chcesz uwzględnić jako argumenty nazwane (pages=, form_fields=, annotations=).

Co się stanie, jeśli wywołam reset() na UnsignedContentAbsorber przed wyodrębnieniem czegokolwiek?

Czyści wszelkie wcześniej wyodrębnione wyniki. Następnie get_extracted() zwraca None, a has_extracted() zwraca False aż extract() zostanie wywołane ponownie.

Czy PdfAValidateOptions.add_input może być wywołane więcej niż raz?

Tak — każde wywołanie dodaje kolejny wpis do listy inputs i zwraca self, więc wywołania mogą być łańcuchowane: options.add_input("a.pdf").add_input("b.pdf").

Czy close() różni się od dispose() w wygenerowanym Document?

Nie — close() jest bezpośrednim aliasem, który wywołuje dispose() z tymi samymi argumentami; każda z nazw zwalnia zasoby dokumentu.

Zobacz także

 Polski