Πώς να δημιουργήσετε έγγραφα με την παραγόμενη μονάδα συμβατότητας στο Python
Aspose.PDF FOSS για Python παρέχει ένα υποπακέτο συμβατότητας generated (aspose_pdf.generated) που αντικατοπτρίζει ένα σταθερό υποσύνολο της κύριας επιφάνειας API — μια κλάση Document με τις βασικές λειτουργίες κύκλου ζωής, καθώς και UnsignedContent/UnsignedContentAbsorber και PdfAValidateOptions/PdfAValidationResult. Υπάρχει για κλήσεις που θέλουν αυτήν την πιο στενή επιφάνεια ρητά αντί για τις πλήρεις κλάσεις επιπέδου κορυφής, και οι κλάσεις του δεν εισάγονται αυτόματα από το import aspose_pdf — τις εισάγετε απευθείας από το aspose_pdf.generated.*. Το πακέτο είναι καθαρό Python και εγκαθίσταται με την παρακάτω εντολή.
Οδηγός βήμα-βήμα
Βήμα 1: Εγκατάσταση του πακέτου
Εγκαταστήστε το πακέτο Aspose.PDF FOSS:
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .Επιβεβαιώστε την εγκατάσταση εισάγοντας το παραγόμενο Document και εκτυπώνοντας ένα μήνυμα επιβεβαίωσης:
import aspose_pdf
from aspose_pdf.generated.document import Document
print("aspose-pdf-foss-for-python is ready.")Βήμα 2: Εισαγωγή Απαιτούμενων Κλάσεων
Οι κλάσεις συμβατότητας generated βρίσκονται στα aspose_pdf.generated.document, aspose_pdf.generated.forms και aspose_pdf.generated.pdfa — εισάγετε τις ρητά ανά υπομονάδα:
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Βήμα 3: Δημιουργία και Φόρτωση Εγγράφου
Document(source) φορτώνεται αμέσως όταν παρέχεται μια πηγή· η κλήση του Document() χωρίς όρισμα δημιουργεί μια κενή παρουσία που μπορείτε να φορτώσετε αργότερα με το load_from. Και τα δύο δέχονται διαδρομή αρχείου, bytes, ή δυαδική ροή:
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")Βήμα 7: Εξαγωγή Περιεχομένου Μη Υπογεγραμμένης Φόρμας
UnsignedContentAbsorber εξάγει τις σελίδες, τα πεδία φόρμας και τις σημειώσεις που δεν αποτελούν μέρος ψηφιακής υπογραφής. Καλέστε το extract() για να εκτελέσετε την εξαγωγή, το has_extracted() για να ελέγξετε αν έχει εκτελεστεί, και το get_extracted() για να ανακτήσετε ξανά το αποτέλεσμα χωρίς νέα εξαγωγή:
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()Βήμα 8: Δημιουργία ενός UnsignedContent Container με το χέρι
UnsignedContent είναι επίσης ένα απλό container που μπορείτε να γεμίσετε μόνοι σας με add_page, add_form_field και add_annotation — το καθένα έχει μια αντίστοιχη μέθοδο remove_*, και το reset() εκκαθαρίζει και τις τρεις συλλογές ταυτόχρονα:
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()Βήμα 9: Διαμορφώστε και Εκτελέστε την Επικύρωση PDF/A
PdfAValidateOptions συλλέγει τις εισόδους και τις ρυθμίσεις για μια εκτέλεση επικύρωσης. add_input(source) καταχωρεί μια είσοδο, set_option(key, value) αποθηκεύει μια ονομαστική επιλογή, και get_options() επιστρέφει ένα αντίγραφο των αποθηκευμένων επιλογών. PdfAValidationResult κρατά το αποτέλεσμα — add_error(message) σηματοδοτεί το αποτέλεσμα ως μη έγκυρο και προσθέτει στο errors, και to_dict() αποδίδει τα is_valid και errors ως απλό λεξικό:
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())Κοινά Προβλήματα και Διορθώσεις
ImportError or AttributeError κατά την πρόσβαση aspose_pdf.generated
Το υποπακέτο generated δεν εξάγεται ξανά από το import aspose_pdf — εισάγετε κάθε κλάση από το συγκεκριμένο υπο-μονάδα της, για παράδειγμα from aspose_pdf.generated.document import Document, αντί να περιμένετε το aspose_pdf.generated.Document να λειτουργήσει μετά από ένα απλό import aspose_pdf.
Συγχέοντας το παραγόμενο Document με το κύριο aspose_pdf.Document
aspose_pdf.Document (η κλάση ανώτερου επιπέδου που εξάγεται ξανά από το import aspose_pdf) έχει μεγαλύτερη επιφάνεια — προσθέτει μεθόδους όπως validate_pdfa, iter_pages και redact_text που το aspose_pdf.generated.document.Document δεν υλοποιεί. Αν λείπει μια μέθοδος στο δημιουργημένο Document, ελέγξτε αν ανήκει στην κλάση ανώτερου επιπέδου Document αντί για αυτή.
save() raises AsposePdfException: Cannot save a disposed document
close()/dispose() απελευθερώνει την εσωτερική κατάσταση του εγγράφου μόνιμα — ένα απορριπτόμενο Document δεν μπορεί να αποθηκευτεί, βελτιστοποιηθεί ή επισκευαστεί αργότερα. Εκτελέστε όλες τις υπόλοιπες λειτουργίες πριν καλέσετε το close(), ή φορτώστε ξανά από την πηγή με μια νέα κλήση Document(...).
change_passwords raises PdfSecurityException: Document is not encrypted
change_passwords μόνο περιστρέφει έναν κωδικό σε ένα έγγραφο που είναι ήδη κρυπτογραφημένο. Καλείστε πρώτα το encrypt(password), ή ελέγξτε το document.is_encrypted πριν προσπαθήσετε να αλλάξετε τον κωδικό.
PdfAValidationResult.add_error raises TypeError
add_error απαιτεί ένα επιχείρημα str. Μετατρέψτε τα αντικείμενα εξαίρεσης ή άλλα στοιχεία σφάλματος σε συμβολοσειρά (str(error)) πριν τα περάσετε στο add_error.
Συχνές Ερωτήσεις
Γιατί υπάρχει το aspose_pdf.generated παράλληλα με το κύριο aspose_pdf.Document;
Αντιγράφει ένα πιο στενό, σταθερό υποσύνολο του Aspose.PDF API για κώδικα που γράφεται ενάντια σε αυτήν τη μειωμένη επιφάνεια. Νέος κώδικας που δεν χρειάζεται ειδικά αυτό το υποσύνολο συμβατότητας θα πρέπει γενικά να χρησιμοποιεί το ανώτερο aspose_pdf.Document, το οποίο υποστηρίζει περισσότερες λειτουργίες (PDF/A μετατροπή, επανάληψη σελίδων, διαγραφή κειμένου και άλλα).
Το UnsignedContentAbsorber.extract() δέχεται ένα Document για σάρωση;
extract() δέχεται επιχειρήματα θέσης και ονομαστικά που χρησιμοποιούνται για τη συμπλήρωση των συλλογών pages, form_fields και annotations του επιστρεφόμενου UnsignedContent — περάστε τις συλλογές που θέλετε να αντιπροσωπευτούν ως ονομαστικά επιχειρήματα (pages=, form_fields=, annotations=).
Τι συμβαίνει αν καλέσω το reset() στο UnsignedContentAbsorber πριν εξάγω οτιδήποτε;
Καθαρίζει οποιοδήποτε προηγούμενο εξαγόμενο αποτέλεσμα. Το get_extracted() στη συνέχεια επιστρέφει το None και το has_extracted() επιστρέφει το False μέχρι να κληθεί ξανά το extract().
Μπορεί το PdfAValidateOptions.add_input να κληθεί περισσότερες από μία φορές;
Ναι — κάθε κλήση προσθέτει μια άλλη καταχώρηση στη λίστα inputs και επιστρέφει το self, έτσι οι κλήσεις μπορούν να αλυσοδεθούν: options.add_input("a.pdf").add_input("b.pdf").
Διαφέρει το close() από το dispose() στο παραγόμενο Document;
Όχι — close() είναι άμεσο ψευδώνυμο που καλεί το dispose() με τα ίδια επιχειρήματα· ή το όνομα απελευθερώνει τους πόρους του εγγράφου.