C++ में PDF दस्तावेज़ों के साथ काम कैसे करें
Aspose.PDF FOSS for C++ एक MIT-लाइसेंस वाला, निर्भरता-रहित C++20 लाइब्रेरी है जो CMake के साथ निर्मित और लिंक किया गया है — जोड़ने के लिए कोई पैकेज-मैनेजर इम्पोर्ट नहीं है। यह गाइड कोर Document-केंद्रित कार्यप्रवाह को दर्शाता है: मौजूदा PDF खोलें, उसके पृष्ठों और मेटाडेटा की जांच करें, टेक्स्ट निकालें, और एक पृष्ठ को रास्टर इमेज में रेंडर करें।
स्टेप-बाय-स्टेप गाइड
स्टेप 1: पैकेज स्थापित करें
रिपोजिटरी क्लोन करें और इसे अपनी CMake प्रोजेक्ट में सबडायरेक्टरी के रूप में जोड़ें:
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.gitadd_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)या इसे स्टैंडअलोन कॉन्फ़िगर करके बिल्ड करें:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildहेडर्स के विरुद्ध एक न्यूनतम प्रोग्राम को कॉम्पाइल करके टूलचेन की समाधानशीलता सत्यापित करें:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}एक सफल बिल्ड जो नई निर्मित, खाली Document के लिए pages: 0 प्रिंट करता है, यह पुष्टि करता है कि लाइब्रेरी सही ढंग से जुड़ी हुई है।
चरण 2: आवश्यक वर्ग आयात करें
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <aspose/pdf/page.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>चरण 3: एक PDF दस्तावेज़ खोलें और उसके पृष्ठों की गिनती करें
फ़ाइल पथ से एक Document बनाएं ताकि मौजूदा PDF खोल सकें। Document::Pages() PageCollection लौटाता है, और Count() बताता है कि इसमें कितने पृष्ठ हैं:
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";चरण 4: दस्तावेज़ मेटाडेटा पढ़ें
Document::Info() मानक /Info शब्दकोश प्रविष्टियों के लिए टाइप्ड पढ़ने/लिखने एक्सेसर वाले DocumentInfo ऑब्जेक्ट को लौटाता है:
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
std::cout << "Producer: " << info.Producer() << "\n";चरण 5: पृष्ठ से टेक्स्ट निकालें
Aspose::Pdf::Text::TextAbsorber एक Document या एकल Page को पार करता है और मिलने वाले टेक्स्ट को संग्रहीत करता है; Text() बाद में परिणाम लौटाता है। PageCollection 1-इंडेक्स्ड है, इसलिए Pages()[1] पहला पृष्ठ है:
auto page = doc.Pages()[1];
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";Visit() सीधे पूरे Document को (absorber.Visit(doc)) स्वीकार करता है जब आप प्रत्येक पृष्ठ का पाठ एक साथ जोड़ना चाहते हैं बजाय एकल पृष्ठ के।
चरण 6: पृष्ठ को रास्टर छवि में रेंडर करें
BmpDevice एक Page को अनकम्प्रेस्ड BMP छवि में रेंडर करता है। इसका कंस्ट्रक्टर एक Resolution लेता है जो आउटपुट DPI को नियंत्रित करता है, और Process() रेंडर किए गए बाइट्स को किसी भी std::ostream में लिखता है:
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);चरण 7: मेटाडेटा अपडेट करें और दस्तावेज़ सहेजें
DocumentInfo पर सेटर्स परिवर्तन को स्टेज करते हैं जो अगले बार Save() मालिक Document पर चलने पर फ्लश किए जाते हैं:
doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");सामान्य समस्याएँ और समाधान
Accessing Pages()[0] throws std::out_of_range
PageCollection 1-इंडेक्स्ड है, जो मानक Aspose.PDF सेमान्टिक्स से मेल खाता है — पहला पृष्ठ Pages()[1] है। 1 से कम या Count() से अधिक का इंडेक्स देने पर त्रुटि आती है।
TextAbsorber::Text() खाली स्ट्रिंग लौटाता है
Text() वह सब लौटाता है जो सबसे हालिया Visit() कॉल द्वारा जमा किया गया था। Text() पढ़ने से पहले यह पुष्टि करें कि Visit() वास्तव में कॉल किया गया था, और यह कि आप जिस पृष्ठ या दस्तावेज़ को देख रहे हैं वह केवल स्कैन की गई छवियों के बजाय निकाले जा सकने वाले टेक्स्ट को शामिल करता है।
रेंडर किया गया BMP फ़ाइल अप्रत्याशित रूप से छोटा या खाली दिखता है
एक कम Resolution मान एक छोटा रास्टर इमेज बनाता है। Resolution को पास किया गया DPI बढ़ाएँ — उदाहरण के लिए, प्रिंट-गुणवत्ता आउटपुट के लिए Resolution(300) — और पुष्टि करें कि Process() को पास किया गया पृष्ठ इंडेक्स वही है जो आप चाहते थे।
DocumentInfo फ़ील्ड वापस पढ़ने पर खाली स्ट्रिंग्स के रूप में आते हैं
हर PDF निर्माता मानक /Info एंट्री नहीं लिखता। यह मानने से पहले कि मेटाडाटा एक्सट्रैक्शन विफल हुआ है, Producer() और Creator() में खाली मानों की जाँच करें — अनुपस्थित कुंजी के लिए परिभाषित परिणाम एक खाली स्ट्रिंग है।
के साथ किए गए बदलाव Info().Title(...) सहेजी गई फ़ाइल में दिखाई नहीं देते
DocumentInfo में हुए परिवर्तन मेमोरी में स्टेज किए जाते हैं और केवल अगले बार Save() उसी Document इंस्टेंस पर चलने पर स्थायी होते हैं। सुनिश्चित करें कि मेटाडेटा संपादन Save() से पहले हो, बाद में नहीं।
अक्सर पूछे जाने वाले प्रश्न
क्या Aspose.PDF FOSS for C++ में पेज इंडेक्सिंग शून्य-आधारित है या एक-आधारित?
एक-आधारित। doc.Pages()[1] हमेशा पहला पेज है।
क्या TextAbsorber पूरे दस्तावेज़ के बजाय एक एकल पेज से टेक्स्ट निकाल सकता है?
हाँ। Visit() को इस तरह ओवरलोड किया गया है कि वह या तो एक Document स्वीकार करता है — जो प्रत्येक पेज का टेक्स्ट निकालता है — या एक एकल Page, जो केवल उस पेज का टेक्स्ट निकालता है।
क्या मुझे Save() को कॉल करने की आवश्यकता है यदि मैं केवल दस्तावेज़ से डेटा पढ़ता हूँ?
नहीं। Save() केवल उन परिवर्तनों के बाद आवश्यक है जिन्हें फ़ाइल में वापस लिखना होता है, जैसे DocumentInfo फ़ील्ड्स को संपादित करना। पेज काउंट पढ़ना, टेक्स्ट निकालना, या पेज रेंडर करना दस्तावेज़ को संशोधित नहीं करता।
मैं रेंडर किए गए पृष्ठ का रिज़ॉल्यूशन कैसे नियंत्रित करूँ?
डिवाइस के कंस्ट्रक्टर को एक Resolution मान पास करें — उदाहरण के लिए, 150 DPI के लिए Resolution(150)। उच्च मान बड़े, अधिक-फ़िडेलिटी रास्टर छवियाँ उत्पन्न करते हैं।
BmpDevice कौन सा फ़ॉर्मेट उत्पन्न करता है?
एक अनकंप्रेस्ड BMP इमेज जो सीधे std::ostream में लिखी जाती है, जिसे Process() को पास किया गया है।