ภายในเครื่องมือประมวลผล PDF

ภายในเครื่องมือประมวลผล PDF

ภายในเอนจินการประมวลผล PDF

คลาส Document, Page และ Annotation ที่คุณใช้ในการประมวลผล PDF ประจำวันเป็นเพียงฟาซาเดเหนือแพคเกจระดับล่าง aspose_pdf.engine. เอนจินนี้ดำเนินการกลไก PDF จริงๆ: โมเดลวัตถุ COS (Carousel Object Structure) ที่ไฟล์ PDF ทุกไฟล์สร้างขึ้นจากนั้น, พาร์เซอร์และไลเตอร์ที่แปลงระหว่างวัตถุ COS กับไบต์ PDF, การสังเคราะห์ลักษณะการแสดงผลของคำอธิบาย, การเรสเตอร์หน้า, ภายในของโค้ดเอ็นโค้ดฟอนต์และภาพ, และส่วนประกอบการเข้ารหัสที่ใช้ในการเข้ารหัสเอกสารและลายเซ็นดิจิทัล. แอปพลิเคชันส่วนใหญ่ไม่จำเป็นต้องนำเข้าโดยตรงจาก aspose_pdf.engine — แต่เป็นที่ที่เหมาะสมเมื่อคุณต้องการเครื่องมือแบบกำหนดเอง, การตรวจสอบ PDF สำหรับฟอเรนซิก, หรือพฤติกรรมที่ระดับสูง API ไม่ได้เปิดเผย.


การสร้างลักษณะการแสดงผลสำหรับคำอธิบายเดี่ยว

คำอธิบายเชิงโต้ตอบเช่น สี่เหลี่ยม, วงกลม, และตราประทับ ไม่ได้มีสตรีมลักษณะการแสดงผลปกติโดยอัตโนมัติ (/AP /N). การเรียก Annotation.generate_appearance จะเรียกใช้ระบบภายในของเอนจินสำหรับการสังเคราะห์ลักษณะการแสดงผลเพื่อสร้างสตรีมตามความต้องการจากคุณสมบัติของคำอธิบาย.

from aspose_pdf import Document

doc = Document()
doc.pages.add()
ann = doc.pages[0].annotations.add(
    "Square", (100, 100, 200, 200), "", properties={"C": [1, 0, 0], "IC": [0, 1, 0]}
)

print(ann.has_appearance)  # False -- no appearance stream yet
ann.generate_appearance()
print(ann.has_appearance)  # True -- the engine synthesised one
print(b"1 0 0 RG" in ann.appearance_normal)  # True -- red stroke operator
print(b"0 1 0 rg" in ann.appearance_normal)  # True -- green fill operator

การสร้างลักษณะการแสดงผลเป็นชุดข้ามหน้าและเอกสาร

AnnotationCollection.generate_appearances สังเคราะห์ลักษณะการแสดงผลสำหรับคำอธิบายที่มีคุณสมบัติเหมาะสมทุกอันบนหน้าหนึ่งในหนึ่งการเรียก, ข้ามชนิดย่อยที่เอนจินไม่รู้วิธีเรนเดอร์ (เช่น Text):

from aspose_pdf import Document

doc = Document()
doc.pages.add()
page = doc.pages[0]
page.annotations.add("Square", (0, 0, 50, 50), "")
page.annotations.add("Circle", (60, 0, 110, 50), "")
page.annotations.add("Text", (0, 60, 20, 80), "")  # unsupported subtype -> skipped

print(page.annotations.generate_appearances())  # 2

Document.generate_appearances ทำเช่นเดียวกันบนทุกหน้าของเอกสาร, และเป็นฟังก์ชันที่อิดิโมพอเทนท์ — การเรียกครั้งที่สองจะไม่มีผลเมื่อลักษณะการแสดงผลมีอยู่แล้ว:

from aspose_pdf import Document

doc = Document()
doc.pages.add()
doc.pages.add()
doc.pages[0].annotations.add("Square", (0, 0, 50, 50), "")
doc.pages[1].annotations.add(
    "Line", (0, 0, 50, 50), "", properties={"L": [0, 0, 50, 50]}
)

print(doc.generate_appearances())  # 2 -- one per page
print(doc.generate_appearances())  # 0 -- already generated, no-op

การทำให้แอนโนเทชันแบนเป็นเนื้อหาหน้าคงที่

Document.flatten() วาดลักษณะของทุกแอนโนเทชันโดยตรงลงในสตรีมเนื้อหาของหน้าของมัน (เป็นการเรียกใช้ Do XObject) แล้วลบออบเจ็กต์แอนโนเทชันออก, ทำให้หน้าถูกแสดงผลเหมือนเดิมในโปรแกรมดูที่ละเลยแอนโนเทชันทั้งหมด:

from aspose_pdf import Document

doc = Document()
doc.pages.add()
doc.pages[0].annotations.add(
    "Square", (100, 100, 200, 200), "", properties={"C": [0, 0, 0]}
)

doc.flatten()

หลังจากการเรียกนี้ สตรีมเนื้อหาของหน้า จะยาวกว่าเดิม (ตอนนี้มีสี่เหลี่ยมที่แทรกไว้) และ doc.pages[0].annotations จะไม่มีแอนโนเทชันที่ถูกแบนอยู่แล้ว.


การสกัดกุญแจการเข้ารหัสแบบใช้รหัสผ่าน (เวอร์ชัน 4 / AES-128)

EncryptionUtils ดำเนินการสกัดกุญแจของตัวจัดการความปลอดภัยมาตรฐาน PDF และ AES-CBC primitive โดยตรง, ไม่ขึ้นกับ Document API. สิ่งนี้มีประโยชน์สำหรับเครื่องมือแบบกำหนดเองหรือการตรวจสอบนิติวิทยาศาสตร์ของ PDF ที่เข้ารหัส:

import os
from aspose_pdf.engine.encryption import EncryptionUtils

file_id = os.urandom(16)
user_pwd = "mypassword"

# Derive the owner (O) and user (U) key material for Revision 4 (128-bit AES)
o_value = EncryptionUtils.compute_owner_key_v4("owner", user_pwd, 16, 4)
u_value, enc_key = EncryptionUtils.compute_user_key_v4(
    user_pwd, o_value, -4, file_id, 16, 4
)

# Encrypt data with the derived file-encryption key
plaintext = b"Confidential PDF content"
ciphertext = EncryptionUtils.encrypt_aes_cbc(enc_key, plaintext)

# Re-derive the key from the password before trusting it to decrypt
verified_key = EncryptionUtils.verify_password_v4(
    user_pwd, u_value, o_value, -4, file_id, 16, 4
)
print(verified_key is not None)  # True -- password matches

decrypted = EncryptionUtils.decrypt_aes_cbc(verified_key, ciphertext)
print(decrypted == plaintext)  # True

การเข้ารหัสเนื้อหาดิบด้วย AES-CBC

สำหรับความต้องการระดับล่าง, EncryptionUtils.encrypt_aes_cbc() และ decrypt_aes_cbc() ทำงานโดยตรงกับคีย์ใด ๆ ที่มีขนาด 16, 24 หรือ 32 ไบต์โดยไม่ต้องผ่านการสกัดกุญแจแบบใช้รหัสผ่านเลย:

import os
from aspose_pdf.engine.encryption import EncryptionUtils

key = os.urandom(32)  # AES-256; 16 and 24-byte keys are also accepted
plaintext = b"Hello, PDF AES 256!"

ciphertext = EncryptionUtils.encrypt_aes_cbc(key, plaintext)
decrypted = EncryptionUtils.decrypt_aes_cbc(key, ciphertext)
print(decrypted == plaintext)  # True

เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุด

  • แนะนำให้ใช้ facade ระดับสูง Document, Page และ Annotation สำหรับการประมวลผลเอกสารในชีวิตประจำวัน. แพคเกจ aspose_pdf.engine เป็นการดำเนินการภายในที่คลาสเหล่านั้นสร้างขึ้น — ใช้เท่านั้นเมื่อคุณต้องการเครื่องมือแบบกำหนดเอง การตรวจสอบเชิงนิติวิทยาศาสตร์ หรือพฤติกรรมที่ facade ไม่ได้เปิดเผย.
  • จับคู่ค่าอาร์กิวเมนต์ revision กับตัวจัดการความปลอดภัยที่คุณกำลังมุ่งเป้า: compute_owner_key_v4/compute_user_key_v4 ครอบคลุมรุ่น 2–4 (40- และ 128-bit RC4/AES) ในขณะที่ compute_hash_v5 ใช้อัลกอริทึมรุ่น 5/6 ที่ใช้โดย AES-256. การผสมผสานรุ่นและความยาวคีย์โดยไม่แจ้งจะทำให้ได้คีย์ที่ผิดพลาด.
  • Document.generate_appearances และ AnnotationCollection.generate_appearances เป็น idempotent — เรียกใช้พวกมันอย่างระมัดระวังก่อนทำการเรนเดอร์หรือ flattening เอกสารที่คุณไม่ได้สร้างเอง.
  • Document.flatten() เป็นการทำลาย: มันลบหมายเหตุทุกอย่างที่มันวาดลงในเนื้อหาของหน้า. เสร็จสิ้นการแก้ไขหมายเหตุอื่น ๆ ก่อน หรือทำงานบนสำเนา.
  • ไม่ได้ทุกประเภทย่อยของคำอธิบายมีตัวสังเคราะห์รูปลักษณ์ในตัว — Text และ Popup เป็นตัวอย่างทั่วไป. ตรวจสอบ has_appearance หลังจากเรียก generate_appearance() แทนที่จะสมมติว่ามันสำเร็จ.

ปัญหาที่พบบ่อย

ปัญหาสาเหตุวิธีแก้ไข
EncryptionUtils.encrypt_aes_cbc/decrypt_aes_cbc แสดงข้อผิดพลาด “AES key must be 16, 24, or 32 bytes”มีการส่งคีย์ที่มีความยาวไม่ถูกต้องสร้างคีย์ด้วย os.urandom(16), os.urandom(24) หรือ os.urandom(32)
EncryptionUtils.verify_password_v4 คืนค่า None แทนที่จะยกข้อผิดพลาดรหัสผ่านที่ให้มาไม่ตรงกับค่าที่ได้จากเอกสาร U/Oตรวจสอบอย่างชัดเจนสำหรับ None ก่อนส่งผลลัพธ์ให้กับ decrypt_aes_cbc
Annotation.generate_appearance คืนค่า Falseประเภทย่อยของคำอธิบายไม่มีตัวสังเคราะห์ลักษณะในตัว (เช่น Text หรือ Popup)จัดหาขนาด appearance_normal ไบต์ของคุณเอง หรือยอมรับการเรนเดอร์เริ่มต้นของ viewer
การเรียกครั้งที่สองของ Document.generate_appearances คืนค่า 0การเรียกนี้เป็น idempotent — คำอธิบายที่มี has_appearance == True อยู่แล้วจะถูกข้ามเป็นพฤติกรรมที่คาดหวัง ไม่ใช่ข้อผิดพลาด

FAQ

ฉันต้องนำเข้าจาก aspose_pdf.engine สำหรับการประมวลผลเอกสารประจำวันหรือไม่?

ไม่. คลาส Document, Page และ Annotation ครอบคลุมกระบวนการทำงานของเอกสารมาตรฐาน ชั้น engine คือที่ที่พฤติกรรมของคลาสเหล่านั้นถูกนำไปใช้ และเป็นประโยชน์ที่สุดสำหรับเครื่องมือแบบกำหนดเองหรือการตรวจสอบภายในของ PDF โดยตรง.

ความแตกต่างระหว่าง Annotation.generate_appearance และ AnnotationCollection.generate_appearances คืออะไร?

อันแรกสร้างสตรีมการแสดงผลสำหรับการอธิบายความหมายเดียวและคืนค่า bool. อันที่สองทำเช่นเดียวกันสำหรับการอธิบายความหมายที่มีคุณสมบัติเหมาะสมทั้งหมดในคอลเลกชัน (การอธิบายความหมายของหน้าเดียว, หรือผ่าน Document.generate_appearances, ทุกหน้าของเอกสาร) และคืนจำนวนการแสดงผลที่สร้างขึ้น.

ทำไมวิธีการสกัดกุญแจจึงรับอาร์กิวเมนต์ revision?

ตัวจัดการความปลอดภัยมาตรฐานของ PDF ได้พัฒนาไปตามการแก้ไข ISO 32000 — รุ่น Revision 2 ใช้ RC4 40 บิต, รุ่น Revision 3/4 รองรับ RC4 128 บิตหรือ AES, และรุ่น Revision 5/6 (ใช้สำหรับ AES-256) ใช้อัลกอริธึมแฮชที่แตกต่างอย่างสิ้นเชิง (compute_hash_v5). อาร์กิวเมนต์ revision เลือกว่าการสกัดใดที่วิธีการ EncryptionUtils จะดำเนินการ.

ฉันสามารถตรวจสอบหรือสร้างวัตถุ PDF ดิบโดยตรงได้หรือไม่?

ใช่. aspose_pdf.engine.cos เปิดเผยโมเดลวัตถุ COS — PdfObject, PdfDictionary, PdfArray, PdfStream, PdfName และประเภทที่เกี่ยวข้อง — ที่ PdfCosWriter และ PdfCosParser ทำการซีเรียลไลซ์เป็นไบต์ PDF และแปลงจากไบต์ PDF.

การแปลงหน้าเป็นภาพเกิดขึ้นที่ไหน?

Document.render_page คืนค่า RasterizedPage ซึ่งเป็นอ็อบเจ็กต์ระดับเอนจิ้นที่มีเมธอด to_png(), to_tiff() และ save() สำหรับแปลงหน้าที่เรนเดอร์เป็นไฟล์ภาพ.


API Reference สรุป

คลาส / เมธอดคำอธิบาย
Annotation.generate_appearance(force) -> boolสังเคราะห์สตรีมการแสดงผลปกติสำหรับคำอธิบายหนึ่งรายการตามความต้องการ
AnnotationCollection.generate_appearances(force) -> intสร้างการแสดงผลเป็นชุดสำหรับคำอธิบายที่มีคุณสมบัติเหมาะสมทั้งหมดบนหน้า
Document.generate_appearances(force) -> intสร้างการแสดงผลเป็นชุดสำหรับคำอธิบายที่มีคุณสมบัติเหมาะสมทั้งหมดในเอกสาร
Document.flatten() -> Documentแทรกลักษณะการอธิบายประกอบลงในเนื้อหาหน้าและลบคำอธิบายประกอบออก
Document.render_page(page_index, dpi, scale, background, antialias) -> RasterizedPageทำการแรสเตอร์หน้าผ่านท่อการเรนเดอร์ของเอนจิน
RasterizedPageหน้าที่เรนเดอร์ในรูปแบบ RGB ที่บรรจุ, พร้อมกับ to_png(), to_tiff() และ save()
GeneratedAppearanceผลลัพธ์ภายในของการสังเคราะห์ลักษณะการแสดงผล: ไบต์ของเนื้อหา พร้อมทรัพยากร ExtGState/font ที่จำเป็น
EncryptionUtilsAES-CBC/RC4 การเข้ารหัสและการสกัดกุญแจมาตรฐานความปลอดภัยของ PDF (รุ่น 2–6)
PdfObjectคลาสฐานเชิงนามธรรมสำหรับอ็อบเจ็กต์ COS (Carousel Object Structure) ทุกอ็อบเจ็กต์
PdfDictionary / PdfArray / PdfStreamประเภทคอนเทนเนอร์ COS เชิงรูปธรรมที่ประกอบเป็นต้นไม้เอกสารระดับล่าง
PdfName / PdfNumber / PdfString / PdfBoolean / PdfNullประเภทค่าพื้นฐานของ COS
PdfIndirectReferenceการอ้างอิงแบบอ้อมของ COS (n g R) ไปยังอ็อบเจกต์อื่น
PdfCosWriterทำการซีเรียลไลซ์ PdfDocument ของ COS ที่อยู่ในหน่วยความจำเป็นไบต์ PDF
PdfCosParser / LazyPdfObjectStoreแยกวิเคราะห์ไบต์ PDF ให้เป็นอ็อบเจกต์ COS โดยสร้างขึ้นตามความต้องการ
IncrementalUpdate / IncrementalWriterเพิ่มส่วนอัปเดตเชิงเพิ่มลงใน PDF ที่มีอยู่แทนการเขียนทับใหม่
SimplePdfการแสดงเอกสารระดับต่ำแบบ native-Python ที่ Document API ระดับสูงสร้างขึ้นบน
TextFragmentAbsorber / TextFragmentCollectionการสกัดข้อความส่วนย่อยระดับต่ำบนอินสแตนซ์ของ SimplePdf
ImagePlacementAbsorber / ImagePlacementค้นหา, บันทึก, แทนที่ หรือซ่อนภาพแรสเตอร์ที่วางไว้บนหน้า
SigningUtilsสร้างใบรับรองที่ลงนามด้วยตนเองและลายเซ็น PKCS#7/CAdES สำหรับการลงนามดิจิทัล
DssMaterial / ChainResult / RevocationResult / TimestampInfoการสนับสนุนการตรวจสอบลายเซ็น: วัสดุ DSS, ผลลัพธ์ของห่วงโซ่ใบรับรอง, การตรวจสอบการเพิกถอน, และการตรวจสอบเวลา RFC 3161
StandardFontsเมตริกและการเข้ารหัสสำหรับแบบอักษรมาตรฐาน PDF 14 ตัว
CidTextCodecเข้ารหัสและถอดรหัส show-strings สำหรับแบบอักษรคอมโพสิต (Type0)
Shadingตัวอย่างสี RGB ครอบคลุมการไล่สีเชิงแกน การไล่สีเชิงรัศมี และการไล่สีแบบฟังก์ชัน
Color / Matrixโครงสร้างสีระดับล่างและการแปลงเชิง affine มิติ 2-D ที่ใช้ทั่วทั้งเอนจิน

ดูเพิ่มเติม

 ภาษาไทย