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。