परिचय

Aspose.PDF FOSS for Java एक MIT-लाइसेंस वाला Java लाइब्रेरी है PDF दस्तावेज़ बनाने और संपादित करने के लिए। इसकी कक्षाएँ org.aspose.pdf पैकेज और उसकी उप-पैकेजों (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades, और अन्य) के तहत व्यवस्थित हैं, और Document अधिकांश वर्कफ़्लो के लिए प्रवेश बिंदु है। इस लाइब्रेरी की कोई तृतीय-पक्ष रनटाइम निर्भरताएँ नहीं हैं; इसके Maven बिल्ड में एकमात्र निर्भरता JUnit है, जो टेस्ट स्कोप में है।

लाइब्रेरी घोषणा, फ़साद पोस्ट, और पेज-एडिटिंग पोस्ट पहले ही दस्तावेज़ निर्माण, फ़ॉर्म फ़ील्ड, निष्कर्षण, एन्क्रिप्शन और स्टैम्पिंग के लिए फ़साद क्लासेज़, और PdfFileEditor के साथ पेज संचालन को कवर करते हैं। यह पोस्ट समान API के पाँच अन्य क्षेत्रों को कवर करती है जो उन पोस्टों में नहीं दिखाए गए हैं: टेक्स्ट-मार्कअप एनोटेशन, फ्री-टेक्स्ट कॉलआउट्स, दस्तावेज़-स्तरीय क्रियाएँ, स्ट्रीम डिकोडिंग पर आकार गार्ड, और डायग्नोस्टिक लॉगिंग।

प्रत्येक क्षेत्र एक छोटा, स्व-निहित API है। नीचे के अनुभाग कॉल्स, डिफ़ॉल्ट्स, और किनारी मामलों को दिखाते हैं जिन्हें लाइब्रेरी के अपने परीक्षणों ने निर्धारित किया है।


मुख्य विशेषताएँ

टेक्स्ट मार्कअप एनोटेशन

HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation, और SquigglyAnnotation प्रत्येक एक Page और एक Rectangle लेते हैं। कंस्ट्रक्टर आयत से एनोटेशन के क्वाड पॉइंट्स निकालता है, इसलिए getQuadPoints() बिना किसी मैन्युअल गणना के आठ मान लौटाता है। आयत (100, 200, 300, 250) के लिए परिणाम [100, 250, 300, 250, 100, 200, 300, 200] है: ऊपर-बायां, ऊपर-दायां, नीचे-बायां, फिर नीचे-दायां। setQuadPoints() प्राप्त मानों को आपके अपने आठ-मान एरे से बदल देता है, और मौजूदा शब्दकोश से पुनर्निर्मित एनोटेशन पहले से संग्रहीत क्वाड पॉइंट्स को बनाए रखता है। getSubtype() PDF उपप्रकार नाम लौटाता है: Highlight, Underline, StrikeOut, या Squiggly।

एक एनोटेशन बनाना इसे पृष्ठ पर संलग्न नहीं करता। इसे page.getAnnotations().add(...) से जोड़ें।

try (Document doc = new Document()) {
    Page page = doc.getPages().add();

    HighlightAnnotation highlight = new HighlightAnnotation(page, new Rectangle(100, 200, 300, 250));
    double[] quadPoints = highlight.getQuadPoints();

    UnderlineAnnotation underline = new UnderlineAnnotation(page, new Rectangle(50, 100, 200, 120));
    StrikeOutAnnotation strikeOut = new StrikeOutAnnotation(page, new Rectangle(50, 140, 200, 160));
    SquigglyAnnotation squiggly = new SquigglyAnnotation(page, new Rectangle(50, 180, 200, 200));

    page.getAnnotations().add(highlight);
    page.getAnnotations().add(underline);
    page.getAnnotations().add(strikeOut);
    page.getAnnotations().add(squiggly);
    doc.save("markup.pdf");
}

फ्री-टेक्स्ट कॉलआउट्स

FreeTextAnnotation पाठ को सीधे पृष्ठ पर रखता है। इसका तीन-आर्ग्यूमेंट वाला कन्स्ट्रक्टर एक DefaultAppearance लेता है, जिसमें फ़ॉन्ट नाम, फ़ॉन्ट आकार, और टेक्स्ट रंग होते हैं। तीन गुण कॉलआउट को आकार देते हैं:

  • setIntent() एक FreeTextIntent लेता है: FreeText, FreeTextCallout, या FreeTextTypeWriter. एक नया एनोटेशन Undefined रिपोर्ट करता है, और null पास करने से वह उस स्थिति में वापस आ जाता है।
  • setCallout() कॉलआउट लाइन को दो या तीन {x, y} बिंदुओं की एरे के रूप में लेता है। किसी भी अन्य लंबाई की एरे को नजरअंदाज किया जाता है और मौजूदा कॉलआउट वहीं बना रहता है; null कॉलआउट को हटा देता है।
  • setEndingStyle() एक LineEnding मान लेता है जैसे OpenArrow या Diamond. एक नया एनोटेशन LineEnding.None रिपोर्ट करता है।
try (Document doc = new Document()) {
    Page page = doc.getPages().add();
    DefaultAppearance da = new DefaultAppearance("Helv", 10, Color.BLACK);
    FreeTextAnnotation note = new FreeTextAnnotation(page, new Rectangle(50, 50, 200, 100), da);

    note.setContents("Check this value");
    note.setIntent(FreeTextIntent.FreeTextCallout);
    note.setCallout(new double[][] {{10, 10}, {50, 50}, {100, 100}});
    note.setEndingStyle(LineEnding.OpenArrow);

    page.getAnnotations().add(note);
    doc.save("callout.pdf");
}

सहेजा गया एनोटेशन डिक्शनरी इन मूल्यों को /IT, /CL, और /LE के रूप में संग्रहीत करता है।

डॉक्यूमेंट-लेवल एक्शन्स

Document.getActions() दस्तावेज़ कैटलॉग का DocumentActions दृश्य लौटाता है। setOpenAction() कैटलॉग की /OpenAction प्रविष्टि में एक कार्रवाई संग्रहीत करता है। पाँच अतिरिक्त ट्रिगर, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting(), और setAfterPrinting(), कैटलॉग की /AA अतिरिक्त-कार्य शब्दकोश में स्वतंत्र रूप से संग्रहीत होते हैं।

प्रत्येक getter null लौटाता है जब तक उसका ट्रिगर सेट नहीं हो जाता। एक setter को null पास करने से वह प्रविष्टि हट जाती है, और अंतिम ट्रिगर को हटाने से /AA शब्दकोश भी हट जाता है। क्रियाएँ PdfAction इंस्टैंस हैं; GoToURIAction UriAction का उपनाम है, और उसका getType() URI लौटाता है। DocumentActions ऑब्जेक्ट एक लाइव दृश्य है, इसलिए getActions() को बाद में कॉल करने पर पहले की कॉल द्वारा किए गए बदलाव दिखाई देते हैं, और सहेजी गई फ़ाइल को फिर से खोलने पर ट्रिगर फिर से पढ़े जाते हैं।

try (Document doc = new Document()) {
    doc.getPages().add();
    DocumentActions actions = doc.getActions();

    actions.setOpenAction(new GoToURIAction("https://example.com"));
    actions.setBeforeSaving(new GoToURIAction("https://example.com/saving"));

    PdfAction open = doc.getActions().getOpenAction();
    if (open instanceof UriAction) {
        System.out.println(((UriAction) open).getUri());
    }

    actions.setBeforeSaving(null);   // removes /WS; /AA is removed once it is empty
    doc.save("actions.pdf");
}

स्ट्रीम फ़िल्टरों के लिए डिकोड सीमाएँ

PDF स्ट्रीम एन्कोडेड रूप में संग्रहीत होते हैं, और एक भ्रष्ट या दुर्भावनापूर्ण स्ट्रीम अपने संग्रहीत आकार से कहीं अधिक बढ़ सकता है। DecodeLimits एक गार्ड है जो FlateDecode, LZWDecode, और RunLengthDecode फ़िल्टरों द्वारा साझा किया जाता है। जब किसी स्ट्रीम का डिकोड किया गया आउटपुट सीमा से अधिक हो जाता है, तो फ़िल्टर DecodeSizeLimitException फेंकता है, जो IOException की उपक्लास है, बजाय इसके कि हीप समाप्त होने तक डिकोड किया जाए।

डिफ़ॉल्ट सीमा प्रत्येक डिकोडेड स्ट्रीम के लिए 256 MB है (DecodeLimits.DEFAULT_MAX_DECODED_BYTES)। इसे बदलने के लिए, DecodeLimits.PROPERTY द्वारा नामित सिस्टम प्रॉपर्टी को सेट करें, जो aspose.pdf.maxDecodedStreamBytes है, और इसे बाइट्स में आकार दें; 0 या उससे कम मान गार्ड को अक्षम कर देता है। यह प्रॉपर्टी प्रत्येक डिकोड पर पढ़ी जाती है, इसलिए इसे रनटाइम पर बदला जा सकता है।

static byte[] decodeFlate(byte[] encoded) {
    // Lower the cap to 16 MB (16777216 bytes) for this process
    System.setProperty(DecodeLimits.PROPERTY, "16777216");
    try {
        return new FlateFilter().decode(encoded, null);
    } catch (IOException e) {
        // "FlateDecode: decoded output exceeds 16777216 bytes - likely a corrupt stream
        //  or decompression bomb (override with -Daspose.pdf.maxDecodedStreamBytes)"
        return null;
    }
}

सीमा के भीतर की स्ट्रीम सामान्य रूप से डिकोड होती हैं। जब आउटपुट सीमा के भीतर रहता है, तो FlateFilter और RunLengthFilter दोनों encode() और decode() के माध्यम से डेटा को राउंड-ट्रिप करते हैं।

डायग्नोस्टिक लॉगिंग

लाइब्रेरी java.util.logging के माध्यम से org.aspose.pdf लॉगर के तहत लॉग करती है और डिफ़ॉल्ट रूप से मौन रहती है: स्तर OFF है। AsposePdfLogging लॉगिंग को सक्रिय करता है।

  • setLevel(Level) कोड से स्तर सेट करता है; null लाइब्रेरी को OFF पर लौटाता है। getLevel() इसे वापस पढ़ता है।
  • aspose.pdf.log सिस्टम प्रॉपर्टी (जो AsposePdfLogging.LOG_PROPERTY के रूप में भी उपलब्ध है) इसे कमांड लाइन से सेट करती है। configureFromSystemProperty() प्रॉपर्टी को लागू करता है और क्लास लोड होने पर भी चलता है। मान on और warning WARNING चुनते हैं, verbose FINE चुनता है, debug ALL चुनता है, कोई भी java.util.logging.Level नाम जैसे SEVERE स्वीकार किया जाता है, और एक अज्ञात मान OFF पर वापस जाता है।

WARNING इंजन की चेतावनियों को गुजरने देता है; FINE, verbose सेटिंग, पार्सर के रिकवरी विवरणों को भी गुजरने देती है। AsposePdfLogging केवल org.aspose.pdf लॉगर सबट्री को बदलता है। यह रूट लॉगर के स्तर को नहीं बदलता, और लाइब्रेरी लॉगर रिकॉर्ड्स को रूट लॉगर के हैंडलर्स को पास नहीं करता। यदि लॉगिंग सक्षम है और लाइब्रेरी लॉगर से कोई हैंडलर संलग्न नहीं है, तो एक कंसोल हैंडलर स्थापित किया जाता है।

// Equivalent to starting the JVM with -Daspose.pdf.log=warning
AsposePdfLogging.setLevel(Level.WARNING);

System.setProperty(AsposePdfLogging.LOG_PROPERTY, "verbose");
AsposePdfLogging.configureFromSystemProperty();
System.out.println(AsposePdfLogging.getLevel());   // FINE

त्वरित प्रारंभ

अपनी बिल्ड में निर्भरता जोड़ें:

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-pdf-foss</artifactId>
  <version>26.8.0</version>
</dependency>

निम्न उदाहरण एक पृष्ठ बनाता है, एक हाइलाइट और एक फ्री-टेक्स्ट कॉलआउट जोड़ता है, और दस्तावेज़ को सहेजता है:

import org.aspose.pdf.*;
import org.aspose.pdf.annotations.*;

try (Document doc = new Document()) {
    Page page = doc.getPages().add();

    page.getAnnotations().add(new HighlightAnnotation(page, new Rectangle(100, 200, 300, 250)));

    FreeTextAnnotation note = new FreeTextAnnotation(page, new Rectangle(50, 50, 200, 100),
            new DefaultAppearance("Helv", 10, Color.BLACK));
    note.setContents("Check this value");
    note.setIntent(FreeTextIntent.FreeTextCallout);
    note.setCallout(new double[][] {{10, 10}, {50, 50}, {100, 100}});
    page.getAnnotations().add(note);

    doc.save("core-features.pdf");
}

समर्थित फ़ॉर्मेट्स

लाइब्रेरी के लोड और सेव विकल्पों तथा रेंडरिंग डिवाइसों द्वारा पुष्टि किया गया फ़ॉर्मेट समर्थन:

फ़ॉर्मेटएक्सटेंशनपढ़ेंलिखें
PDFpdf✓✓
HTMLhtml✓✓
DOCXdocx✓✓
DOCdoc✓✓
XFDFxfdf✓✓
BMPbmp—✓
GIFgif—✓
JPEGjpeg—✓
TIFFtiff—✓
Texttxt—✓

ओपन सोर्स & लाइसेंसिंग

Aspose.PDF FOSS for Java MIT लाइसेंस के तहत जारी किया गया है, जो व्यावसायिक उपयोग, संशोधन, और पुनर्वितरण की अनुमति देता है। स्रोत कोड और इश्यू ट्रैकर यहाँ उपलब्ध हैं: github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. लाइब्रेरी Java 11 या बाद के संस्करण को लक्ष्य करती है।


शुरू करना

संबंधित संसाधन