วิธีสร้างเอกสารด้วยโมดูลความเข้ากันได้ที่สร้างขึ้นใน Python

วิธีสร้างเอกสารด้วยโมดูลความเข้ากันได้ที่สร้างขึ้นใน 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() พร้อมอาร์กิวเมนต์เดียวกัน; ทั้งสองชื่อปล่อยทรัพยากรของเอกสาร.

ดูเพิ่มเติม

 ภาษาไทย