Podofo เป็นไลบรารี C ++ แบบพกพาฟรีที่ทำงานกับรูปแบบไฟล์ PDF
Podofo จัดเตรียมคลาสเพื่อแยกวิเคราะห์ไฟล์ PDF และแก้ไขเนื้อหาเป็นหน่วยความจำ การเปลี่ยนแปลงสามารถเขียนกลับไปที่ดิสก์ได้อย่างง่ายดาย นอกจาก PDF Parsing Podofo ยังมีสิ่งอำนวยความสะดวกในการสร้างไฟล์ PDF ของคุณเองตั้งแต่เริ่มต้น ปัจจุบันไม่รองรับเนื้อหา PDF
ในการสร้าง podofo lib คุณจะต้องมีคอมไพเลอร์ C ++ 17, CMake 3.16 และไลบรารีต่อไปนี้ (ระบุรุ่นขั้นต่ำเบื้องต้น):
สำหรับเครื่องมือที่ได้รับความนิยมมากที่สุด Podofo ต้องการเวอร์ชันขั้นต่ำดังต่อไปนี้:
มีการทดสอบเป็นประจำกับรุ่น IDE/เครื่องมือต่อไปนี้:
การสนับสนุน GCC 8.x แตกเมื่อเร็ว ๆ นี้ แต่มันอาจจะกลับคืนสู่สภาพเดิม
Podofo Library ได้รับใบอนุญาตภายใต้ข้อกำหนด LGPL 2.0 หรือใหม่กว่า เครื่องมือ Podofo ได้รับใบอนุญาตภายใต้ข้อกำหนด GPL 2.0 หรือใหม่กว่า
Podofo เป็นที่รู้จักกันในการรวบรวมผ่านผู้จัดการแพ็คเกจจำนวนมาก (รวมถึง apt-get , Brew, VCPKG, Conan) และมีการรวมเข้าด้วยกันอย่างต่อเนื่องที่ทำงานใน Ubuntu Linux, MacOS และ Windows ขอแนะนำอย่างยิ่งในการสร้าง Podofo โดยใช้ผู้จัดการแพ็คเกจดังกล่าว
นอกจากนี้ยังมีพื้นที่สนามเด็กเล่นในที่เก็บข้อมูลที่คุณสามารถเข้าถึงการพึ่งพาการสร้างล่วงหน้าสำหรับสถาปัตยกรรม/ระบบปฏิบัติการยอดนิยมบางอย่าง: สนามเด็กเล่นคือการตั้งค่าที่แนะนำในการพัฒนาห้องสมุดและทำซ้ำข้อบกพร่องในขณะที่ไม่แนะนำสำหรับการปรับใช้แอปพลิเคชันของคุณโดยใช้ Podofo ดู readme ที่นั่น
คำเตือน : Podofo เป็นที่รู้จักกันว่าทำงานในเครื่องมือการรวบรวมข้าม (เช่นการพัฒนา Android/iOS) แต่การสนับสนุนอาจไม่ได้ให้ไว้ในสถานการณ์ดังกล่าว หากคุณตัดสินใจที่จะสร้างการพึ่งพาด้วยตนเองคุณจะต้องรู้วิธีระบุตัวตนของห้องสมุดที่เป็นไปได้ปะทะกัน/ไม่ตรงกันและวิธีจัดการกับการรวบรวม/เชื่อมโยงปัญหาที่อาจเกิดขึ้นในระบบของคุณ
จากแหล่งที่มาของรูทรัน:
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
ติดตั้งชงจากนั้นจากแหล่งรูทต้นฉบับ:
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
ติดตั้ง Conan จากนั้นจากแหล่งรูทต้นฉบับ:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
ทำตามคู่มือ VCPKG QuickStart เพื่อตั้งค่าที่เก็บแพ็คเกจ Manager ก่อน ใน Windows อาจเป็นประโยชน์ในการตั้งค่าตัวแปรสภาพแวดล้อม VCPKG_DEFAULT_TRIPLET เป็น x64-windows เพื่อเริ่มต้นการติดตั้ง 64 บิตและกำหนดตัวแปร VCPKG_INSTALLATION_ROOT ที่มีที่ตั้งของที่เก็บตามที่สร้างขึ้นใน QuickStart
จากนั้นจากแหล่งที่มาของรูทรัน:
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 : สร้างการทดสอบหน่วย, ค่าเริ่มต้นเป็นจริง;
PODOFO_BUILD_EXAMPLES : สร้างตัวอย่างค่าเริ่มต้นเป็นจริง;
PODOFO_BUILD_UNSUPPORTED_TOOLS : สร้างเครื่องมือ podofo, ค่าเริ่มต้นเป็นเท็จ ดูส่วนที่เกี่ยวข้องใน readme;
PODOFO_BUILD_LIB_ONLY : ถ้าเป็นจริงมันจะสร้างเฉพาะส่วนประกอบห้องสมุด การทดสอบอาคารตัวอย่างและเครื่องมือนี้ไม่มีเงื่อนไข
PODOFO_BUILD_STATIC : ถ้าเป็นจริงให้สร้างไลบรารีเป็นวัตถุแบบคงที่และใช้ในการทดสอบตัวอย่างและเครื่องมือ โดยค่าเริ่มต้นไลบรารีที่ใช้ร่วมกันถูกสร้างขึ้น
หากคุณต้องการใช้ Podofo แบบคงที่และคุณรวมถึงโครงการ Podofo CMake มันง่ายมาก ทำสิ่งต่อไปนี้ในโครงการ CMake ของคุณ:
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)
หากคุณกำลังเชื่อมโยงกับการสร้าง podofo แบบคงที่ precompiled นี่เป็นสถานการณ์ที่การสนับสนุนมี จำกัด เนื่องจากคุณควรจะสามารถระบุและแก้ไขข้อผิดพลาดการเชื่อมโยงได้ ขั้นตอนทั่วไปคือ:
PODOFO_STATIC ลงในโครงการของคุณหรือก่อนรวม podofo.h ;podofo.a , podofo_private.a (หรือ podofo.lib , podofo_private.lib กับ MSVC) และไลบรารีที่ขึ้นอยู่กับทั้งหมด เอกสาร API สามารถดูได้ที่ https://podofo.github.io/podofo/documentation/
วิชาบังคับก่อน : ตรวจสอบให้แน่ใจว่าคุณติดตั้ง Doxygen บนเครื่องของคุณแล้ว ถ้าไม่เยี่ยมชมเว็บไซต์ทางการของ Doxygen เพื่อดาวน์โหลดและติดตั้ง
การสร้างเอกสาร : หลังจากเสร็จสิ้นกระบวนการสร้างรายละเอียดในบทที่พัฒนาอย่างรวดเร็วนำไปสู่ไดเรกทอรีรากของซอร์สโค้ดของ Podofo เปิดเทอร์มินัลหรือพรอมต์คำสั่งและเรียกใช้คำสั่งต่อไปนี้:
doxygen build/Doxyfile การดูเอกสาร : เมื่อการสร้างเอกสารเสร็จสมบูรณ์คุณจะพบไดเรกทอรี documentation ที่มีเอกสารที่สร้างขึ้น เปิด index.html ในเว็บเบราว์เซอร์ที่คุณชื่นชอบเพื่อดูเอกสาร API
cd build/doxygen/documentation
open index.html std::strings หรือ std::string_view ในไลบรารีมีวัตถุประสงค์เพื่อเก็บเนื้อหาสตริงที่เข้ารหัส UTF-8 PdfString และ PdfName Constructors ยอมรับสตริงที่เข้ารหัส UTF-8 โดยค่าเริ่มต้น ( PdfName ยอมรับเฉพาะอักขระในชุดถ่าน PdfDocEncoding ) charbuff ABD bufferview แทนบัฟเฟอร์ Octet ทั่วไป
Podofo มี API ที่ไม่เสถียรซึ่งเป็นผลมาจากการทบทวน API อย่างกว้างขวางของ Podofo 0.9.x ที่ลิงค์นี้คุณสามารถค้นหาคู่มือที่ไม่สมบูรณ์ในการย้ายรหัส 0.9.8 เป็น 0.10.0 คาดว่า Podofo จะมาบรรจบกันกับ API ที่มีเสถียรภาพทันทีที่กระบวนการตรวจสอบเสร็จสิ้น ดูความมั่นคงของ API สำหรับรายละเอียดเพิ่มเติม
คำเตือน : เครื่องมือในขณะนี้ ไม่ได้รับการสนับสนุน ไม่ผ่านการทดสอบ และ ไม่ได้รับการดูแล
เครื่องมือ Podofo ยังคงมีอยู่ในแผนผังต้นทาง แต่การรวบรวมของพวกเขาถูกปิดใช้งานโดยค่าเริ่มต้นเนื่องจากไม่มีการใช้งานหรือไม่ได้รับการดูแลและจะไม่ได้รับการสนับสนุนจนกว่าสถานะของพวกเขาจะถูกล้าง ไม่แนะนำให้รวมไว้ในการแจกแจงซอฟต์แวร์ หากคุณต้องการสร้างพวกเขาตรวจสอบให้แน่ใจว่าได้ bootstrap โครงการ cmake ด้วย -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE เครื่องมือเปิดใช้งานอย่างสะดวกในสนามเด็กเล่นอย่างน้อยเพื่อให้แน่ใจว่าการเปลี่ยนแปลงของห้องสมุดจะไม่ทำลายการรวบรวม
มีรายการสิ่งที่ต้องทำหรือดูที่ตัวติดตามปัญหา
ถาม: ฉันจะเซ็นเอกสารได้อย่างไร?
ตอบ: ตอนนี้ Podofo Head จัดหาขั้นตอนการลงนามระดับสูงซึ่งมีประสิทธิภาพมากและช่วยให้สามารถลงนามในเอกสารโดยไม่ต้องจัดหาโครงสร้าง CMS ด้วยตนเอง โดยค่าเริ่มต้นจะสนับสนุนการลงนามในเอกสารด้วยโปรไฟล์การปฏิบัติตาม PAdES-B ที่ทันสมัย แต่ยังมีการสนับสนุนลายเซ็น PKCS7 แบบดั้งเดิม การให้ใบรับรอง X509 ที่เข้ารหัส ASN.1 และคีย์ส่วนตัว RSA ทั้งคู่คุณสามารถลงนามในเอกสารด้วยรหัสต่อไปนี้:
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);นอกจากนี้ยังมีการสนับสนุนสำหรับบริการลงนามภายนอกและ/หรือลงนามในเอกสารในบัฟเฟอร์หน่วยความจำ ดูตัวอย่างการลงนามต่างๆในการทดสอบหน่วย
ถาม: ฉันยังสามารถใช้ขั้นตอนตามเหตุการณ์เพื่อลงนามในเอกสารได้หรือไม่?
ใช่ขั้นตอนระดับต่ำแบบเก่ายังไม่เปลี่ยนแปลงและยังคงมีอยู่ เพื่ออธิบายขั้นตอนสั้น ๆ เราต้องใช้ PdfSigner ดึงหรือสร้างฟิลด์ PdfSignature อย่างเต็มที่สร้างอุปกรณ์เอาต์พุต (ดูคำถามถัดไป) และใช้ PoDoFo::SignDocument(doc, device, signer, signature) เมื่อลงนามลำดับของการโทรของ PdfSignature ทำงานด้วยวิธีนี้: Method PdfSigner::Reset() เรียกว่าก่อนจากนั้น PdfSigner::ComputeSignature(buffer, dryrun) เรียกด้วยบัฟเฟอร์เปล่าและ true dryrun ในการโทรนี้เราสามารถปรับขนาดบัฟเฟอร์การประเมินขนาดที่ต้องการมากเกินไปสำหรับลายเซ็นหรือเพียงแค่คำนวณลายเซ็นปลอมที่ต้องบันทึกไว้ในบัฟเฟอร์ จากนั้นลำดับของ PdfSigner::AppendData(buffer) จะถูกเรียกโดยรับข้อมูลเอกสารทั้งหมดที่จะลงนาม PdfSigner::ComputeSignature(buffer, dryrun) ถูกเรียกด้วยพารามิเตอร์ dryrun ที่ตั้งค่าเป็น false บัฟเฟอร์ในการโทรนี้จะถูกล้าง (ความจุไม่เปลี่ยนแปลง) หรือไม่ตามมูลค่าของ PdfSigner::SkipBufferClear()
ถาม: PdfMemDocument::SaveUpdate() หรือ PoDoFo::SignDocument() เขียนเฉพาะไฟล์บางส่วน: ทำไมไม่มีกลไกที่จะจัดการกับการอัปเดตที่เพิ่มขึ้นอย่างราบรื่นเหมือนใน Podofo 0.9.x? ควรทำอย่างไรเพื่ออัปเดต/ลงชื่อเข้าใช้เอกสารอย่างถูกต้อง?
ตอบ: กลไกก่อนหน้านี้ใน Podofo 0.9.x จำเป็นต้องเปิดใช้งานเอกสารสำหรับการอัปเดตที่เพิ่มขึ้นซึ่งเป็นขั้นตอนการตัดสินใจที่ฉันเชื่อว่าควรไม่จำเป็น อีกด้วย:
อีกทางเลือกหนึ่งที่ทำให้ชัดเจนขึ้นความจริงที่ว่าการอัปเดตที่เพิ่มขึ้นจะต้องดำเนินการในไฟล์เดียวกันจากที่โหลดเอกสารหรือบัฟเฟอร์พื้นฐานจะเพิ่มการบริโภคที่มีความทรงจำหลังจากการดำเนินการตามมาในกรณีของเอกสารที่โหลดบัฟเฟอร์ ตามตัวอย่างสองสามตัวอย่างที่แสดงการดำเนินการที่ถูกต้องเพื่ออัปเดตเอกสารที่โหลดจากไฟล์หรือบัฟเฟอร์:
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);เอกสารการลงนามสามารถทำได้ด้วยเทคนิคเดียวกันอ่านคำถามอื่น ๆ สำหรับตัวอย่างเพิ่มเติม
ถาม: ฉันสามารถเซ็นเอกสารเป็นครั้งที่สองได้หรือไม่?
ตอบ: ใช่นี่คือการทดสอบ แต่เพื่อให้แน่ใจว่าสิ่งนี้จะใช้งานได้คุณจะนำเอกสารมาใช้ใหม่เป็นครั้งที่สองอีกครั้งเนื่องจากการใช้เอกสารที่โหลดแล้วยังไม่ได้ทดสอบอีกครั้ง (อาจเปลี่ยนแปลงได้ในภายหลัง) ตัวอย่างเช่นคุณสามารถทำได้ตาม:
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 อาจใช้งานได้หรือไม่อาจใช้ได้กับความต้องการของคุณและไม่มีการรับประกันอย่างแน่นอน ข้อบกพร่องที่ร้ายแรงรวมถึงข้อบกพร่องด้านความปลอดภัยอาจได้รับการแก้ไขในระยะเวลาตามอำเภอใจหรือไม่ได้รับการแก้ไขเลย ลำดับความสำคัญของการใช้คุณสมบัติใหม่และการแก้ไขข้อผิดพลาดได้รับการตัดสินตามความสนใจและความชอบส่วนตัวของผู้ดูแล หากคุณต้องการ Podofo เพื่อรวมคุณสมบัติหรือการแก้ไขข้อผิดพลาดซึ่งเป็นสิ่งสำคัญสำหรับเวิร์กโฟลว์ของคุณวิธีการต้อนรับและเร็วที่สุดคือการมีส่วนร่วมของแพตช์คุณภาพสูง
โปรดสมัครสมาชิกรายชื่อผู้รับจดหมายซึ่งยังคงตามมาด้วยนักพัฒนาดั้งเดิมของ Podofo ชุมชน Gitter ได้ถูกสร้างขึ้นเพื่อลดการพูดคุยที่ไม่เป็นทางการมากขึ้น หากคุณพบข้อผิดพลาดและรู้วิธีแก้ไขหรือคุณต้องการเพิ่มคุณสมบัติเล็ก ๆ คุณยินดีที่จะส่งคำขอดึงโดยให้ตามรูปแบบการเข้ารหัสของโครงการ เป็นสิ่งจำเป็นขั้นต่ำการมีส่วนร่วมใด ๆ ควรเป็น:
เหตุผลอื่น ๆ สำหรับการปฏิเสธหรือถือคำขอดึงอาจเป็น:
หากคุณต้องการใช้ฟีเจอร์ที่ใหญ่กว่าหรือ refactor ให้ถามก่อนว่ามีการวางแผนไว้แล้วหรือไม่ คุณลักษณะนี้อาจเหมาะสำหรับการคว้าซึ่งหมายความว่ามันเปิดสำหรับการมีส่วนร่วมภายนอก โปรดเขียนในประเด็นที่เกี่ยวข้องที่คุณเริ่มทำงานเพื่อรับข้อเสนอแนะ/การประสานงาน หากไม่เป็นเช่นนั้นก็หมายความว่าผู้ดูแลรักษา/คุณลักษณะมีการวางแผนที่จะดำเนินการในภายหลังโดยผู้ดูแล หากคุณลักษณะไม่ได้ระบุไว้ในปัญหาให้เพิ่มและ/หรือสร้างการสนทนาเพื่อรับข้อเสนอแนะและหารือเกี่ยวกับตัวเลือกการออกแบบขั้นพื้นฐาน
คำเตือน : โปรดอย่าใช้ที่อยู่อีเมลส่วนบุคคลเพื่อสนับสนุนทางเทคนิค Inquries แต่สร้างปัญหา GitHub แทน
ปัจจุบัน Podofo ได้รับการพัฒนาและดูแลโดย Francesco Pretto พร้อมกับ Dominik Seichter และคนอื่น ๆ ดู File Authors.md สำหรับรายละเอียดเพิ่มเติม