C++ में दस्तावेज़ कैसे लोड करें

C++ में दस्तावेज़ कैसे लोड करें

Aspose.PDF FOSS for C++ मौजूदा PDF को Document क्लास के माध्यम से खोलता है — साधारण फ़ाइल पथ से, या जब स्रोत एन्क्रिप्टेड हो तो पासवर्ड के साथ — और फ़ाइल की /Info मेटाडेटा को DocumentInfo के माध्यम से उजागर करता है। यह गाइड दस्तावेज़ लोड करने, पासवर्ड-प्रोटेक्टेड फ़ाइलों का पता लगाने और खोलने, शीर्षक/लेखक/प्रोड्यूसर मेटाडेटा को पढ़ने और अपडेट करने, तथा परिणाम को सहेजने को कवर करता है। लाइब्रेरी को CMake के माध्यम से प्रोजेक्ट में जोड़ा जाता है; पैकेज-मैनेजर इंस्टॉल चरण नहीं है।

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

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

लाइब्रेरी को CMake सबडायरेक्टरी के रूप में जोड़ें और aspose_pdf_foss टार्गेट के खिलाफ लिंक करें:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

टूलचेन और हेडर्स के समाधान की पुष्टि करने के लिए एक न्यूनतम प्रोग्राम को कम्पाइल करें:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}

एक सफल बिल्ड जो pages: 0 प्रिंट करता है, यह पुष्टि करता है कि लाइब्रेरी सही ढंग से लिंक हुई है।


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

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>

using namespace Aspose::Pdf;

Document और DocumentInfo दोनों ही Aspose::Pdf नेमस्पेस के तहत सीधे घोषित किए गए हैं।


चरण 3: फ़ाइल पथ से PDF दस्तावेज़ खोलें

Document(filename) कन्स्ट्रक्टर फ़ाइल को पढ़ता है, उसकी क्रॉस-रेफ़रेंस टेबल और पेज ट्री को पार्स करता है, और इन-मेमोरी मॉडल बनाता है। जब फ़ाइल मौजूद नहीं होती या पढ़ी नहीं जा सकती, तो यह std::system_error थ्रो करता है, और जब फ़ाइल एक वैध PDF नहीं होती है तो std::runtime_error थ्रो करता है:

#include <iostream>
#include <stdexcept>

try {
    Document doc("input.pdf");
    std::cout << "Pages: " << doc.Pages().Count() << "\n";
} catch (const std::runtime_error& e) {
    std::cerr << "Not a valid PDF: " << e.what() << "\n";
} catch (const std::system_error& e) {
    std::cerr << "Could not read file: " << e.what() << "\n";
}

चरण 4: पासवर्ड-सुरक्षित दस्तावेज़ खोलें

चरण 3 का सिंगल-आर्ग्यूमेंट कन्स्ट्रक्टर कभी पासवर्ड को प्रमाणित नहीं करता या ट्रेलर के /Encrypt एंट्री की जाँच नहीं करता, इसलिए इस तरह खोले गए दस्तावेज़ पर IsEncrypted() हमेशा false रिपोर्ट करता है — भले ही स्रोत फ़ाइल वास्तव में एन्क्रिप्टेड हो। एन्क्रिप्टेड PDF का पता लगाने और खोलने के लिए, दो-आर्ग्यूमेंट कन्स्ट्रक्टर का उपयोग करें, जो /Encrypt पढ़ता है और आप द्वारा प्रदान किया गया पासवर्ड प्रमाणित करता है:

try {
    Document doc("input.pdf", "user-password");
    if (doc.IsEncrypted()) {
        std::cout << "Opened an encrypted document.\n";
    }
} catch (const std::runtime_error& e) {
    // Thrown when /Encrypt is present and the password matches
    // neither the user nor the owner entry in the trailer.
    std::cerr << "Wrong password or unreadable /Encrypt dictionary: "
              << e.what() << "\n";
}

यदि स्रोत PDF एन्क्रिप्टेड नहीं है, तो पासवर्ड आर्ग्यूमेंट को बस अनदेखा कर दिया जाता है और दस्तावेज़ सामान्य रूप से खुल जाता है — इसलिए दो-आर्ग्यूमेंट कन्स्ट्रक्टर का उपयोग करना सुरक्षित है, भले ही आपको फ़ाइल की सुरक्षा के बारे में निश्चित न हो।


चरण 5: DocumentInfo के साथ दस्तावेज़ मेटाडाटा पढ़ें

Document.Info() दस्तावेज़ की /Info शब्दकोश से बंधा एक DocumentInfo& लौटाता है। प्रत्येक पूर्वनिर्धारित फ़ील्ड का अपना रीड एक्सेसर होता है, जो स्रोत फ़ाइल में कुंजी अनुपलब्ध होने पर एक खाली स्ट्रिंग लौटाता है:

Document doc("input.pdf");
DocumentInfo& info = doc.Info();

std::cout << "Title: "    << info.Title()    << "\n";
std::cout << "Author: "   << info.Author()   << "\n";
std::cout << "Subject: "  << info.Subject()  << "\n";
std::cout << "Producer: " << info.Producer() << "\n";
std::cout << "Creator: "  << info.Creator()  << "\n";
std::cout << "Keywords: " << info.Keywords() << "\n";

DocumentInfo::IsPredefinedKey यह रिपोर्ट करता है कि दिया गया /Info कुंजी नाम इन अंतर्निहित फ़ील्ड्स में से एक है या नहीं, जो Add द्वारा जोड़ी गई कस्टम कुंजी से अलग है:

bool builtin = DocumentInfo::IsPredefinedKey("Title");   // true
bool custom  = DocumentInfo::IsPredefinedKey("MyKey");   // false

चरण 6: मेटाडेटा को अपडेट करें और दस्तावेज़ सहेजें

मेटाडेटा को मिलते-जुलते सेट्टर ओवरलोड्स के माध्यम से, या Document पर SetTitle सुविधा विधि के माध्यम से सेट करें, फिर परिवर्तन को Save से स्थायी बनाएं:

Document doc("input.pdf");
doc.Info().Author("Report Generator");
doc.SetTitle("Quarterly Report");   // equivalent to doc.Info().Title(title)

doc.Save("output.pdf");

मेटाडेटा संपादन मेमोरी में चरणबद्ध होते हैं और केवल अगले Save कॉल पर लिखे जाते हैं। नए पथ पर लिखने के लिए Save(outputFileName) को कॉल करें, या बिना-आर्ग्यूमेंट वाले Save() को कॉल करके उस फ़ाइल को ओवरराइट करें जिससे दस्तावेज़ मूल रूप से खोला गया था:

Document doc("input.pdf");
doc.SetTitle("Updated In Place");
doc.Save();   // writes back to "input.pdf"

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

IsEncrypted() returns false एक PDF जिसके बारे में मैं जानता हूँ कि वह पासवर्ड-सुरक्षित है

एक-आर्ग्युमेंट Document(path) कंस्ट्रक्टर कभी भी फ़ाइल की /Encrypt डिक्शनरी के विरुद्ध प्रमाणित नहीं करता, इसलिए IsEncrypted() हमेशा इस तरीके से खोले गए दस्तावेज़ पर false रिपोर्ट करता है, चाहे स्रोत वास्तव में एन्क्रिप्टेड हो या न हो। इसके बजाय दो-आर्ग्युमेंट Document(path, password) कंस्ट्रक्टर से फ़ाइल खोलें — यह एकमात्र ओवरलोड है जो एन्क्रिप्शन स्थिति को भरता है।

दो-आर्ग्युमेंट कन्स्ट्रक्टर अपवाद फेंकता है std::runtime_error

इसका मतलब है कि स्रोत PDF के ट्रेलर में एक /Encrypt प्रविष्टि है और दिया गया पासवर्ड न तो उपयोगकर्ता पासवर्ड और न ही वहाँ दर्ज मालिक पासवर्ड से मेल खाता है। std::runtime_error को पकड़ें और सही पासवर्ड के लिए प्रॉम्प्ट दिखाएँ, या पुनः प्रयास करने से पहले पासवर्ड को ऑउट-ऑफ़-बैंड पुष्टि करें।

Save() फेंकता है “no source filename to save to”

नो-आर्ग्युमेंट Save() उस पथ पर लिखता है जिससे दस्तावेज़ बनाया गया था। नो-आर्ग्युमेंट कंस्ट्रक्टर से निर्मित Document — एक नया, इन-मेमोरी दस्तावेज़ जिसमें कोई स्रोत फ़ाइल नहीं है — के पास लिखने के लिए कोई पथ नहीं होता, इसलिए Save() फेंकता है। इसके बजाय Save(outputFileName) को कॉल करें।

Decrypt() ऐसा नहीं लगता कि यह बिना सुरक्षा वाली फ़ाइल बनाता है

Decrypt() इन-मेमोरी IsEncrypted() फ़्लैग को साफ़ करता है ताकि नीचे की पढ़ाइयाँ दस्तावेज़ को प्लेनटेक्स्ट मानें, लेकिन वर्तमान रिलीज़ में यह ट्रेलर की /Encrypt डिक्शनरी को पुनः लिखता नहीं है या एन्क्रिप्टेड स्ट्रिंग्स और स्ट्रीम्स को पुनः एन्कोड नहीं करता। Decrypt() के बाद Save() कॉल अभी भी मूल बाइट्स को लिखता है, जिसमें मूल एन्क्रिप्शन शामिल है — यह मेथड अभी डिस्क पर प्लेनटेक्स्ट कॉपी उत्पन्न नहीं करता।

Title/Author/etc. खाली स्ट्रिंग्स के रूप में प्रिंट होते हैं

DocumentInfo एक्सेसर खाली स्ट्रिंग लौटाते हैं, त्रुटि नहीं, जब संबंधित /Info कुंजी स्रोत PDF से अनुपस्थित हो। खाली परिणाम का अर्थ है कि फ़ील्ड उस दस्तावेज़ पर कभी सेट नहीं किया गया था, न कि पढ़ना विफल हुआ।

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

क्या Document(path) एन्क्रिप्टेड PDF पर काम करता है?

यह सामान्यतः पेज ट्री को बिना अपवाद फेंके पार्स करता है, लेकिन यह कभी पासवर्ड को प्रमाणित नहीं करता और हमेशा IsEncrypted() को false पर छोड़ देता है। स्रोत संभवतः एन्क्रिप्टेड हो तो दो-तर्कीय कंस्ट्रक्टर का उपयोग करें।

क्या ऐसी फ़ाइल के लिए जिसमें एन्क्रिप्शन नहीं है, Document(path, password) को पासवर्ड पास करना सुरक्षित है?

हाँ। जब ट्रेलर में /Encrypt प्रविष्टि नहीं होती, तो पासवर्ड तर्क को नजरअंदाज़ कर दिया जाता है और दस्तावेज़ उसी तरह खुलता है जैसे कि सिंगल-आर्ग्यूमेंट कंस्ट्रक्टर के साथ खुलता।

मैं कस्टम /Info कुंजी को बिल्ट-इन से कैसे अलग पहचानूँ?

स्थैतिक DocumentInfo::IsPredefinedKey(key) को कॉल करें। यह Title, Author, Subject, Keywords, Creator, Producer, और Trapped के लिए true लौटाता है, और अन्य सभी के लिए false।

क्या मैं अभी लोड की गई फ़ाइल को नई पथ पर लिखने के बजाय ओवरराइट कर सकता हूँ?

हाँ — फ़ाइल पथ से निर्मित Document पर बिना-आर्गुमेंट Save() को कॉल करें; यह उसी स्रोत पथ पर वापस लिखता है। यह उन दस्तावेज़ों के लिए त्रुटि देता है जो बिना-आर्गुमेंट कंस्ट्रक्टर से बने होते हैं, जिनकी कोई स्रोत पथ नहीं होती।

क्या Decrypt() के बाद सहेजने से PDF की पासवर्ड सुरक्षा हट जाती है?

नहीं, वर्तमान रिलीज़ में नहीं — ऊपर Common Issues देखें। Decrypt() केवल कंटेंट रीडर्स द्वारा उपयोग की जाने वाली मेमोरी में स्थित स्थिति को प्रभावित करता है; Save() द्वारा लिखी गई फ़ाइल अभी भी मूल /Encrypt शब्दकोश को रखती है।

यह भी देखें

 हिन्दी