วิธีสร้างเอกสารด้วยโมดูลความเข้ากันได้ที่สร้างขึ้นใน 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 — นำเข้าพวกมันโดยระบุ 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, 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 ด้วยตนเอง
UnsignedContent ยังเป็นคอนเทนเนอร์ธรรมดาที่คุณสามารถเติมข้อมูลด้วย 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 ไม่ได้ implement. หากเมธอดหายไปใน 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() พร้อมอาร์กิวเมนต์เดียวกัน; ทั้งสองชื่อปล่อยทรัพยากรของเอกสาร.