Πώς να δουλέψετε με έγγραφα PDF σε C++

Πώς να δουλέψετε με έγγραφα PDF σε C++

Aspose.PDF FOSS for C++ είναι μια βιβλιοθήκη C++20 ανοιχτού κώδικα με άδεια MIT, χωρίς εξαρτήσεις, που κατασκευάζεται και συνδέεται με CMake — δεν υπάρχει εισαγωγή μέσω διαχειριστή πακέτων. Αυτός ο οδηγός περιγράφει τη βασική ροή εργασίας με κεντρικό Document: άνοιγμα υπάρχοντος PDF, επιθεώρηση των σελίδων και των μεταδεδομένων, εξαγωγή κειμένου και απόδοση μιας σελίδας σε raster εικόνα.

Οδηγός βήμα-βήμα

Βήμα 1: Εγκατάσταση του πακέτου

Κλωνοποιήστε το αποθετήριο και προσθέστε το στο έργο CMake ως υποκατάλογο:

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 -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";
}

Μια επιτυχημένη κατασκευή που εκτυπώνει pages: 0 για το πρόσφατα δημιουργημένο, κενό Document επιβεβαιώνει ότι η βιβλιοθήκη είναι συνδεδεμένη σωστά.


Βήμα 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() επιστρέφει ένα αντικείμενο DocumentInfo με τυποποιημένους αναγνώστες/γράφτες για τις τυπικές καταχωρήσεις του λεξικού /Info:

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: Απόδοση της Σελίδας σε εικόνα Raster

BmpDevice αποδίδει ένα Page σε μια μη συμπιεσμένη εικόνα BMP. Ο κατασκευαστής του δέχεται ένα Resolution που ελέγχει το DPI εξόδου, και Process() γράφει τα αποδομένα bytes σε οποιοδήποτε 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: Ενημέρωση Μεταδεδομένων και Αποθήκευση του Εγγράφου

Οι setters στο 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(). Επιβεβαιώστε ότι το Visit() κλήθηκε πραγματικά πριν διαβάσετε το Text(), και ότι η σελίδα ή το έγγραφο που επισκεφθήκατε περιέχει κείμενο που μπορεί να εξαχθεί και όχι μόνο σαρωμένες εικόνες.

Το παραχθέν αρχείο BMP είναι απροσδόκητα μικρό ή φαίνεται κενό

Μια χαμηλή τιμή του Resolution παράγει μικρή raster εικόνα. Αυξήστε το DPI που περνάει στο Resolution — για παράδειγμα, Resolution(300) για έξοδο εκτύπωσης υψηλής ποιότητας — και επιβεβαιώστε ότι ο δείκτης σελίδας που περνάει στο Process() είναι αυτός που θέλετε.

DocumentInfo τα πεδία διαβάζονται ξανά ως κενές συμβολοσειρές

Δεν γράφει κάθε παραγωγός PDF τυπικές καταχωρήσεις /Info. Ελέγξτε το Producer() και το Creator() για κενές τιμές πριν υποθέσετε ότι η εξαγωγή μεταδεδομένων απέτυχε — μια κενή συμβολοσειρά είναι το ορισμένο αποτέλεσμα για ένα μη υπάρχον κλειδί.

Αλλαγές που έγιναν με Info().Title(...) δεν εμφανίζονται στο αποθηκευμένο αρχείο

DocumentInfo οι μεταβολές προετοιμάζονται στη μνήμη και αποθηκεύονται μόνιμα την επόμενη φορά που το Save() εκτελείται στην ίδια Document παρουσία. Βεβαιωθείτε ότι η επεξεργασία μεταδεδομένων συμβαίνει πριν το Save(), όχι μετά.

Συχνές Ερωτήσεις

Η αρίθμηση των σελίδων είναι μηδενική ή μονάδα-βάση στο Aspose.PDF FOSS για C++;

Μονάδα-βάση. Το doc.Pages()[1] είναι πάντα η πρώτη σελίδα.

Μπορεί το TextAbsorber να εξάγει κείμενο από μία μόνο σελίδα αντί για ολόκληρο το έγγραφο;

Ναι. Το Visit() είναι υπερφορτωμένο ώστε να δέχεται είτε ένα Document — που εξάγει το κείμενο όλων των σελίδων — είτε ένα μεμονωμένο Page, που εξάγει μόνο το κείμενο της συγκεκριμένης σελίδας.

Χρειάζεται να καλέσω το Save() αν μόνο διαβάζω δεδομένα από το έγγραφο;

Όχι. Το Save() απαιτείται μόνο μετά από αλλαγές που πρέπει να γραφτούν πίσω σε αρχείο, όπως η επεξεργασία πεδίων DocumentInfo. Η ανάγνωση του αριθμού σελίδων, η εξαγωγή κειμένου ή η απόδοση μιας σελίδας δεν τροποποιεί το έγγραφο.

Πώς ελέγχω την ανάλυση μιας αποδομένης σελίδας;

Περάστε μια τιμή Resolution στον κατασκευαστή της συσκευής — για παράδειγμα, Resolution(150) για 150 DPI. Οι υψηλότερες τιμές παράγουν μεγαλύτερες, υψηλότερης πιστότητας εικόνες raster.

Ποια μορφή παράγει το BmpDevice;

Μία ασυμπίεστη εικόνα BMP που γράφεται απευθείας στο std::ostream που περνάται στο Process().

Δείτε επίσης

 Ελληνικά