Podofo adalah pustaka C ++ portabel gratis untuk bekerja dengan format file PDF.
Podofo menyediakan kelas untuk mengurai file PDF dan memodifikasi kontennya menjadi memori. Perubahan dapat ditulis kembali ke disk dengan mudah. Selain PDF Parsing Podofo juga menyediakan fasilitas untuk membuat file PDF Anda sendiri dari awal. Saat ini tidak mendukung rendering konten PDF.
Untuk membangun podofo lib, Anda akan memerlukan kompiler C ++ 17, CMake 3.16 dan perpustakaan berikut (versi minimum tentatif ditunjukkan):
Untuk toolchains yang paling populer, podofo membutuhkan versi minimum berikut:
Ini secara teratur diuji dengan versi IDE/Toolchains berikut:
Dukungan GCC 8.x pecah baru -baru ini, tetapi bisa dipulihkan.
Perpustakaan Podofo dilisensikan berdasarkan Ketentuan LGPL 2.0 atau yang lebih baru. Alat podofo dilisensikan dengan istilah GPL 2.0 atau yang lebih baru.
Podofo dikenal untuk dikompilasi melalui banyak manajer paket (termasuk apt-get , Brew, VCPKG, Conan), dan memiliki integrasi kontinu publik yang bekerja di Ubuntu Linux, MacOS dan Windows, bootstrap proyek CMAKE, membangun dan menguji perpustakaan. Sangat disarankan untuk membangun podofo menggunakan manajer paket tersebut.
Ada juga area taman bermain di repositori di mana Anda dapat memiliki akses ke dependensi pra-membangun untuk beberapa arsitektur populer/sistem operasi: taman bermain adalah pengaturan yang disarankan untuk mengembangkan perpustakaan dan mereproduksi bug, sementara itu tidak disarankan untuk penyebaran aplikasi Anda menggunakan podofo. Lihatlah readme di sana.
PERINGATAN : PODOFO diketahui bekerja di toolchains lintas-kompilasi (mis. Pengembangan Android/IOS), tetapi dukungan mungkin tidak disediakan dalam skenario tersebut. Jika Anda memutuskan untuk membangun dependensi secara manual, Anda diasumsikan mengetahui bagaimana mengidentifikasi kemungkinan bentrokan pustaka/ketidakcocokan dan bagaimana menangani masalah kompilasi/tautan yang dapat muncul dalam sistem Anda.
Dari root root sumber:
sudo apt-get install -y libfontconfig1-dev libfreetype-dev libxml2-dev libssl-dev libjpeg-dev libpng-dev libtiff-dev libidn11-dev
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Instal Brew, lalu dari root root sumber:
brew install fontconfig freetype openssl libxml2 jpeg-turbo libpng libtiff libidn cmake
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_FIND_FRAMEWORK=NEVER -DCMAKE_PREFIX_PATH=`brew --prefix` -DFontconfig_INCLUDE_DIR=`brew --prefix fontconfig`/include -DOPENSSL_ROOT_DIR=`brew --prefix openssl@3` ..
cmake --build . --config Debug
Instal Conan, lalu dari Source Root Run:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Ikuti panduan VCPKG QuickStart untuk mengatur repositori Paket Manajer terlebih dahulu. Di Windows, mungkin juga berguna untuk mengatur variabel lingkungan VCPKG_DEFAULT_TRIPLET ke x64-windows ke default menginstal 64 bit dependency dan mendefinisikan variabel VCPKG_INSTALLATION_ROOT dengan lokasi repositori seperti yang dibuat di quickStart.
Kemudian dari root root sumber:
vcpkg install fontconfig freetype libxml2 openssl libjpeg-turbo libpng tiff zlib
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=C:vcpkgscriptsbuildsystemsvcpkg.cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
PODOFO_BUILD_TEST : Bangun tes unit, default ke true;
PODOFO_BUILD_EXAMPLES : Bangun contoh, default ke true;
PODOFO_BUILD_UNSUPPORTED_TOOLS : Bangun alat podofo, default ke false. Lihat bagian yang relevan di readme;
PODOFO_BUILD_LIB_ONLY : jika benar, itu hanya akan membangun komponen perpustakaan. Ini menonaktifkan tes, contoh, dan alat bangunan tanpa syarat ini;
PODOFO_BUILD_STATIC : Jika benar, bangun perpustakaan sebagai objek statis dan gunakan dalam tes, contoh, dan alat. Secara default perpustakaan bersama dibangun.
Jika Anda ingin menggunakan podofo statis dan Anda termasuk proyek podofo cmake itu sangat sederhana. Lakukan sesuatu seperti berikut dalam proyek CMake Anda:
set(PODOFO_BUILD_LIB_ONLY TRUE CACHE BOOL "" FORCE)
set(PODOFO_BUILD_STATIC TRUE CACHE BOOL "" FORCE)
add_subdirectory(podofo)
# ...
target_link_libraries(MyTarget podofo::podofo)
Jika Anda menghubungkan dengan build statis podofo yang dikompilasi, ini adalah skenario di mana dukungannya terbatas, karena Anda benar -benar seharusnya dapat mengidentifikasi dan memperbaiki kesalahan menghubungkan. Langkah umumnya adalah:
PODOFO_STATIC ke proyek Anda, atau sebelum termasuk podofo.h ;podofo.a , podofo_private.a (atau podofo.lib , podofo_private.lib dengan msvc) dan semua perpustakaan dependen. Dokumentasi API dapat ditemukan di https://podofo.github.io/podofo/documentation/.
Prasyarat : Pastikan Anda memasang doxygen di mesin Anda. Jika tidak, kunjungi situs web resmi Doxygen untuk mengunduh dan menginstalnya.
Menghasilkan Dokumentasi : Setelah menyelesaikan proses pembuatan yang dirinci dalam bab pengembangan QuickStart, navigasikan ke direktori root kode sumber Podofo. Buka terminal atau prompt perintah dan jalankan perintah berikut:
doxygen build/Doxyfile Melihat dokumentasi : Setelah pembuatan dokumentasi selesai, Anda akan menemukan direktori documentation yang berisi dokumentasi yang dihasilkan. Buka index.html di browser web favorit Anda untuk melihat dokumentasi API.
cd build/doxygen/documentation
open index.html Semua std::strings atau std::string_view di perpustakaan dimaksudkan untuk memegang konten string yang dikodekan UTF-8. Konstruktor PdfString dan PdfName menerima string yang dikodekan UTF-8 secara default ( PdfName hanya menerima karakter dalam set char PdfDocEncoding , meskipun). charbuff ABD bufferview malah mewakili buffer octet generik.
Podofo memiliki API yang tidak stabil yang merupakan hasil dari tinjauan API yang luas dari podofo 0.9.x. Pada tautan ini Anda dapat menemukan panduan yang tidak lengkap tentang Migrasi 0.9.8 kode ke 0.10.0. Diharapkan podofo akan bertemu ke API yang stabil segera setelah proses peninjauan selesai. Lihat Stabilitas API untuk detail lebih lanjut.
PERINGATAN : Alat saat ini tidak didukung , tidak teruji , dan tidak terawat .
Alat podofo masih tersedia di pohon sumber tetapi kompilasi mereka dinonaktifkan secara default karena mereka tidak terjaga/tidak terawat, dan tidak akan menerima dukungan sampai status mereka dihapus. Tidak disarankan untuk memasukkannya ke dalam distribusi perangkat lunak. Jika Anda ingin membangunnya, pastikan untuk bootstrap proyek cmake dengan -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE . Alat diaktifkan dengan mudah di taman bermain setidaknya untuk memastikan perubahan perpustakaan tidak akan merusak kompilasi mereka.
Ada daftar TODO, atau lihat pelacak masalah.
T: Bagaimana cara menandatangani dokumen?
A: Kepala podofo sekarang memasok prosedur penandatanganan tingkat tinggi yang sangat kuat dan yang memungkinkan untuk menandatangani dokumen tanpa harus memasok struktur CMS secara manual. Secara default, mendukung penandatanganan dokumen dengan profil kepatuhan PAdES-B modern, tetapi ada juga dukungan untuk tanda tangan Legacy PKCS7. Asalkan Anda memiliki sertifikat privat RSA yang dikodekan oleh ASN.1, Anda dapat menandatangani dokumen dengan kode berikut:
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
auto & page = doc.GetPages().GetPageAt( 0 );
auto & signature = page.CreateField<PdfSignature>( " Signature " , Rect ());
auto signer = PdfSignerCms(x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);Ada juga dukungan untuk layanan penandatanganan eksternal dan/atau menandatangani dokumen dalam buffer memori. Lihat berbagai contoh penandatanganan dalam tes unit.
T: Dapatkah saya tetap menggunakan prosedur berbasis acara untuk menandatangani dokumen?
Ya, prosedur level rendah lama belum berubah dan masih tersedia. Untuk menggambarkan prosedur secara singkat, kita harus sepenuhnya mengimplementasikan PdfSigner , mengambil atau membuat bidang PdfSignature , membuat perangkat output (lihat pertanyaan berikutnya) dan gunakan PoDoFo::SignDocument(doc, device, signer, signature) . Saat menandatangani, urutan panggilan PdfSignature berfungsi dengan cara ini: Metode PdfSigner::Reset() disebut terlebih dahulu, kemudian PdfSigner::ComputeSignature(buffer, dryrun) dipanggil dengan buffer kosong dan argumen dryrun diatur ke true . Dalam panggilan ini seseorang hanya dapat mengubah ukuran buffer melebih -lebihkan ukuran yang diperlukan untuk tanda tangan, atau hanya menghitung tanda tangan palsu yang harus disimpan pada buffer. Kemudian urutan PdfSigner::AppendData(buffer) dipanggil, menerima semua data dokumen yang akan ditandatangani. PdfSigner::ComputeSignature(buffer, dryrun) dipanggil, dengan parameter dryrun diatur ke false . Buffer pada panggilan ini dibersihkan (kapasitas tidak diubah) atau tidak sesuai dengan nilai PdfSigner::SkipBufferClear() .
T: PdfMemDocument::SaveUpdate() atau PoDoFo::SignDocument() Tulis hanya file parsial: mengapa tidak ada mekanisme untuk menangani pembaruan tambahan yang mulus seperti di podofo 0.9.x? Apa yang harus dilakukan untuk memperbarui/menandatangani dokumen dengan benar?
A: Mekanisme sebelumnya dalam podofo 0.9.x diperlukan pemberdayaan dokumen untuk pembaruan tambahan, yang merupakan langkah keputusan yang saya percaya tidak perlu. Juga:
Strategi alternatif yang membuat lebih jelas fakta bahwa pembaruan tambahan harus dilakukan pada file yang sama dari tempat dokumen dimuat, atau bahwa buffer yang mendasarinya akan menumbuhkan konsumsi mememori setelah operasi selanjutnya jika ada dokumen buffer yang dimuat, tersedia. Ini mengikuti beberapa contoh yang menunjukkan operasi yang benar untuk memperbarui dokumen, dimuat dari file atau buffer:
auto inputOutput = std::make_shared<FileStreamDevice>(filename, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);charbuff outputBuffer;
FileStreamDevice input (filepath);
auto inputOutput = std::make_shared<BufferStreamDevice>(outputBuffer);
input.CopyTo(*inputOutput);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);Dokumen penandatanganan dapat dilakukan dengan teknik yang sama, baca pertanyaan lain untuk lebih banyak contoh.
T: Dapatkah saya menandatangani dokumen untuk kedua kalinya?
A: Ya, ini diuji, tetapi untuk memastikan ini akan berhasil Anda untuk memandangi kembali dokumen untuk kedua kalinya, karena menggunakan kembali dokumen yang sudah dimuat masih belum teruji (ini dapat berubah nanti). Misalnya Anda dapat melakukan apa yang berikut:
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature1 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature2 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}Podofo mungkin atau mungkin tidak bekerja untuk kebutuhan Anda dan datang tanpa jaminan sama sekali. Bug yang serius, termasuk kelemahan keamanan, dapat diperbaiki pada kerangka waktu yang sewenang -wenang, atau tidak diperbaiki sama sekali. Prioritas menerapkan fitur baru dan pemasangan bug diputuskan sesuai dengan minat dan preferensi pribadi para pengelola. Jika Anda membutuhkan podofo untuk mengintegrasikan fitur atau perbaikan bug yang sangat penting untuk alur kerja Anda, pendekatan yang paling disambut dan tercepat adalah berkontribusi tambalan berkualitas tinggi.
Silakan berlangganan milis proyek yang masih diikuti oleh beberapa pengembang asli Podofo. Komunitas Gitter juga telah diciptakan untuk memudahkan beberapa obrolan yang lebih informal. Jika Anda menemukan bug dan tahu cara memperbaikinya, atau Anda ingin menambahkan fitur kecil, Anda dipersilakan untuk mengirim permintaan tarik, asalkan mengikuti gaya pengkodean proyek. Sebagai persyaratan minimum, kontribusi apa pun harus:
Alasan lain untuk penolakan, atau tahan, permintaan tarik mungkin:
Jika Anda perlu menerapkan fitur atau refactor yang lebih besar, tanyakan dulu apakah sudah direncanakan. Fitur ini mungkin siap untuk diperebutkan, artinya terbuka untuk kontribusi eksternal. Harap tulis dalam masalah yang relevan yang Anda mulai kerjakan itu, untuk menerima umpan balik/koordinasi. Jika tidak, itu berarti bahwa refactor/fitur direncanakan akan diimplementasikan nanti oleh pengelola. Jika fitur tidak terdaftar dalam masalah, tambahkan dan/atau buat diskusi untuk menerima beberapa umpan balik dan diskusikan beberapa pilihan desain dasar.
PERINGATAN : Tolong jangan gunakan alamat email pribadi untuk dukungan teknis, tetapi buat masalah github sebagai gantinya.
Podofo saat ini dikembangkan dan dikelola oleh Francesco Pretto, bersama dengan Dominik Seichter dan lainnya. Lihat file penulis file.md untuk lebih jelasnya.