Πώς να εργαστείτε με τις Facades API στο Aspose.PDF FOSS for C++

Πώς να εργαστείτε με τις Facades API στο Aspose.PDF FOSS for C++

Aspose.PDF FOSS for C++ ομαδοποιεί ένα σύνολο ανώτερων κλάσεων facade και επεξεργαστών — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor και PdfConverter μεταξύ τους — στον χώρο ονομάτων Aspose::Pdf::Facades. Κάθε μία τυλίγει μια μοναδική εργασία συντήρησης εγγράφου πάνω στον πυρήνα Document API, ώστε να μπορείτε να εξάγετε περιεχόμενο, να επεξεργαστείτε σελιδοδείκτες ή να συμπληρώσετε πεδία φόρμας χωρίς να υλοποιείτε χειροκίνητα τις υποκείμενες περιηγήσεις σε σελίδες και αντικείμενα. Αυτός ο οδηγός εστιάζει στο PdfExtractor, το facade που χρησιμοποιείται για την ανάκτηση ενσωματωμένων συνημμένων αρχείων, κειμένου σελίδας και ενσωματωμένων εικόνων από ένα υπάρχον PDF.

Οδηγός βήμα προς βήμα

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

Προσθέστε το Aspose.PDF FOSS for C++ ως υποκατάλογο 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)

Επιβεβαιώστε ότι η αλυσίδα εργαλείων και το βήμα σύνδεσης επιλύονται σωστά πριν γράψετε οποιονδήποτε κώδικα facade:

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() και εξάγετε τα bytes ενός συνημμένου στο δίσκο με το 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() κάθε ένα παίρνει μια κυριολεκτική διαδρομή εξόδου· η προσκηνία δεν δημιουργεί μοναδικά ονόματα αρχείων για εσάς. Δημιουργήστε μια ξεχωριστή διαδρομή ανά επανάληψη (π.χ., προσθέτοντας έναν αυξανόμενο μετρητή) όπως φαίνεται στα Βήματα 5 και 6.

Σφάλμα σύνδεσης: ακαθόριστη αναφορά προς aspose_pdf_foss σύμβολα. 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 και ακολουθούν το ίδιο πρότυπο include/construct που φαίνεται στα Βήματα 2 και 3 — το καθένα λειτουργεί μόνο σε διαφορετικό τμήμα του εγγράφου.

Μπορεί το PdfExtractor να διαβάσει ένα PDF προστατευμένο με κωδικό πρόσβασης;

Ορίστε τον κωδικό πρόσβασης πριν καλέσετε οποιαδήποτε μέθοδο εξαγωγής:

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

PdfExtractor::Password() είναι μια απλή ιδιότητα ανάγνωσης/εγγραφής, οπότε πρέπει να οριστεί πριν από το ExtractText(), ExtractImage() ή τις μεθόδους συνημμένων.

Τι συμβαίνει αν το PDF δεν έχει κείμενο, εικόνες ή συνημμένα προς εξαγωγή;

Δεν ρίχνεται εξαίρεση. Το GetAttachNames() επιστρέφει έναν κενό vector, και τα HasNextPageText() / HasNextImage() επιστρέφουν false στην πρώτη επαλήθευση, οπότε το αντίστοιχο σώμα του βρόχου απλώς δεν εκτελείται ποτέ.

Ποιο header πρέπει να συμπεριλάβω για μια συγκεκριμένη κλάση facade;

Κάθε facade class παρέχει το δικό της header στο aspose/pdf/facades/, ταιριάζοντας με το όνομα της κλάσης: pdf_extractor.hpp για PdfExtractor, pdf_bookmark_editor.hpp για PdfBookmarkEditor, form_editor.hpp για FormEditor, και bookmark.hpp για τους τύπους τιμών Bookmark / Bookmarks.

Δείτε επίσης

 Ελληνικά