Podofo是一個免費的便攜式C ++庫,可使用PDF文件格式。
Podofo提供了解析PDF文件並將其內容修改為內存的類。更改可以輕鬆地寫回磁盤。除了PDF解析,Podofo還提供了從頭開始創建自己的PDF文件的設施。目前,它不支持渲染PDF內容。
要構建podofo lib,您需要一個C ++ 17編譯器,CMAKE 3.16和以下庫(指示的暫定最小版本):
對於最受歡迎的工具鏈,Podofo需要以下最低版本:
它經常使用以下IDE/工具鏈版本進行測試:
GCC 8.x的支持最近破裂了,但可能是重新建立的。
Podofo庫是根據LGPL 2.0或更高版本的條款許可的。 Podofo工具是根據GPL 2.0或更高版本的條款許可的。
眾所周知,Podofo可以通過眾多軟件包管理器(包括apt-get ,Brew,VCPKG,Conan)進行編譯,並具有在Ubuntu Linux,MacOS和Windows中使用的公共連續集成,並引導CMAKE項目,構建和測試庫。強烈建議使用此類包裝管理人員建造Podofo。
存儲庫中還有一個遊樂場區域,您可以訪問某些流行的建築/操作系統的前構建依賴項:操場是推薦開發庫和重現錯誤的推薦設置,而不建議使用Podofo部署應用程序。看看那裡的讀書文件。
警告:眾所周知,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
安裝柯南,然後從源根運行:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
請按照VCPKG QuickStart指南進行設置,以設置軟件包管理器存儲庫。在Windows中,將環境變量VCPKG_DEFAULT_TRIPLET設置為x64-windows可能也很有用,以默認安裝64位依賴關係並定義一個VCPKG_INSTALLATION_ROOT變量,並在QuickStart中使用Repository的位置定義了Repository的位置。
然後從源根運行:
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 :構建單元測試,默認為true;
PODOFO_BUILD_EXAMPLES :構建示例,默認為true;
PODOFO_BUILD_UNSUPPORTED_TOOLS :構建podofo工具,默認為false。請參閱README中的相關部分;
PODOFO_BUILD_LIB_ONLY :如果為true,它將僅構建庫組件。這種無條件禁用建築測試,示例和工具;
PODOFO_BUILD_STATIC :如果為true,則將庫作為靜態對象構建,並將其用於測試,示例和工具。默認情況下,建立了共享庫。
如果您想使用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預先編譯的靜態構建鏈接,這是一個方案,支持支持是有限的,因為您真的應該能夠識別和修復鏈接錯誤。一般步驟是:
PODOFO_STATIC彙編定義添加到您的項目,或者在包括podofo.h之前添加;podofo.a , podofo_private.a (或podofo.lib , podofo_private.lib與msvc)和所有因庫。 可以在https://podofo.github.io/podofo/documentation/上找到API文檔。
先決條件:確保您的機器上安裝了Doxygen。如果沒有,請訪問Doxygen的官方網站以下載並安裝它。
生成文檔:完成開發QuickStart章節中詳細介紹的構建過程後,導航到Podofo源代碼的根目錄。打開終端或命令提示符並運行以下命令:
doxygen build/Doxyfile查看文檔:文檔生成完成後,您將找到一個包含生成文檔的documentation目錄。在您喜歡的Web瀏覽器中打開index.html以查看API文檔。
cd build/doxygen/documentation
open index.html庫中的所有std::strings或std::string_view旨在保存UTF-8編碼的字符串內容。默認情況下, PdfString和PdfName構造函數接受UTF-8編碼字符串(儘管PdfName僅接受PdfDocEncoding char集中的字符)。 charbuff ABD bufferview代表一個通用的八位位緩衝區。
Podofo具有不穩定的API,這是對Podofo 0.9.x的廣泛API審查的結果。在此鏈接上,您可以找到有關遷移0.9.8代碼為0.10.0的不完整指南。預計Podofo將在審查過程完成後立即收斂到穩定的API。有關更多詳細信息,請參見API穩定性。
警告:工具目前是未經支持的,未經測試和未受到的。
Podofo工具仍在源樹中可用,但是由於它們是未固定/未固定的,默認情況下將禁用其編譯,並且在清除狀態之前不會獲得支持。不建議將它們包含在軟件分佈中。如果要構建它們,請確保使用-DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE來引導CMAKE項目。在操場上很方便地啟用工具,至少可以確保圖書館更改不會破壞其編譯。
有一個待辦事項列表,或者查看問題跟踪器。
問:如何簽署文檔?
答: Podofo Head現在提供一個非常強大的高級簽名程序,該程序允許簽名文檔而無需手動提供CMS結構。默認情況下,它支持使用Modern PAdES-B合規性配置文件簽署文檔,但也支持Legacy PKCS7簽名。如果您同時擁有ASN.1編碼X509證書和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的調用順序以這種方式工作: PdfSigner::Reset()首先稱為PdfSigner::ComputeSignature(buffer, dryrun) ,用空的緩衝區和dryrun參數設置為true 。在此呼叫中,只需調整緩衝區大小,高估了簽名所需的尺寸,或者只計算必須保存在緩衝區上的假簽名。然後調用一系列PdfSigner::AppendData(buffer) ,接收要簽名的所有文檔數據。最終的PdfSigner::ComputeSignature(buffer, dryrun)被稱為dryrun參數設置為false 。該呼叫的緩衝區已清除(未更改容量)或不相應地與PdfSigner::SkipBufferClear()的價值相應。
問: PdfMemDocument::SaveUpdate()或PoDoFo::SignDocument()僅寫一個部分文件:為什麼沒有機制可以無縫處理遞增更新,因為它在podofo 0.9.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的幾個原始開發人員。還創建了一個吉特社區,以減輕一些非正式的chat不休。如果您找到一個錯誤並知道如何修復它,或者要添加一個小功能,歡迎您發送拉動請求,前提是它遵循項目的編碼樣式。至少必要的貢獻應為:
被拒絕或持有的其他原因可能是:
如果您需要實現更大的功能或重構,請首先詢問是否已經計劃。該功能可能需要抓取,這意味著它為外部貢獻開放。請在您開始處理的相關問題中寫下,以獲得一些反饋/協調。如果不是這樣,則意味著重構/功能計劃以後由維護者實施。如果該功能未在問題中列出,請添加並/或創建討論以接收一些反饋並討論一些基本的設計選擇。
警告:請不要使用個人電子郵件地址進行技術支持,而是創建GitHub問題。
Podofo目前由Francesco Pretto與Dominik Seichter和其他人一起開發和維護。有關更多詳細信息,請參見文件作者。md。