कैसे काम करें Facades API के साथ Aspose.PDF FOSS for C++ में

कैसे काम करें Facades API के साथ Aspose.PDF FOSS for C++ में

Aspose.PDF FOSS for C++ उच्च-स्तरीय फ़ेसाद और संपादक क्लासों का एक सेट समूहित करता है — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor, और PdfConverter इनके बीच — Aspose::Pdf::Facades नेमस्पेस में। प्रत्येक एक कोर Document API के ऊपर एकल दस्तावेज़-रखरखाव कार्य को लपेटता है, जिससे आप सामग्री निकाल सकते हैं, बुकमार्क संपादित कर सकते हैं, या फ़ॉर्म फ़ील्ड भर सकते हैं बिना स्वयं नीचे की पेज और ऑब्जेक्ट वॉक्स को हाथ से लिखे। यह गाइड PdfExtractor पर केंद्रित है, वह फ़ेसाद जिसका उपयोग एम्बेडेड फ़ाइल अटैचमेंट्स, पेज टेक्स्ट, और एम्बेडेड इमेजेस को मौजूदा PDF से निकालने के लिए किया जाता है।

स्टेप-बाय-स्टेप गाइड

चरण 1: पैकेज स्थापित करें

CMake सबडायरेक्टरी के रूप में Aspose.PDF FOSS for C++ जोड़ें और स्थैतिक लाइब्रेरी टार्गेट को लिंक करें:

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.git
add_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

फ़ेसाद कोड लिखने से पहले टूलचेन और लिंक चरण सही ढंग से हल हो रहे हैं, यह पुष्टि करें:

cmake -S . -B build
cmake --build build

C++20 कंपाइलर के खिलाफ एक साफ़ बिल्ड यह पुष्टि करता है कि aspose_pdf_foss को your_app में लिंक किया गया है।


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

PdfExtractor aspose/pdf/facades/ के तहत स्थित है, साथ ही कोर नेमस्पेस से Document के साथ:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;

चरण 3: एक दस्तावेज़ को PdfExtractor से बाँधें

हर फ़ेसाड क्लास एक सामान्य Facade बेस से व्युत्पन्न होती है जो निर्माण के बाद इसे दस्तावेज़ से जोड़ने के लिए BindPdf(srcFile) और BindPdf(srcDoc) को उजागर करती है। PdfExtractor अपने कंस्ट्रक्टर में सीधे पहले से खुले Document को भी स्वीकार करता है, जो इस गाइड में पूरे समय उपयोग किया गया पैटर्न है:

Document doc("input.pdf");
PdfExtractor extractor(doc);

चरण 4: एम्बेडेड फ़ाइल अटैचमेंट्स निकालें

पहले Document::EmbeddedFiles() जांचें, फिर GetAttachNames() से अटैचमेंट नाम पढ़ें और GetAttachment() से अटैचमेंट के बाइट्स को डिस्क पर निकालें:

#include <iostream>

if (doc.EmbeddedFiles().Count() > 0) {
    std::vector<std::string> names = extractor.GetAttachNames();
    for (const auto& name : names) {
        std::cout << "Attachment: " << name << "\n";
    }

    // Writes the bytes of the first attachment to disk
    extractor.GetAttachment("extracted_attachment.bin");
}

चरण 5: प्रत्येक पृष्ठ से टेक्स्ट निकालें

ExtractText() के बाद GetText() पूरे दस्तावेज़ का टेक्स्ट एक ही फ़ाइल में लिखता है:

extractor.ExtractText();
extractor.GetText("extracted_text.txt");

एक पृष्ठ पर एक फ़ाइल कैप्चर करने के लिए, पृष्ठ रेंज को StartPage() / EndPage() से सेट करें, फिर एक लूप में HasNextPageText() / GetNextPageText() चलाएँ, प्रत्येक कॉल को उसका अपना आउटपुट पाथ दें:

extractor.StartPage(1);
extractor.EndPage(doc.Pages().Count());

int pageNumber = extractor.StartPage();
while (extractor.HasNextPageText()) {
    std::string outputFile = "page_" + std::to_string(pageNumber) + ".txt";
    extractor.GetNextPageText(outputFile);
    ++pageNumber;
}

चरण 6: एम्बेडेड इमेजेज निकालें

ExtractImage() इमेज कर्सर को तैयार करता है; फिर HasNextImage() / GetNextImage() एक-एक करके इमेजेज को चलाते हैं, प्रत्येक को उस पाथ पर लिखते हैं जो आप पास करते हैं:

extractor.ExtractImage();

int imageIndex = 1;
while (extractor.HasNextImage()) {
    std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
    if (extractor.GetNextImage(outputFile)) {
        ++imageIndex;
    }
}

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

GetAttachNames() एक खाली वेक्टर वापस करता है। स्रोत PDF में कोई एम्बेडेड फ़ाइलें नहीं हैं। जाँच करें doc.EmbeddedFiles().Count() किसी भी अटैचमेंट मेथड को कॉल करने से पहले PdfExtractor ताकि आप ऐसे दस्तावेज़ से निकालने का प्रयास न करें जिसमें कभी अटैचमेंट नहीं थे।

पेज-टेक्स्ट लूप कभी बॉडी में प्रवेश नहीं करता। HasNextPageText() returns false तुरंत यदि StartPage() / EndPage() कभी सेट नहीं किए गए थे, या यदि उन्हें दस्तावेज़ की वास्तविक पृष्ठ गिनती के बाहर की रेंज पर सेट किया गया था। रेंज को स्पष्ट रूप से इस से सेट करें doc.Pages().Count() जाँचने से पहले HasNextPageText().

GetNextImage() returns false पहली कॉल पर। ExtractImage() जाँच करने से पहले इमेज कर्सर को प्राइम करने के लिए इसे एक बार कॉल किया जाना चाहिए HasNextImage() या कॉल करें GetNextImage(). कॉल करना GetNextImage() पहले के बिना ExtractImage() कॉल कॉलर के दृष्टिकोण से अपरिभाषित है — हमेशा कॉल करें ExtractImage() पहले।

प्रत्येक निकाला गया इमेज या पेज-टेक्स्ट फ़ाइल पिछले को ओवरराइट कर देती है। GetNextImage() and GetNextPageText() प्रत्येक एक वास्तविक आउटपुट पथ लेता है; फ़ेसाड आपके लिए अद्वितीय फ़ाइलनाम नहीं बनाता। प्रत्येक पुनरावृत्ति के लिए एक अलग पथ बनाएं (उदाहरण के लिए, एक बढ़ते काउंटर को जोड़कर) जैसा कि Steps 5 और 6 में दिखाया गया है।

लिंक त्रुटि: अपरिभाषित रेफ़रेंस टू aspose_pdf_foss symbols. Confirm add_subdirectory() क्लोन किए गए रिपॉजिटरी रूट की ओर संकेत करता है और वह target_link_libraries() नाम देता है aspose_pdf_foss टारगेट को ठीक-ठीक नाम देता है, C++20 मानक के साथ कॉन्फ़िगर किया गया your_app.

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

फ़ेसाड्स API और कोर डॉक्यूमेंट API में क्या अंतर है?

कोर Document API (Document, PageCollection, Annotation, आदि) PDF ऑब्जेक्ट मॉडल को सीधे उजागर करता है। PdfExtractor जैसी फ़ेसाड क्लासेस इसके ऊपर स्थित होती हैं और एक विशिष्ट बहु-चरणीय कार्य — सामग्री निकालना, बुकमार्क संपादित करना, फ़ॉर्म फ़ील्ड भरना — को एक संकीर्ण, उद्देश्य-निर्मित इंटरफ़ेस के पीछे पैकेज करती हैं।

क्या मैं PdfExtractor के साथ सामग्री निकालने की ही तरह बुकमार्क संपादित कर सकता हूँ या फ़ॉर्म फ़ील्ड भर सकता हूँ?

हाँ। PdfBookmarkEditor (CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks(), और DeleteBookmarks() के साथ) और FormEditor (AddField(), RemoveField(), और SetFieldAttribute() के साथ) एक ही Aspose::Pdf::Facades नेमस्पेस में स्थित हैं और चरण 2 और 3 में दिखाए गए समान include/construct पैटर्न का पालन करते हैं — प्रत्येक दस्तावेज़ के अलग भाग पर काम करता है।

क्या PdfExtractor पासवर्ड-संरक्षित PDF को पढ़ सकता है?

किसी भी निष्कर्षण विधि को कॉल करने से पहले पासवर्ड सेट करें:

extractor.Password("owner-or-user-password");

PdfExtractor::Password() एक साधारण पढ़ने/लिखने वाली प्रॉपर्टी है, इसलिए इसे ExtractText(), ExtractImage() या अटैचमेंट मेथड्स से पहले सेट किया जाना चाहिए।

यदि PDF में निकालने के लिए कोई टेक्स्ट, इमेज या अटैचमेंट नहीं है तो क्या होता है?

कुछ भी एक्सेप्शन नहीं फेंकेगा। GetAttachNames() एक खाली वेक्टर रिटर्न करता है, और HasNextPageText() / HasNextImage() पहले चेक पर false रिटर्न करते हैं, इसलिए संबंधित लूप बॉडी कभी नहीं चलती।

किस फ़ेसाड क्लास के लिए मुझे कौन सा हेडर शामिल करना चाहिए?

प्रत्येक फ़ेसाड क्लास अपना हेडर aspose/pdf/facades/ के अंतर्गत प्रदान करती है, जो क्लास नाम से मेल खाता है: pdf_extractor.hpp PdfExtractor के लिए, pdf_bookmark_editor.hpp PdfBookmarkEditor के लिए, form_editor.hpp FormEditor के लिए, और bookmark.hpp Bookmark / Bookmarks वैल्यू टाइप्स के लिए।

यह भी देखें

 हिन्दी