วิธีทำงานกับ Facades API ใน Aspose.PDF FOSS for C++
Aspose.PDF FOSS for C++ จัดกลุ่มคลาส facade และ editor ระดับสูงหลายคลาส — 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.gitadd_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)ยืนยันว่า toolchain และขั้นตอนการลิงก์ทำงานอย่างถูกต้องก่อนเขียนโค้ด facade ใด ๆ:
cmake -S . -B build
cmake --build buildการคอมไพล์แบบสะอาดด้วยคอมไพเลอร์ C++20 ยืนยันว่า aspose_pdf_foss ถูกลิงก์เข้าไปใน your_app.
ขั้นตอนที่ 2: นำเข้าคลาสที่จำเป็น
PdfExtractor อยู่ภายใต้ aspose/pdf/facades/, ควบคู่กับ Document จาก core namespace:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;ขั้นตอนที่ 3: ผูกเอกสารกับ PdfExtractor
ทุกคลาส facade สืบทอดจากฐาน 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() ต้องถูกเรียกหนึ่งครั้งเพื่อเตรียม cursor ของภาพก่อนที่คุณจะตรวจสอบ 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.
คำถามที่พบบ่อย
ความแตกต่างระหว่าง Facades API กับ Document API แกนกลางคืออะไร?
ส่วนกลางของ Document API (Document, PageCollection, Annotation เป็นต้น) เปิดเผยโมเดลอ็อบเจกต์ PDF โดยตรง คลาส Facade เช่น PdfExtractor ทำงานอยู่บนสุดและรวมงานหลายขั้นตอนเฉพาะ — การสกัดเนื้อหา, การแก้ไขบุ๊กมาร์ก, การกรอกฟิลด์ฟอร์ม — ไว้เบื้องหลังอินเทอร์เฟซที่แคบและออกแบบมาเพื่อวัตถุประสงค์เฉพาะ.
ฉันสามารถแก้ไขบุ๊กมาร์กหรือกรอกฟิลด์ฟอร์มในแบบเดียวกับที่ฉันสกัดเนื้อหาด้วย PdfExtractor ได้หรือไม่?
ใช่. PdfBookmarkEditor (พร้อม CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks(), และ DeleteBookmarks()) และ FormEditor (พร้อม AddField(), RemoveField(), และ SetFieldAttribute()) อยู่ใน namespace Aspose::Pdf::Facades เดียวกันและปฏิบัติตามรูปแบบการ include/construct เดียวกันที่แสดงในขั้นตอนที่ 2 และ 3 — แต่ละตัวทำงานกับส่วนต่าง ๆ ของเอกสาร.
สามารถ PdfExtractor อ่าน PDF ที่ป้องกันด้วยรหัสผ่านได้หรือไม่?
ตั้งรหัสผ่านก่อนเรียกใช้เมธอดการสกัดข้อมูลใดๆ:
extractor.Password("owner-or-user-password");PdfExtractor::Password() เป็นคุณสมบัติการอ่าน/เขียนแบบธรรมดา ดังนั้นต้องตั้งค่าก่อน ExtractText(), ExtractImage() หรือเมธอดการแนบไฟล์.
จะเกิดอะไรขึ้นหาก PDF ไม่มีข้อความ ภาพ หรือไฟล์แนบที่ต้องสกัดออก?
ไม่มีข้อยกเว้นใดๆ GetAttachNames() คืนค่าเวกเตอร์ว่างเปล่า และ HasNextPageText() / HasNextImage() คืนค่า false ในการตรวจสอบครั้งแรก ดังนั้นส่วนของลูปที่สอดคล้องกันจึงไม่ทำงานเลย.
ฉันควรรวม header ใดสำหรับคลาส facade เฉพาะ?
แต่ละคลาส facade จะมาพร้อมกับ header ของตนเองภายใต้ aspose/pdf/facades/ โดยใช้ชื่อคลาสตรงกัน: pdf_extractor.hpp สำหรับ PdfExtractor, pdf_bookmark_editor.hpp สำหรับ PdfBookmarkEditor, form_editor.hpp สำหรับ FormEditor, และ bookmark.hpp สำหรับประเภทค่า Bookmark / Bookmarks.