כיצד לעבוד עם ה-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: התקנת החבילה

הוסף את 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)

אשר שרצף כלי הפיתוח ושלב הקישור מתבצעים בצורה נכונה לפני כתיבת קוד פאסדה כלשהו:

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() כל אחד לוקח נתיב פלט מילולי; הפסקה אינה מייצרת שמות קבצים ייחודיים עבורך. בנה נתיב נפרד לכל איטרציה (למשל, על-ידי הוספת מונה עולה) כפי שמוצג בשלבים 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() מחזירה וקטור ריק, ו-HasNextPageText() / HasNextImage() מחזירים false בבדיקה הראשונה, ולכן גוף הלולאה המתאים פשוט אף פעם לא רץ.

איזה קובץ כותרת עליי לכלול עבור מחלקת חזית ספציפית?

כל מחלקת חזית כוללת את קובץ הכותרת שלה תחת aspose/pdf/facades/, תואם לשם המחלקה: pdf_extractor.hpp עבור PdfExtractor, pdf_bookmark_editor.hpp עבור PdfBookmarkEditor, form_editor.hpp עבור FormEditor, ו-bookmark.hpp עבור סוגי הערכים Bookmark / Bookmarks.

ראה גם

 עברית