Cara Bekerja dengan Facades API di Aspose.PDF FOSS for C++
Aspose.PDF FOSS untuk C++ mengelompokkan sekumpulan kelas facade dan editor tingkat tinggi — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor, dan PdfConverter di antaranya — dalam namespace Aspose::Pdf::Facades. Masing-masing membungkus satu tugas pemeliharaan dokumen di atas API inti Document, sehingga Anda dapat mengekstrak konten, mengedit penanda buku, atau mengisi bidang formulir tanpa harus menulis secara manual penjelajahan halaman dan objek di bawahnya. Panduan ini berfokus pada PdfExtractor, facade yang digunakan untuk mengambil lampiran file tertanam, teks halaman, dan gambar tertanam dari PDF yang ada.
Panduan Langkah demi Langkah
Langkah 1: Instal Paket
Tambahkan Aspose.PDF FOSS untuk C++ sebagai subdirektori CMake dan tautkan target pustaka statis:
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)Pastikan toolchain dan langkah penautan terselesaikan dengan benar sebelum menulis kode facade apa pun:
cmake -S . -B build
cmake --build buildBuild bersih dengan kompiler C++20 memastikan aspose_pdf_foss ditautkan ke your_app.
Langkah 2: Impor Kelas yang Diperlukan
PdfExtractor berada di bawah aspose/pdf/facades/, bersama Document dari namespace inti:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;Langkah 3: Kaitkan Dokumen ke PdfExtractor
Setiap kelas facade diturunkan dari basis Facade yang umum yang mengekspos BindPdf(srcFile) dan BindPdf(srcDoc) untuk melampirkannya ke dokumen setelah konstruksi. PdfExtractor juga menerima Document yang sudah terbuka langsung di konstruktor-nya, yang merupakan pola yang digunakan di seluruh panduan ini:
Document doc("input.pdf");
PdfExtractor extractor(doc);Langkah 4: Ekstrak Lampiran File yang Disematkan
Periksa Document::EmbeddedFiles() terlebih dahulu, lalu baca nama lampiran dengan GetAttachNames() dan tarik byte lampiran ke disk dengan 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");
}Langkah 5: Ekstrak Teks dari Setiap Halaman
ExtractText() diikuti oleh GetText() menulis seluruh teks dokumen ke satu file:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");Untuk menangkap satu file per halaman sebagai gantinya, atur rentang halaman dengan StartPage() / EndPage(), kemudian jalankan HasNextPageText() / GetNextPageText() dalam sebuah loop, memberikan setiap pemanggilan jalur outputnya sendiri:
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;
}Langkah 6: Ekstrak Gambar yang Disematkan
ExtractImage() mempersiapkan kursor gambar; HasNextImage() / GetNextImage() kemudian melintasi gambar satu per satu, menulis masing-masing ke jalur yang Anda berikan:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}Masalah Umum dan Solusinya
GetAttachNames() mengembalikan vektor kosong. PDF sumber tidak memiliki file tersemat. Periksa doc.EmbeddedFiles().Count() sebelum memanggil metode lampiran apa pun pada PdfExtractor sehingga Anda tidak mencoba mengekstrak dari dokumen yang tidak pernah memiliki lampiran.
Loop teks-halaman tidak pernah masuk ke dalam tubuh. HasNextPageText() returns false segera jika StartPage() / EndPage() tidak pernah diatur, atau jika diatur ke rentang di luar jumlah halaman sebenarnya dari dokumen. Atur rentang secara eksplisit dari doc.Pages().Count() sebelum memeriksa HasNextPageText().
GetNextImage() returns false pada pemanggilan pertama. ExtractImage() harus dipanggil sekali untuk mempersiapkan kursor gambar sebelum Anda memeriksa HasNextImage() atau panggil GetNextImage(). Memanggil GetNextImage() tanpa sebelumnya ExtractImage() pemanggilan ExtractImage() pertama.
Setiap gambar atau file teks halaman yang diekstrak akan menimpa yang sebelumnya. GetNextImage() and GetNextPageText() masing-masing mengambil jalur output literal; facade tidak menghasilkan nama file unik untuk Anda. Bangun jalur yang berbeda per iterasi (misalnya, dengan menambahkan penghitung yang meningkat) seperti yang ditunjukkan pada Steps 5 dan 6.
Kesalahan tautan: referensi tidak terdefinisi ke aspose_pdf_foss simbol. Confirm add_subdirectory() menunjuk pada akar repositori yang dikloning dan bahwa target_link_libraries() menamai aspose_pdf_foss target secara tepat, dengan standar C++20 yang dikonfigurasi untuk your_app.
Pertanyaan yang Sering Diajukan
Apa perbedaan antara Facade API dan Document inti API?
Core Document API (Document, PageCollection, Annotation, dan seterusnya) mengekspos model objek PDF secara langsung. Kelas facade seperti PdfExtractor berada di atasnya dan membungkus tugas multi-langkah tertentu — mengekstrak konten, mengedit bookmark, mengisi bidang formulir — di balik antarmuka yang lebih sempit dan khusus.
Bisakah saya mengedit bookmark atau mengisi bidang formulir dengan cara yang sama seperti saya mengekstrak konten menggunakan PdfExtractor?
Ya. PdfBookmarkEditor (dengan CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks(), dan DeleteBookmarks()) dan FormEditor (dengan AddField(), RemoveField(), dan SetFieldAttribute()) berada dalam namespace Aspose::Pdf::Facades yang sama dan mengikuti pola include/konstruksi yang sama seperti yang ditunjukkan pada Langkah 2 dan 3 — masing-masing hanya beroperasi pada bagian dokumen yang berbeda.
Bisakah PdfExtractor membaca PDF yang dilindungi kata sandi?
Setel kata sandi sebelum memanggil metode ekstraksi apa pun:
extractor.Password("owner-or-user-password");PdfExtractor::Password() adalah properti baca/tulis biasa, jadi harus diatur sebelum ExtractText(), ExtractImage(), atau metode lampiran.
Apa yang terjadi jika PDF tidak memiliki teks, gambar, atau lampiran untuk diekstrak?
Tidak ada yang melempar. GetAttachNames() mengembalikan vektor kosong, dan HasNextPageText() / HasNextImage() mengembalikan false pada pemeriksaan pertama, sehingga tubuh loop yang bersangkutan tidak pernah dijalankan.
Header apa yang harus saya sertakan untuk kelas fasad tertentu?
Setiap kelas fasad menyertakan headernya sendiri di bawah aspose/pdf/facades/, yang cocok dengan nama kelas: pdf_extractor.hpp untuk PdfExtractor, pdf_bookmark_editor.hpp untuk PdfBookmarkEditor, form_editor.hpp untuk FormEditor, dan bookmark.hpp untuk tipe nilai Bookmark / Bookmarks.