วิธีทำงานกับ Facades API ใน Aspose.PDF FOSS for C++

วิธีทำงานกับ 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.git
add_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.

ดูเพิ่มเติม

 ภาษาไทย