Cara Bekerja dengan Dokumen PDF di C++

Cara Bekerja dengan Dokumen PDF di C++

Aspose.PDF FOSS untuk C++ adalah perpustakaan C++20 berlisensi MIT, bebas ketergantungan yang dibangun dan ditautkan dengan CMake — tidak ada impor manajer paket yang perlu ditambahkan. Panduan ini menjelaskan alur kerja inti yang berfokus pada Document: membuka PDF yang ada, memeriksa halaman dan metadata-nya, mengekstrak teks, dan merender sebuah halaman menjadi gambar raster.

Panduan Langkah demi Langkah

Langkah 1: Instal Paket

Klon repositori dan tambahkan ke proyek CMake Anda sebagai subdirektori:

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)

Atau konfigurasikan dan bangun secara mandiri:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

Verifikasi toolchain berhasil dengan mengompilasi program minimal melawan header:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}

Build yang berhasil yang mencetak pages: 0 untuk Document yang baru dibangun dan kosong mengonfirmasi bahwa perpustakaan terhubung dengan benar.


Langkah 2: Impor Kelas yang Diperlukan

#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>

Langkah 3: Buka Dokumen PDF dan Hitung Halamannya

Bangun sebuah Document dari jalur file untuk membuka PDF yang sudah ada. Document::Pages() mengembalikan PageCollection, dan Count() melaporkan berapa banyak halaman yang dimilikinya:

Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";

Langkah 4: Baca Metadata Dokumen

Document::Info() mengembalikan objek DocumentInfo dengan aksesors baca/tulis bertipe untuk entri kamus /Info standar:

auto& info = doc.Info();
std::cout << "Title: "    << info.Title()    << "\n";
std::cout << "Author: "   << info.Author()   << "\n";
std::cout << "Producer: " << info.Producer() << "\n";

Langkah 5: Ekstrak Teks dari Halaman

Aspose::Pdf::Text::TextAbsorber menelusuri Document atau Page tunggal dan mengumpulkan teks yang ditemukannya; Text() mengembalikan hasilnya setelahnya. PageCollection menggunakan indeks mulai dari 1, jadi Pages()[1] adalah halaman pertama:

auto page = doc.Pages()[1];

Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";

Visit() juga menerima seluruh Document secara langsung (absorber.Visit(doc)) ketika Anda menginginkan teks semua halaman digabungkan bersama-sama alih-alih satu halaman.


Langkah 6: Render Halaman ke Gambar Raster

BmpDevice merender Page menjadi gambar BMP yang tidak terkompresi. Konstruktor-nya menerima Resolution yang mengontrol DPI output, dan Process() menulis byte yang dirender ke std::ostream apa pun:

Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));

std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);

Langkah 7: Perbarui Metadata dan Simpan Dokumen

Setter pada DocumentInfo menyiapkan perubahan yang akan dibuang pada saat berikutnya Save() dijalankan pada Document yang memilikinya:

doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");

Masalah Umum dan Solusi

Accessing Pages()[0] throws std::out_of_range

PageCollection diindeks mulai dari 1, sesuai dengan semantik Aspose.PDF kanonik — halaman pertama adalah Pages()[1]. Indeks di bawah 1 atau di atas Count() akan menyebabkan error.

TextAbsorber::Text() mengembalikan string kosong

Text() mengembalikan apa pun yang terkumpul dari pemanggilan Visit() paling terbaru. Pastikan Visit() memang telah dipanggil sebelum membaca Text(), dan bahwa halaman atau dokumen yang Anda kunjungi berisi teks yang dapat diekstrak, bukan hanya gambar hasil pemindaian.

File BMP yang dirender secara tak terduga kecil atau tampak kosong

Nilai Resolution yang rendah menghasilkan gambar raster kecil. Tingkatkan DPI yang diberikan ke Resolution — misalnya, Resolution(300) untuk output kualitas cetak — dan pastikan indeks halaman yang diberikan ke Process() adalah yang Anda maksud.

DocumentInfo field dibaca kembali sebagai string kosong

Tidak setiap pembuat PDF menulis entri /Info standar. Periksa Producer() dan Creator() untuk nilai kosong sebelum mengasumsikan ekstraksi metadata gagal — string kosong adalah hasil yang ditentukan untuk kunci yang tidak ada.

Perubahan yang dibuat dengan Info().Title(...) tidak muncul dalam file yang disimpan

Mutasi DocumentInfo diatur di memori dan hanya disimpan pada kali berikutnya Save() dijalankan pada instance Document yang sama. Pastikan penyuntingan metadata terjadi sebelum Save(), bukan setelahnya.

Pertanyaan yang Sering Diajukan

Apakah pengindeksan halaman berbasis nol atau berbasis satu dalam Aspose.PDF FOSS untuk C++?

Berbasis satu. doc.Pages()[1] selalu merupakan halaman pertama.

Bisakah TextAbsorber mengekstrak teks dari satu halaman saja alih-alih seluruh dokumen?

Ya. Visit() memiliki overload untuk menerima baik Document — yang mengekstrak teks setiap halaman — atau satu Page, yang mengekstrak teks hanya halaman itu.

Apakah saya perlu memanggil Save() jika saya hanya membaca data dari dokumen?

Tidak. Save() hanya diperlukan setelah perubahan yang harus ditulis kembali ke file, seperti menyunting bidang DocumentInfo. Membaca jumlah halaman, mengekstrak teks, atau merender sebuah halaman tidak mengubah dokumen.

Bagaimana cara mengontrol resolusi halaman yang dirender?

Berikan nilai Resolution ke konstruktor perangkat — misalnya, Resolution(150) untuk 150 DPI. Nilai yang lebih tinggi menghasilkan gambar raster yang lebih besar dan dengan fidelitas lebih tinggi.

Format apa yang dihasilkan BmpDevice?

Gambar BMP yang tidak terkompresi ditulis langsung ke std::ostream yang diberikan ke Process().

Lihat Juga

 Bahasa Indonesia