PDF एनोटेशन के साथ Python में कैसे काम करें

PDF एनोटेशन के साथ Python में कैसे काम करें

Aspose.PDF FOSS for Python प्रत्येक पृष्ठ पर सभी एनोटेशन को पृष्ठ के AnnotationCollection के माध्यम से एक लाइव Annotation ऑब्जेक्ट के रूप में उजागर करता है, इसलिए आप मार्कअप, लिंक, और 3D एनोटेशन जोड़ सकते हैं, उनके प्रकार-विशिष्ट गुणों की जांच कर सकते हैं, और उन appearance streams को जनरेट कर सकते हैं जो PDF व्यूअर्स को उन्हें रेंडर करने के लिए चाहिए — सब कुछ शुद्ध Python से। यह गाइड दिखाता है कि लाइब्रेरी कैसे स्थापित करें, एनोटेशन जोड़ें, उन्हें पढ़ें, और उनकी appearance streams जनरेट करें।

कदम-दर-कदम गाइड

चरण 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 .

स्थापना की पुष्टि करें शीर्ष-स्तरीय aspose_pdf मॉड्यूल को इम्पोर्ट करके, जो नीचे दिए गए चरणों में उपयोग किए गए Document क्लास को उजागर करता है। स्निपेट aspose_pdf OK प्रिंट करता है जब इम्पोर्ट सफल होता है; एक ModuleNotFoundError आमतौर पर यह दर्शाता है कि पैकेज किसी अलग Python वातावरण में स्थापित किया गया था जो आपके स्क्रिप्ट को चलाने वाले वातावरण से अलग है:

import aspose_pdf
print("aspose_pdf OK")

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

PDF को रखने के लिए Document आयात करें, साथ ही उन एनोटेशन क्लासेस को जो आप एनोटेशन बनाने और निरीक्षण करने के लिए उपयोग करेंगे:

from aspose_pdf import Document
from aspose_pdf.annotations import (
    Annotation,
    AnnotationType,
    AnnotationFlags,
    MarkupAnnotation,
    LinkAnnotation,
)

चरण 3: पृष्ठ पर एक एनोटेशन जोड़ें

प्रत्येक Page अपने एनोटेशन को annotations प्रॉपर्टी के माध्यम से प्रकट करता है, जो एक AnnotationCollection है। add(subtype, rect, contents) को उपप्रकार नाम, एक (left, bottom, right, top) आयत, और एनोटेशन के टेक्स्ट कंटेंट के साथ कॉल करें। जैसे "Highlight" जैसे मानक मार्कअप उपप्रकार एक MarkupAnnotation इंस्टेंस के रूप में लौटाए जाते हैं:

from aspose_pdf import Document

document = Document()
document.pages.add()
page = document.pages[0]

annotation = page.annotations.add(
    "Highlight",
    (100, 700, 300, 720),
    "Key clause",
)
print(type(annotation).__name__)   # MarkupAnnotation
print(annotation.contents)         # Key clause

चरण 4: एनीम उपप्रकारों से एनोटेशन बनाएं

AnnotationType प्रत्येक मानक PDF एनोटेशन उपप्रकार को (PDF 32000-1:2008, तालिका 169) सूचीबद्ध करता है, इसलिए आप कच्चे स्ट्रिंग के बजाय एनीम सदस्य पास कर सकते हैं। प्रकार-विशिष्ट डेटा — जैसे बहुभुज के शीर्ष बिंदु — properties डिक्ट में जाता है और get_property से पुनः पढ़ा जाता है:

from aspose_pdf import Document
from aspose_pdf.annotations import AnnotationType

document = Document()
document.pages.add()
page = document.pages[0]

annotation = page.annotations.add(
    AnnotationType.POLYGON,
    (0, 0, 10, 10),
    "",
    properties={"Vertices": [0, 0, 10, 0, 5, 10]},
)
print(annotation.subtype)                    # Polygon
print(annotation.get_property("Vertices"))   # [0, 0, 10, 0, 5, 10]

चरण 5: मौजूदा एनोटेशन पढ़ें और क्रमबद्ध करें

AnnotationCollection इटेरेबल है, इसलिए आप पृष्ठ पर पहले से मौजूद प्रत्येक एनोटेशन को — जिसमें मौजूदा PDF से लोड किए गए भी शामिल हैं — क्रमबद्ध कर सकते हैं और प्रत्येक Annotation द्वारा प्रकट सामान्य प्रॉपर्टीज़ को पढ़ सकते हैं (subtype, contents, rect, title, author, color):

from aspose_pdf import Document

document = Document()
document.pages.add()
page = document.pages[0]
page.annotations.add("Text", (50, 50, 70, 70), "First note")
page.annotations.add("Text", (80, 80, 100, 100), "Second note")

for annotation in page.annotations:
    print(annotation.subtype, "-", annotation.contents)

चरण 6: एनोटेशन अपीयरेंस स्ट्रीम उत्पन्न करें

एक एनोटेशन जो स्पष्ट appearance_normal के बिना बनाया गया है, उसे कोई दृश्यमान रेंडरिंग (/AP /N) नहीं मिलती जब तक कि वह उत्पन्न न हो। एकल Annotation पर generate_appearance(force) को कॉल करें, या पूरे AnnotationCollection पर generate_appearances(force) को कॉल करके पृष्ठ पर सभी गायब अपीयरेंस स्ट्रीम को एक बार में संश्लेषित करें:

from aspose_pdf import Document
from aspose_pdf.engine.cos import AnnotationName

document = Document()
document.pages.add()
page = document.pages[0]

stamp = page.annotations.add(
    "Stamp",
    (100, 100, 260, 150),
    "",
    properties={"Name": AnnotationName("Approved")},
)
if stamp.generate_appearance():
    print(f"Appearance stream: {len(stamp.appearance_normal)} byte(s)")

# Regenerate every missing appearance stream on the page in one call:
count = page.annotations.generate_appearances(force=True)
print(f"Regenerated {count} appearance stream(s)")

चरण 7: एनोटेशन सबक्लासेज़ को पहचानें

AnnotationCollection.add() उपप्रकार के आधार पर एक विशिष्ट सबक्लास को डिस्पैच करता है: मार्कअप-शैली उपप्रकार (Highlight, Square, Stamp, आदि) MarkupAnnotation के रूप में लौटते हैं, और "Link" LinkAnnotation के रूप में लौटता है। दोनों Annotation से सभी मेथड और प्रॉपर्टी विरासत में लेते हैं, इसलिए isinstance जाँचें आपको एनोटेशन प्रकार पर शाखा बनाने देती हैं बिना subtype स्ट्रिंग्स को सीधे जांचे:

from aspose_pdf import Document
from aspose_pdf.annotations import LinkAnnotation, MarkupAnnotation

document = Document()
document.pages.add()
page = document.pages[0]

link = page.annotations.add("Link", (50, 750, 200, 770), "")
highlight = page.annotations.add("Highlight", (50, 700, 200, 720), "")

print(isinstance(link, LinkAnnotation))         # True
print(isinstance(highlight, MarkupAnnotation))  # True

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

get_property returns None एक property के लिए जिसे मैंने अभी सेट किया है

properties कुंजियाँ सटीक, केस-सेंसिटिव PDF फ़ील्ड नाम हैं ("Vertices", "Name", आदि) — एक टाइपो या गलत केस को चुपचाप अनदेखा किया जाता है न कि त्रुटि के रूप में उभारा जाता है। get_property(name, default) को एक default तर्क पास करें और नई उपप्रकार को डिबग करते समय इसे स्पष्ट रूप से जाँचें।

generate_appearance() returns False

हर उपप्रकार और property संयोजन को अंतर्निहित जनरेटर द्वारा appearance stream में संश्लेषित नहीं किया जा सकता। कॉल सफल मानने से पहले has_appearance जाँचें, और उन उपप्रकारों के लिए जिनको जनरेटर कवर नहीं करता, सीधे add() पर एक पूर्व-रेंडर किया हुआ appearance_normal (bytes) प्रदान करें।

अप्रत्याशित annotation सबक्लास के बाद add()

आपके द्वारा पास किया गया subtype स्ट्रिंग (या AnnotationType सदस्य) लौटाए गए क्लास को निर्धारित करता है: markup उपप्रकार MarkupAnnotation के रूप में लौटते हैं, "Link" LinkAnnotation के रूप में लौटता है, और कोई भी अन्य पहचाना गया उपप्रकार बेस Annotation के रूप में लौटता है। विशिष्ट subtype स्ट्रिंग मानने के बजाय MarkupAnnotation/LinkAnnotation के विरुद्ध isinstance() का उपयोग करें।

AnnotationFlags values रेंडरिंग को बदलते नहीं लगते

AnnotationFlags (PRINT, HIDDEN, NO_ZOOM, READ_ONLY, और समान) एक मानक Python IntFlag enum है जो | ऑपरेटर के साथ एनोटेशन के व्यवहार बिट्स को संयोजित और व्याख्या करने के लिए उपयोग होता है — यह एक वैल्यू टाइप है, न कि वह प्रॉपर्टी जिसे Annotation.add() स्वतः लिखता है। आपको आवश्यक फ़्लैग्स को संयोजित करें और उन्हें अन्य subtype-विशिष्ट डेटा के लिए उपयोग किए गए समान टाइप-विशिष्ट properties तंत्र के माध्यम से पास करें।

एक पृष्ठ के साथ काम करना जिसमें अभी तक कोई एनोटेशन नहीं है

page.annotations हमेशा एक वैध (संभवतः खाली) AnnotationCollection है — आपको.

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

कौन से एनोटेशन उपप्रकार Aspose.PDF FOSS for Python द्वारा समर्थित हैं?

AnnotationType सभी 25 मानक PDF 32000-1:2008 तालिका 169 उपप्रकारों की सूची बनाता है, जिसमें TEXT, LINK, FREE_TEXT, LINE, SQUARE, CIRCLE, POLYGON, HIGHLIGHT, STAMP, INK, FILE_ATTACHMENT, REDACT, और अधिक शामिल हैं।

क्या यह लाइब्रेरी 3D एनोटेशनों का समर्थन करती है?

हाँ। PDF3DAnnotation, साथ में PDF3DArtwork, PDF3DContent, PDF3DView, PDF3DLightingScheme, और PDF3DRenderMode, न्यूनतम PDF 3D annotation सतह (एक आयत, एम्बेडेड कलाकृति, और नामित दृश्य) का मॉडल बनाता है प्री-रिलीज़ PDF 3D कार्यप्रवाहों के लिए। देखें PDF3DAnnotation संदर्भ इसके पूरे प्रॉपर्टी सेट के लिए।

मैं पृष्ठ से एक एनोटेशन कैसे हटाऊँ?

स्थिति द्वारा एक एनोटेशन हटाने के लिए page.annotations.delete(index) को कॉल करें, या पृष्ठ पर सभी एनोटेशन हटाने के लिए page.annotations.clear() को कॉल करें।

क्या मैं इसे जोड़ने के बजाय किसी विशिष्ट स्थिति में एनोटेशन डाल सकता हूँ?

हाँ — AnnotationCollection.insert(index, subtype, rect, contents, title, appearance_normal, properties) वही तर्क लेता है जैसा add() लेता है, साथ में लक्ष्य index।

एक एनोटेशन का रंग कैसे दर्शाया जाता है?

color प्रॉपर्टी Annotation पर (और उसकी उपवर्गों में) एक tuple[float, ...] है जो PDF /C एंट्री के कंपोनेंट काउंट से मेल खाती है (जब रंग सेट नहीं हो तो खाली) — यह कोई समर्पित रंग ऑब्जेक्ट नहीं है।

यह भी देखें

 हिन्दी