Cách tạo tài liệu với mô-đun tương thích được tạo ra trong Python
Aspose.PDF FOSS cho Python cung cấp một gói phụ tương thích generated (aspose_pdf.generated) sao chép một tập hợp ổn định của bề mặt API chính — một lớp Document với các hoạt động vòng đời cốt lõi, cộng thêm UnsignedContent/UnsignedContentAbsorber và PdfAValidateOptions/PdfAValidationResult. Nó tồn tại cho những người gọi muốn bề mặt hẹp hơn này một cách rõ ràng thay vì các lớp cấp cao đầy tính năng, và các lớp của nó không được nhập tự động bởi import aspose_pdf — bạn nhập chúng trực tiếp từ aspose_pdf.generated.*. Gói này thuần Python và được cài đặt bằng lệnh dưới đây.
Hướng dẫn từng bước
Bước 1: Cài đặt gói
Cài đặt gói 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 .Xác minh việc cài đặt bằng cách nhập Document đã tạo và in ra thông báo xác nhận:
import aspose_pdf
from aspose_pdf.generated.document import Document
print("aspose-pdf-foss-for-python is ready.")Bước 2: Nhập các lớp cần thiết
Các lớp tương thích generated nằm trong aspose_pdf.generated.document, aspose_pdf.generated.forms và aspose_pdf.generated.pdfa — hãy nhập chúng một cách rõ ràng theo submodule:
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, PdfAValidationResultBước 3: Tạo và tải tài liệu
Document(source) tải ngay khi có nguồn được cung cấp; gọi Document() mà không truyền đối số sẽ tạo một thể hiện rỗng mà bạn có thể tải sau này bằng load_from. Cả hai đều chấp nhận đường dẫn tệp, bytes, hoặc luồng nhị phân:
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")Bước 7: Trích xuất nội dung biểu mẫu chưa ký
UnsignedContentAbsorber trích xuất các trang, trường biểu mẫu và chú thích mà không thuộc một chữ ký số. Gọi extract() để thực hiện việc trích xuất, has_extracted() để kiểm tra xem nó đã chạy chưa, và get_extracted() để lấy lại kết quả mà không cần trích xuất lại:
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()Bước 8: Tự xây dựng một container UnsignedContent một cách thủ công
UnsignedContent cũng là một container đơn giản mà bạn có thể tự điền bằng add_page, add_form_field và add_annotation — mỗi cái có một phương thức remove_* tương ứng, và reset() sẽ xóa cả ba bộ sưu tập cùng một lúc:
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()Bước 9: Cấu hình và chạy PDF/A Validation
PdfAValidateOptions thu thập các đầu vào và cài đặt cho một lần chạy xác thực. add_input(source) đăng ký một đầu vào, set_option(key, value) lưu một tùy chọn có tên, và get_options() trả về một bản sao của các tùy chọn đã lưu. PdfAValidationResult giữ kết quả — add_error(message) đánh dấu kết quả là không hợp lệ và thêm vào errors, và to_dict() hiển thị is_valid và errors như một từ điển thuần:
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())Các vấn đề thường gặp và cách khắc phục
ImportError or AttributeError khi truy cập aspose_pdf.generated
Gói con generated không được xuất lại bởi import aspose_pdf — hãy nhập mỗi lớp từ mô-đun con cụ thể của nó, ví dụ from aspose_pdf.generated.document import Document, thay vì mong đợi aspose_pdf.generated.Document hoạt động sau một import aspose_pdf đơn giản.
Nhầm lẫn phần được tạo Document với phần chính aspose_pdf.Document
aspose_pdf.Document (lớp cấp cao được xuất lại bởi import aspose_pdf) có phạm vi lớn hơn — nó thêm các phương thức như validate_pdfa, iter_pages, và redact_text mà aspose_pdf.generated.document.Document không triển khai. Nếu một phương thức thiếu trên Document được tạo ra, hãy kiểm tra xem nó có thuộc lớp Document cấp cao hơn không.
save() raises AsposePdfException: Cannot save a disposed document
close()/dispose() giải phóng trạng thái nội bộ của tài liệu một cách vĩnh viễn — một Document đã bị loại bỏ không thể được lưu, tối ưu hoặc sửa chữa sau này. Thực hiện tất cả các thao tác còn lại trước khi gọi close(), hoặc tải lại từ nguồn bằng một lời gọi Document(...) mới.
change_passwords raises PdfSecurityException: Document is not encrypted
change_passwords chỉ thay đổi mật khẩu trên tài liệu đã được mã hoá. Gọi encrypt(password) trước, hoặc kiểm tra document.is_encrypted trước khi cố gắng thay đổi mật khẩu.
PdfAValidationResult.add_error raises TypeError
add_error yêu cầu một đối số str. Chuyển đổi các đối tượng ngoại lệ hoặc các chi tiết lỗi khác thành chuỗi (str(error)) trước khi truyền chúng cho add_error.
Câu hỏi thường gặp
Tại sao aspose_pdf.generated tồn tại song song với aspose_pdf.Document chính?
Nó phản chiếu một tập con hẹp hơn, ổn định của Aspose.PDF API cho mã được viết dựa trên bề mặt giảm này. Mã mới mà không cần thiết tập con tương thích này thường nên sử dụng aspose_pdf.Document cấp cao nhất, vốn hỗ trợ nhiều thao tác hơn (PDF/A conversion, page iteration, text redaction, và các thứ khác).
Liệu UnsignedContentAbsorber.extract() có chấp nhận một Document để quét không?
extract() chấp nhận các đối số vị trí và đối số khóa được dùng để điền vào các bộ sưu tập pages, form_fields, và annotations của UnsignedContent được trả về — hãy truyền các bộ sưu tập bạn muốn đại diện dưới dạng đối số khóa (pages=, form_fields=, annotations=).
Điều gì sẽ xảy ra nếu tôi gọi reset() trên UnsignedContentAbsorber trước khi trích xuất bất kỳ thứ gì?
Nó xóa bất kỳ kết quả đã trích xuất nào trước đó. Sau đó get_extracted() trả về None và has_extracted() trả về False cho đến khi extract() được gọi lại.
Có thể gọi PdfAValidateOptions.add_input hơn một lần không?
Có — mỗi lần gọi sẽ thêm một mục khác vào danh sách inputs, và nó trả về self, vì vậy các lời gọi có thể được nối chuỗi: options.add_input("a.pdf").add_input("b.pdf").
Liệu close() có khác với dispose() trên Document được tạo ra không?
Không — close() là một bí danh trực tiếp gọi dispose() với cùng các đối số; cả hai tên đều giải phóng tài nguyên của tài liệu.