ภายในเครื่องมือประมวลผล 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()) # 2Document.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 ที่จำเป็น |
EncryptionUtils | AES-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 ที่ใช้ทั่วทั้งเอนจิน |