Python में PDF डेटा के साथ काम कैसे करें

Python में PDF डेटा के साथ काम कैसे करें

Aspose.PDF FOSS for Python एक PDF दस्तावेज़ की XMP मेटाडेटा को एक इन-मेमोरी डेटा मॉडल के रूप में दर्शाता है जो XmpPacket, XmpField, XmpArray, XmpStruct और XmpProperty ऑब्जेक्ट्स से निर्मित है, तथा NamespaceProvider नेमस्पेस प्रीफ़िक्स को URI में बदलता है। यह आपको संरचित मेटाडेटा — शीर्षक, तिथियाँ, कीवर्ड सूची, कस्टम फ़ील्ड्स — को पढ़ने, बनाने और पुनः लिखने की अनुमति देता है, बिना RDF/XML को हाथ से लिखे। लाइब्रेरी शुद्ध 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 .

इंस्टॉलेशन की पुष्टि करें XmpPacket को इम्पोर्ट करके और एक पुष्टि संदेश प्रिंट करके:

from aspose_pdf import XmpPacket
print("aspose-pdf-foss-for-python is ready.")

चरण 2: आवश्यक वर्ग आयात करें

XMP डेटा मॉडल वर्गों और नेमस्पेस रिजॉल्वर को आयात करें:

from aspose_pdf import (
    NamespaceProvider,
    XmpArray,
    XmpField,
    XmpPacket,
    XmpProperty,
    XmpStruct,
)

चरण 3: एक पैकेट बनाएं और सरल गुण सेट करें

XmpPacket() एक खाली फ़ील्ड सूची से शुरू होता है। set_value(prefix, name, value, uri=...) एक सरल गुण को सेट या बदलता है, और get(prefix_or_uri, name) उसे XmpField के रूप में पढ़ता है; get पंजीकृत उपसर्ग या पूर्ण नेमस्पेस URI दोनों को स्वीकार करता है:

from aspose_pdf import XmpPacket

packet = XmpPacket()
packet.set_value("dc", "title", "Quarterly Report")
packet.set_value(
    "dc", "creator", "Automation Pipeline",
    uri="http://purl.org/dc/elements/1.1/",
)

title_field = packet.get("dc", "title")
print(title_field.value)  # "Quarterly Report"

चरण 4: टाइप्ड मान संग्रहीत करें

XmpPacket टाइप्ड सुविधा अभिगमकर्ता प्रदान करता है जो XMP द्वारा आंतरिक रूप से संग्रहीत साधारण-टेक्स्ट रूप में बदलते और वापस बदलते हैं: set_date/get_date, set_int/get_int, set_real/get_real, और set_bool/get_bool. प्रत्येक गेटर None लौटाता है जब गुण अनुपस्थित हो, बजाय त्रुटि उठाने के:

from datetime import datetime

packet.set_date("xmp", "CreateDate", datetime(2026, 7, 29, 9, 30))
packet.set_int("pdf", "PageCount", 42)
packet.set_real("custom", "ConfidenceScore", 0.97, uri="https://example.com/ns/custom/1.0/")
packet.set_bool("custom", "IsFinal", True, uri="https://example.com/ns/custom/1.0/")

print(packet.get_date("xmp", "CreateDate"))
print(packet.get_int("pdf", "PageCount"))
print(packet.get_real("custom", "ConfidenceScore"))
print(packet.get_bool("custom", "IsFinal"))

चरण 5: स्थानीयकृत पाठ और क्रमबद्ध एरे संग्रहीत करें

set_localized_text एक भाषा-पर्यायी (rdf:Alt) गुण लिखता है जैसे कि dc:title किसी विशिष्ट भाषा में, डिफ़ॉल्ट रूप से "x-default" पर। set_array एक क्रमबद्ध (Seq), अव्यवस्थित (Bag), या वैकल्पिक (Alt) एरे को मानों की साधारण सूची से लिखता है, और get_array उसे स्ट्रिंग्स की सूची के रूप में वापस पढ़ता है:

packet.set_localized_text("dc", "description", "Quarterly summary", lang="en")
packet.set_localized_text(
    "dc", "description", "Resumen trimestral",
    uri="http://purl.org/dc/elements/1.1/", lang="es",
)
print(packet.get_localized_text("dc", "description", lang="es"))

packet.set_array("dc", "subject", ["finance", "quarterly", "internal"], kind="Bag")
print(packet.get_array("dc", "subject"))

चरण 6: XmpStruct के साथ संरचित मान बनाएं

कुछ XMP प्रॉपर्टीज़ (डायमेंशन रिकॉर्ड्स, इतिहास प्रविष्टियाँ) सरल टेक्स्ट के बजाय संरचित मान होते हैं। XmpStruct के साथ एक बनाएं, add के साथ XmpField ऑब्जेक्ट्स जोड़ें, और get से नाम द्वारा एक सदस्य पढ़ें, फिर add से स्ट्रक्ट को पैकेट से संलग्न करें:

dimensions = XmpStruct()
dimensions.add(XmpField(prefix="stDim", name="w", value="612"))
dimensions.add(XmpField(prefix="stDim", name="h", value="792"))
dimensions.add(XmpField(prefix="stDim", name="unit", value="pt"))

print(dimensions.get("w").value)  # "612"

packet.add(XmpField(prefix="xmpTPg", name="MaxPageSize", value=dimensions))

चरण 7: कस्टम XMP नेमस्पेसेस पंजीकृत करें

NamespaceProvider मानक XMP नेमस्पेसेस (डबलिन कोर, Adobe XMP, PDF, आदि) के साथ पहले से लोड है। कस्टम मैपिंग जोड़ने के लिए register(prefix, uri) को कॉल करें — यह प्रोवाइडर को स्वयं लौटाता है जिससे कॉल्स को चेन किया जा सकता है — फिर प्रोवाइडर को पैकेट से संलग्न करें ताकि सीरियलाइज़ेशन कस्टम प्रीफ़िक्स को उसके URI में हल कर सके:

from aspose_pdf import NamespaceProvider, XmpPacket

provider = NamespaceProvider()
provider.register("custom", "https://example.com/ns/custom/1.0/")

packet = XmpPacket(namespace_provider=provider)
packet.set_value("custom", "batch_id", "run-2026-07-29")

चरण 8: पैकेट को पार्स और सीरियलाइज़ करें

XmpPacket.parse(data, provider=...) कच्चे XMP पैकेट बाइट्स या टेक्स्ट को एक XmpPacket में पढ़ता है। serialize() और to_bytes() दोनों पैकेट को वापस XMP पैकेट बाइट्स में रेंडर करते हैं:

xmp_bytes = packet.to_bytes()

restored = XmpPacket.parse(xmp_bytes)
print(restored.get("dc", "title").value)

सामान्य समस्याएँ और समाधान

get() या एक टाइप्ड गेटर लौटाता है None हालांकि मैंने अभी प्रॉपर्टी सेट की है

सुनिश्चित करें कि prefix (या URI) तर्क get/get_int/get_date/इत्यादि को ठीक उसी तरह मेल खाता हो जैसा कि मिलते-जुलते set_* कॉल में पास किया गया था — get फ़ील्ड के प्रीफ़िक्स और उसके नेमस्पेस URI दोनों पर मेल खाता है, लेकिन एक कॉल में असंगत कस्टम प्रीफ़िक्स और दूसरे में URI होने पर यह मिस हो जाएगा।

कस्टम नेमस्पेस प्रीफ़िक्स सीरियलाइज़ करने पर अधूरा आउटपुट उत्पन्न करता है

एक प्रीफ़िक्स जो मानक XMP नेमस्पेस (dc, xmp, pdf, आदि) में से नहीं है, उसे प्रत्येक set_* कॉल पर स्पष्ट uri= तर्क की आवश्यकता होती है, या फिर NamespaceProvider के साथ वह प्रीफ़िक्स पंजीकृत करके XmpPacket(namespace_provider=provider) के माध्यम से पैकेट से जुड़ना चाहिए, फिर serialize()/to_bytes() को कॉल किया जाए।

get_bool, get_int, या get_real returns None उस मान के लिए जिसे मैं जानता हूँ कि सेट है

ये टाइप्ड गेटर्स None लौटाते हैं जब संग्रहीत पाठ अपेक्षित प्रकार के रूप में पार्स नहीं हो पाता — उदाहरण के तौर पर, get_int किसी प्रॉपर्टी पर जहाँ मान को set_value के रूप में फ्री-फ़ॉर्म टेक्स्ट के साथ सेट किया गया था न कि set_int के साथ। मिलते-जुलते टाइप्ड सेटर्स (set_int, set_real, set_bool) का उपयोग करें ताकि गेटर की पार्सिंग लॉजिक लिखने के रास्ते से मेल खाए।

XmpPacket.parse raises ValueError एक अविश्वसनीय स्रोत से आए पैकेट पर

parse किसी भी <!DOCTYPE या <!ENTITY घोषणा को XXE और बिलियन-लाफ्स हमलों के खिलाफ एक शत्रु-इनपुट गार्ड के रूप में अस्वीकार करता है। एक वैध XMP पैकेट को कभी भी DTD की आवश्यकता नहीं होती; इस अपवाद को यह संकेत मानें कि स्रोत स्ट्रीम बिगड़ा या असुरक्षित है, न कि गार्ड को बायपास करने की कोशिश करें।

get_array returns None सूची के बजाय

get_array None लौटाता है जब नामित प्रॉपर्टी या तो मौजूद नहीं होती या उसे XmpArray के रूप में संग्रहीत नहीं किया गया है (उदाहरण के लिए, यदि इसे set_value के साथ सेट किया गया हो set_array के बजाय)। प्रॉपर्टी लिखते समय set_array का उपयोग करें ताकि संग्रहीत मान get_array की अपेक्षित आकृति से मेल खाए।

अक्सर पूछे जाने वाले प्रश्न

set_value और set_int जैसे टाइप्ड सेटर्स में क्या अंतर है?

set_value वह सब कुछ जैसा है वैसा ही संग्रहीत करता है जो आप value पास करते हैं। टाइप्ड सेटर्स (set_date, set_int, set_real, set_bool) अपने इनपुट को XMP द्वारा आंतरिक रूप से उपयोग किए जाने वाले सादा-पाठ रूप में बदलते हैं और एक मेल खाती टाइप्ड गेटर के साथ जो इसे वापस पार्स करता है, इसलिए जब आपको कच्चे स्ट्रिंग्स के बजाय राउंड-ट्रिप टाइप सुरक्षा की आवश्यकता हो तो उनका उपयोग करें।

XmpArray प्रकार (Bag, Seq, Alt) कैसे अलग हैं?

Bag मानों का अनऑर्डर्ड सेट है, Seq एक क्रमबद्ध सूची है, और Alt वैकल्पिक मान रखता है (अधिकतर भाषा विकल्प, जैसा कि set_localized_text में उपयोग होता है)। वांछित प्रकार को set_array(..., kind="Bag") को पास करें या सीधे एक XmpArray(kind=...) बनाएं।

क्या मैं पैकेट पर प्रॉपर्टीज़ की कच्ची सूची पढ़ सकता हूँ बिना उनके नामों के पहले से जाने?

हाँ — packet.fields को इटरेट करें, जो पैकेट में सम्मिलन क्रम में जोड़े गए प्रत्येक XmpField, XmpArray, और XmpProperty को रखता है।

क्या मुझे मानक XMP नेमस्पेसेस के लिए एक NamespaceProvider चाहिए?

नहीं। dc, xmp, pdf, और अन्य मानक उपसर्ग स्वचालित रूप से हल हो जाते हैं। एक NamespaceProvider केवल उन कस्टम उपसर्गों के लिए आवश्यक है जिन्हें आप स्वयं बनाते हैं।

XmpProperty क्वालिफ़ायर्स साधारण XmpField से कैसे अलग होते हैं?

XmpProperty एक बेस XmpField को क्वालिफ़ायर फ़ील्ड्स की सूची (जो add_qualifier के साथ जोड़ी जाती है) के साथ मिलाता है, जिसका उपयोग उन दुर्लभ मामलों में किया जाता है जहाँ किसी प्रॉपर्टी को स्वयं अपने मान से जुड़ी अतिरिक्त RDF मेटाडाटा की आवश्यकता होती है, xml:lang क्वालिफ़ायर से परे जिसे XmpField.language पहले ही कवर करता है।

यह भी देखें

 हिन्दी