כיצד לעבוד עם מסמכי PDF ב-C++
Aspose.PDF FOSS for C++ היא ספריית C++20 ברישיון MIT, ללא תלות, שנבנית ומקושרת עם 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";
}בנייה מוצלחת שמדפיסה 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: רינדור הדף לתמונה רסטרית
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(). יש לוודא ש-Visit() אכן קראו לפני קריאת Text(), ושהדף או המסמך שבו ביקרת מכיל טקסט שניתן לחילוץ ולא רק תמונות סרוקות.
קובץ BMP המוגש קטן באופן בלתי צפוי או נראה ריק
ערך Resolution נמוך מייצר תמונת רסטר קטנה. הגדל את ה-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. ערכים גבוהים יותר מייצרים תמונות רסטר גדולות ובאיכות גבוהה יותר.
איזה פורמט מייצר BmpDevice?
תמונה BMP לא דחוסה שנכתבת ישירות ל-std::ostream שהועבר ל-Process().