PDF प्रोसेसिंग इंजन के आंतरिक भाग

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())  # 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 प्रिमिटिव्स को सीधे लागू करता है, 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

सलाह और सर्वोत्तम प्रथाएँ

  • दैनिक दस्तावेज़ प्रोसेसिंग के लिए उच्च-स्तरीय Document, Page, और Annotation फ़ेसाड को प्राथमिकता दें। aspose_pdf.engine पैकेज उन कक्षाओं की आंतरिक कार्यान्वयन है — इसे केवल तब ही उपयोग करें जब आपको कस्टम टूलिंग, फ़ोरेंसिक निरीक्षण, या फ़ेसाड द्वारा उपलब्ध न कराए गए व्यवहार की आवश्यकता हो।
  • जिस सुरक्षा हैंडलर को आप लक्षित कर रहे हैं, उसके अनुसार revision तर्क को मिलाएँ: compute_owner_key_v4/compute_user_key_v4 रिवीजन 2–4 (40- और 128-बिट RC4/AES) को कवर करते हैं, जबकि compute_hash_v5 AES-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/फ़ॉन्ट संसाधन
EncryptionUtilsAES-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 / LazyPdfObjectStorePDF बाइट्स को COS ऑब्जेक्ट्स में पार्स करता है, आवश्यकता पर उन्हें वास्तविक रूप से बनाता है
IncrementalUpdate / IncrementalWriterपुनः लिखने के बजाय मौजूदा PDF में एक इन्क्रिमेंटल अपडेट सेक्शन जोड़ें
SimplePdfनेटिव-Python लो-लेवल दस्तावेज़ प्रतिनिधित्व जिस पर हाई-लेवल Document API निर्मित है
TextFragmentAbsorber / TextFragmentCollectionएक SimplePdf इंस्टेंस पर लो-लेवल टेक्स्ट-फ़्रैगमेंट एक्सट्रैक्शन
ImagePlacementAbsorber / ImagePlacementपृष्ठ पर रखी गई रास्टर छवियों को खोजें, सहेजें, बदलें, या छिपाएँ
SigningUtilsडिजिटल साइनिंग के लिए स्वयं-हस्ताक्षरित प्रमाणपत्र और PKCS#7/CAdES हस्ताक्षर उत्पन्न करें
DssMaterial / ChainResult / RevocationResult / TimestampInfoहस्ताक्षर-वैधता समर्थन: DSS सामग्री, प्रमाणपत्र-श्रृंखला परिणाम, निरसन जाँच, और RFC 3161 टाइमस्टैम्प सत्यापन
StandardFonts14 PDF मानक फ़ॉन्ट्स के लिए मीट्रिक्स और एन्कोडिंग्स
CidTextCodecसंयोजित (Type0) फ़ॉन्ट्स के लिए शो-स्ट्रिंग्स को एन्कोड और डिकोड करें
Shadingअक्षीय, रेडियल, और फ़ंक्शन-आधारित शेडिंग्स में RGB रंग का नमूना
Color / Matrixइंजन में पूरे उपयोग की जाने वाली लो-लेवल रंग और 2-D अफ़ाइन-ट्रांसफ़ॉर्म प्रिमिटिव्स

यह भी देखें

 हिन्दी