PDF प्रोसेसिंग इंजन के आंतरिक भाग
PDF प्रोसेसिंग इंजन आंतरिक भाग
आपके द्वारा रोज़मर्रा के PDF प्रोसेसिंग में उपयोग किए जाने वाले Document, Page, और Annotation क्लासेस एक निचले स्तर के 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 प्रिमिटिव्स को सीधे लागू करता है, 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) # TrueAES-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सलाह और सर्वोत्तम प्रथाएँ
- दैनिक दस्तावेज़ प्रोसेसिंग के लिए उच्च-स्तरीय
Document,Page, औरAnnotationफ़ेसाड को प्राथमिकता दें।aspose_pdf.engineपैकेज उन कक्षाओं की आंतरिक कार्यान्वयन है — इसे केवल तब ही उपयोग करें जब आपको कस्टम टूलिंग, फ़ोरेंसिक निरीक्षण, या फ़ेसाड द्वारा उपलब्ध न कराए गए व्यवहार की आवश्यकता हो। - जिस सुरक्षा हैंडलर को आप लक्षित कर रहे हैं, उसके अनुसार
revisionतर्क को मिलाएँ:compute_owner_key_v4/compute_user_key_v4रिवीजन 2–4 (40- और 128-बिट RC4/AES) को कवर करते हैं, जबकिcompute_hash_v5AES-256 द्वारा उपयोग किए जाने वाले रिवीजन 5/6 एल्गोरिद्म को लागू करता है। रिवीजन और कुंजी लंबाई को मिलाने से चुपचाप गलत कुंजी बनती है। Document.generate_appearancesऔरAnnotationCollection.generate_appearancesआइडेम्पोटेंट हैं — उन्हें रेंडरिंग या फ़्लैटनिंग से पहले सावधानीपूर्वक कॉल करें, जब दस्तावेज़ आपने स्वयं नहीं बनाया हो।Document.flatten()विनाशकारी है: यह पेज सामग्री में खींची गई प्रत्येक एनोटेशन को हटा देता है। पहले अन्य सभी एनोटेशन संपादन समाप्त करें, या किसी प्रति पर काम करें।- हर एनोटेशन उपप्रकार में अंतर्निहित अपीयरेंस सिंथेसाइज़र नहीं होता —
TextऔरPopupसामान्य उदाहरण हैं।generate_appearance()को कॉल करने के बादhas_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 मानों से मेल नहीं खाता | परिणाम को decrypt_aes_cbc को पास करने से पहले स्पष्ट रूप से None की जाँच करें |
Annotation.generate_appearance False लौटाता है | एनोटेशन का उपप्रकार में कोई अंतर्निहित रूप-सिंथेसाइज़र नहीं है (उदाहरण के लिए Text या Popup) | अपने स्वयं के appearance_normal बाइट्स प्रदान करें, या व्यूअर की डिफ़ॉल्ट रेंडरिंग को स्वीकार करें |
Document.generate_appearances को दूसरा कॉल करने पर 0 लौटाता है | यह कॉल आइडेम्पोटेंट है — जिन एनोटेशनों में पहले से has_appearance == True है, उन्हें छोड़ दिया जाता है | अपेक्षित व्यवहार, त्रुटि नहीं |
FAQ
क्या मुझे दैनिक दस्तावेज़ प्रोसेसिंग के लिए aspose_pdf.engine से इम्पोर्ट करने की आवश्यकता है?
नहीं। Document, Page, और Annotation क्लासेस मानक दस्तावेज़ कार्यप्रवाह को कवर करती हैं। इंजन लेयर वह जगह है जहाँ इन क्लासेस का व्यवहार लागू किया जाता है, और यह कस्टम टूलिंग या PDF आंतरिक भागों की सीधे जाँच के लिए सबसे उपयोगी है।
क्या अंतर है Annotation.generate_appearance और AnnotationCollection.generate_appearances में?
पहला एकल एनोटेशन के लिए एक एप्पीयरेंस स्ट्रीम बनाता है और एक bool लौटाता है। दूसरा यह काम संग्रह में प्रत्येक योग्य एनोटेशन के लिए करता है (एक पृष्ठ की एनोटेशन, या, Document.generate_appearances के माध्यम से, दस्तावेज़ के सभी पृष्ठ) और बनाए गए एप्पीयरेंस की गिनती लौटाता है।
कुंजी-डेरिवेशन विधियाँ revision आर्ग्युमेंट क्यों लेती हैं?
PDF मानक सुरक्षा हैंडलर ISO 32000 संशोधनों के माध्यम से विकसित हुआ है — संशोधन 2 40-बिट RC4 का उपयोग करता है, संशोधन 3/4 128-बिट RC4 या AES का समर्थन करते हैं, और संशोधन 5/6 (जो AES-256 के लिए उपयोग होते हैं) पूरी तरह से एक अलग हैशिंग एल्गोरिद्म (compute_hash_v5) का उपयोग करते हैं। revision आर्ग्युमेंट चुनता है कि EncryptionUtils विधियाँ कौन-सा डेरिवेशन करती हैं।
क्या मैं सीधे कच्चे PDF ऑब्जेक्ट्स की जाँच या निर्माण कर सकता हूँ?
हाँ। aspose_pdf.engine.cos COS ऑब्जेक्ट मॉडल को उजागर करता है — PdfObject, PdfDictionary, PdfArray, PdfStream, PdfName, और संबंधित प्रकार — जिन्हें PdfCosWriter और PdfCosParser PDF बाइट्स में सीरियलाइज़ और पार्स करते हैं।
पृष्ठ-से-छवि रेंडरिंग कहाँ होती है?
Document.render_page एक RasterizedPage लौटाता है, एक इंजन-स्तर का ऑब्जेक्ट जिसमें to_png(), to_tiff(), और save() मेथड्स होते हैं जो रेंडर किए गए पेज को इमेज फाइल में बदलते हैं।
API Reference सारांश
| क्लास / मेथड | विवरण |
|---|---|
Annotation.generate_appearance(force) -> bool | डिमांड पर एक annotation के लिए सामान्य appearance stream को संश्लेषित करें |
AnnotationCollection.generate_appearances(force) -> int | पृष्ठ पर प्रत्येक योग्य annotation के लिए appearances को बैच-जनरेट करें |
Document.generate_appearances(force) -> int | दस्तावेज़ में प्रत्येक योग्य annotation के लिए appearances को बैच-जनरेट करें |
Document.flatten() -> Document | पृष्ठ सामग्री में annotation appearances को इनलाइन करें और annotations को हटाएँ |
Document.render_page(page_index, dpi, scale, background, antialias) -> RasterizedPage | इंजन की रेंडरिंग पाइपलाइन के माध्यम से एक पेज को रास्टराइज़ करें |
RasterizedPage | पैकेड RGB फ़ॉर्मेट में रेंडर किया गया पेज, जिसमें to_png(), to_tiff() और save() शामिल हैं |
GeneratedAppearance | दिखावट संश्लेषण का आंतरिक परिणाम: कंटेंट बाइट्स प्लस कोई भी आवश्यक ExtGState/फ़ॉन्ट संसाधन |
EncryptionUtils | AES-CBC/RC4 एन्क्रिप्शन और PDF standard-security-handler कुंजी व्युत्पन्न (संस्करण 2–6) |
PdfObject | प्रत्येक COS (Carousel Object Structure) ऑब्जेक्ट के लिए सारभूत बेस क्लास |
PdfDictionary / PdfArray / PdfStream | निचले स्तर के दस्तावेज़ वृक्ष को बनाते हुए ठोस COS कंटेनर प्रकार |
PdfName / PdfNumber / PdfString / PdfBoolean / PdfNull | प्राथमिक COS मान प्रकार |
PdfIndirectReference | एक COS अप्रत्यक्ष संदर्भ (n g R) किसी अन्य ऑब्जेक्ट के लिए |
PdfCosWriter | इन-मेमोरी COS PdfDocument को PDF बाइट्स में सीरियलाइज़ करता है |
PdfCosParser / LazyPdfObjectStore | PDF बाइट्स को COS ऑब्जेक्ट्स में पार्स करता है, आवश्यकता पर उन्हें वास्तविक रूप से बनाता है |
IncrementalUpdate / IncrementalWriter | पुनः लिखने के बजाय मौजूदा PDF में एक इन्क्रिमेंटल अपडेट सेक्शन जोड़ें |
SimplePdf | नेटिव-Python लो-लेवल दस्तावेज़ प्रतिनिधित्व जिस पर हाई-लेवल Document API निर्मित है |
TextFragmentAbsorber / TextFragmentCollection | एक SimplePdf इंस्टेंस पर लो-लेवल टेक्स्ट-फ़्रैगमेंट एक्सट्रैक्शन |
ImagePlacementAbsorber / ImagePlacement | पृष्ठ पर रखी गई रास्टर छवियों को खोजें, सहेजें, बदलें, या छिपाएँ |
SigningUtils | डिजिटल साइनिंग के लिए स्वयं-हस्ताक्षरित प्रमाणपत्र और PKCS#7/CAdES हस्ताक्षर उत्पन्न करें |
DssMaterial / ChainResult / RevocationResult / TimestampInfo | हस्ताक्षर-वैधता समर्थन: DSS सामग्री, प्रमाणपत्र-श्रृंखला परिणाम, निरसन जाँच, और RFC 3161 टाइमस्टैम्प सत्यापन |
StandardFonts | 14 PDF मानक फ़ॉन्ट्स के लिए मीट्रिक्स और एन्कोडिंग्स |
CidTextCodec | संयोजित (Type0) फ़ॉन्ट्स के लिए शो-स्ट्रिंग्स को एन्कोड और डिकोड करें |
Shading | अक्षीय, रेडियल, और फ़ंक्शन-आधारित शेडिंग्स में RGB रंग का नमूना |
Color / Matrix | इंजन में पूरे उपयोग की जाने वाली लो-लेवल रंग और 2-D अफ़ाइन-ट्रांसफ़ॉर्म प्रिमिटिव्स |