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, PdfAValidationResultKrok 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.