Pendahuluan
Aspose.PDF FOSS untuk C++ adalah perpustakaan open-source C++20 untuk bekerja dengan dokumen PDF. Permukaan API mencakup manajemen dokumen dan halaman, ekstraksi teks, rendering raster, enkripsi, anotasi, dan bidang AcroForm interaktif — operasi yang paling umum diperlukan ketika aplikasi C++ harus membuat, memeriksa, atau mengubah file PDF tanpa bergantung pada mesin PDF eksternal atau SDK komersial.
Perpustakaan ini hanya terhubung dengan pustaka standar C++. Komponen internal seperti enkoder raster BMP, JPEG, dan TIFF serta rasterizer halaman diimplementasikan dari awal dalam proyek, sehingga tidak ada ketergantungan pada renderer PDF sistem, komponen PDF komersial, atau codec gambar pihak ketiga mana pun. Ini menjaga jejak ketergantungan tetap nol selain kompiler yang mematuhi C++20 dan pustaka standar.
Aspose.PDF FOSS untuk C++ dirilis di bawah lisensi MIT. Posting ini menjelaskan area fitur utama yang diekspos oleh kelas Document dan tipe pendukungnya, diikuti dengan contoh Memulai Cepat dan dukungan format yang saat ini dikonfirmasi.
Fitur Utama
Manajemen Dokumen dan Halaman
Kelas Document adalah titik masuk untuk membuka, memeriksa, dan menyimpan file PDF. Halaman diakses melalui Document.Pages(), yang mengembalikan sebuah PageCollection yang mendukung Count(), Add(), Insert(pageNumber), dan Delete(pageNumber). Metadata tingkat dokumen dibaca dan diperbarui melalui Document.Info() (sebuah instance DocumentInfo) atau diatur langsung dengan Document.SetTitle().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
// Insert a blank page after page 1, then drop the last page
doc.Pages().Insert(2);
doc.Pages().Delete(doc.Pages().Count());
doc.SetTitle("Generated Report");
doc.Save("output.pdf");
}
Document.Optimize() dan Document.OptimizeResources() mengurangi ukuran file output dengan mengkonsolidasikan dan memangkas sumber daya yang tidak terpakai sebelum menyimpan.
Ekstraksi Teks
Aspose::Pdf::Text::TextAbsorber mengekstrak konten teks polos dari seluruh dokumen atau satu halaman. Visit() menelusuri target dan Text() mengembalikan string yang terakumulasi. TextFragmentAbsorber bekerja pada granularitas yang lebih halus, memperlihatkan rangkaian teks individu melalui TextFragmentCollection.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/text_fragment_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
// Extract all text from the document
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
// Extract text fragments from page 1
Aspose::Pdf::Text::TextFragmentAbsorber fragmentAbsorber;
fragmentAbsorber.Visit(doc.Pages()[1]);
auto fragments = fragmentAbsorber.TextFragments();
std::cout << "Fragments on page 1: " << fragments.Count() << "\n";
}
Rendering ke Gambar Raster
Halaman dirender ke format raster melalui kelas perangkat per-format — PngDevice, JpegDevice, BmpDevice, dan TiffDevice — masing-masing mengimplementasikan Process(page, output). Resolusi output dikendalikan dengan kelas Resolution.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/png_device.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream pngOut("page1.png", std::ios::binary);
png.Process(page, pngOut);
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream bmpOut("page1.bmp", std::ios::binary);
bmp.Process(page, bmpOut);
}
JpegDevice mengikuti pola Process(page, output) yang sama untuk output JPEG. TiffDevice juga mendukung output multi-halaman dalam satu panggilan melalui Process(document, fromPage, toPage, output), dan memperlihatkan RenderingOptions() untuk mengontrol bagaimana bidang formulir dirender ke output raster.
Enkripsi dan Izin Akses
Document.Encrypt() melindungi dokumen dengan kata sandi pengguna dan pemilik, memilih cipher melalui enum CryptoAlgorithm: RC4x40, RC4x128, AESx128, atau AESx256. Izin yang diberikan dijelaskan dengan tipe Permissions, yang nilai flag-nya meliputi PrintDocument, ModifyContent, ExtractContent, ModifyTextAnnotations, FillForm, ExtractContentWithDisabilities, AssembleDocument, dan PrintingQuality.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions(),
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
Dokumen terenkripsi yang sudah terbuka didekripsi di tempat dengan Document.Decrypt(). Document.IsEncrypted() melaporkan apakah dokumen yang dimuat saat ini memiliki kamus enkripsi.
Anotasi
Anotasi tingkat halaman — catatan teks, bentuk, dan markup — dapat diakses melalui Page.Anotasi(), yang mengembalikan sebuah AnnotationCollection. Entri individu menampilkan properti bersama seperti Contents(), Rect(), Color(), Border(), dan AnnotationType(), dan dapat dihapus dari halaman atau diratakan menjadi konten statis.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& annotations = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annotations.Count() << "\n";
for (int i = 0; i < static_cast<int>(annotations.Count()); ++i) {
std::cout << "Contents: " << annotations[i].Contents() << "\n";
}
// Remove the first annotation on the page
if (annotations.Count() > 0) {
annotations.Delete(annotations[0]);
}
doc.Save("output.pdf");
}
Setiap Annotation tunggal juga dapat dikonversi menjadi konten halaman statis secara langsung dengan metode Flatten() miliknya, terlepas dari alur kerja perataan formulir yang dijelaskan di bawah.
Formulir Interaktif
Bidang AcroForm pada dokumen dikelola melalui Document.Form(), yang mengembalikan sebuah instance Form yang mendukung Count(), HasField(fieldName), Delete(fieldName), dan Flatten(). Bidang baru dilampirkan dengan Form.Add(field, pageNumber), di mana field adalah subtipe Field konkret seperti TextBoxField, CheckboxField, ChoiceField, atau ButtonField.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& form = doc.Form();
std::cout << "Form fields: " << form.Count() << "\n";
if (form.HasField("Signature1")) {
form.Delete("Signature1");
}
// Convert every remaining field into static page content
form.Flatten();
doc.Save("flattened.pdf");
}
Memulai Cepat
Tambahkan pustaka sebagai subdirektori CMake dan tautkan terhadap target aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Buka dokumen, ekstrak teksnya, dan render halaman pertama ke PNG:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/png_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Pages: " << doc.Pages().Count() << "\n";
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.png", std::ios::binary);
png.Process(doc.Pages()[1], out);
}
Format yang Didukung
| Format | Ekstensi | Baca | Tulis |
|---|---|---|---|
| BMP | bmp | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
| SVG | svg | ✓ | — |
Sumber Terbuka & Lisensi
Aspose.PDF FOSS untuk C++ dirilis di bawah lisensi MIT, memungkinkan penggunaan komersial, modifikasi, dan redistribusi tanpa royalti. Kode sumber tersedia di github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.
Penggunaan komersial diizinkan berdasarkan ketentuan lisensi MIT. Jika proyek Anda memerlukan dukungan tingkat perusahaan, cakupan format yang lebih luas, atau integrasi cloud, Aspose.PDF — Enterprise Product Family merupakan penawaran komersial terpisah.