C++使用PoDoFo库处理PDF文件

📚 PoDoFo 简介

PoDoFo 是一个用 C++ 编写的自由开源库,专用于 读取、写入和操作 PDF 文件。它适用于需要程序化处理 PDF 文件的应用程序,比如批量生成、修改、合并、提取元数据、绘图等。
在这里插入图片描述

🌟 核心特点

特性说明
📄 PDF 读取支持加载 PDF,读取内容流、页数、对象、元数据等
✍️ PDF 写入可创建新 PDF,添加页、文本、图片、绘图操作
📌 PDF 编辑可访问并修改 PDF 内部结构,如对象树
🔐 加密支持支持基本加密(RC4、标准 PDF 加密),但支持有限
📦 轻量依赖只依赖标准 C++ 和一些通用库(如 zlib、freetype、libjpeg)

🏗️ 技术基础

  • 语言:C++
  • 授权协议:LGPL
  • 平台:Linux / Windows / macOS
  • 主要头文件#include <podofo/podofo.h>

📦 常见用途

  1. 批量生成 PDF 报告
  2. 批量提取页数、作者、标题等元数据
  3. 根据程序逻辑创建图形、表格型 PDF
  4. 读取 PDF 对象结构进行分析或修改

⚠️ 局限性

  • 不支持 PDF 渲染(不能直接显示或截图)
  • 对于复杂加密和 PDF/A 等标准支持有限
  • 文档和社区相对较小,不如 poppler 丰富

📌 官方地址

  • GitHub 镜像(非官方): https://github.com/podofo/podofo
  • 官方网站(较旧): http://podofo.sourceforge.net/

1、安装podofo

方式1:apt安装

sudo apt install libpodofo-dev
# 确认是否安装成功
dpkg -LA libpodofo-dev

出现类似这样的路径说明没问题。
在这里插入图片描述

方式2:源码安装

git clone https://github.com/podofo/podofo.git
cd podofo
mkdir build && cd build
cmake ..
make
sudo make install

2、示例代码

下面是一个使用PoDoFo库来过滤PDF文件的示例代码。假设我们有一个目录,里面包含多个PDF文件,我们想根据某些条件(比如页数)来过滤这些文件。

2.1 main.cpp

#include <podofo/podofo.h>
#include <iostream>
#include <filesystem>
#include <vector>namespace fs = std::filesystem;void FilterPDFs(const std::string& directory, int minPages) {std::vector<std::string> filteredFiles;for (const auto& entry : fs::directory_iterator(directory)) {if (entry.is_regular_file() && entry.path().extension() == ".pdf") {try {PoDoFo::PdfMemDocument document;// std::cout<<entry.path().string()<<std::endl;document.Load(entry.path().c_str());// 获取PDF文件的页数int numPages = document.GetPageCount();if (numPages >= minPages) {filteredFiles.push_back(entry.path().string());}} catch (const PoDoFo::PdfError& e) {std::cerr << "Error processing file " << entry.path().string() << ": " << e.what() << std::endl;}}}// 输出符合条件的PDF文件std::cout << "Filtered PDF files with at least " << minPages << " pages:" << std::endl;for (const auto& file : filteredFiles) {std::cout << file << std::endl;}
}int main() {std::string directory = "/your/pdf/path/";  // 替换为你的PDF文件所在目录int minPages = 5;  // 过滤条件:至少包含5页的PDF文件FilterPDFs(directory, minPages);return 0;
}
  • PoDoFo库:这是一个C++库,用于创建、修改和解析PDF文件。在这个例子中,我们使用它来加载PDF文件并获取其页数。
  • std::filesystem:这是C++17引入的标准库,用于处理文件系统相关的操作,如遍历目录中的文件。
  • FilterPDFs函数:该函数接收一个目录路径和最小页数作为参数,遍历目录中的所有PDF文件,并根据页数进行过滤。
  • 异常处理:在加载PDF文件时可能会出现错误(例如文件损坏),因此我们使用try-catch块来捕获并处理这些错误。

2.2 CMakeLists.txt

# 指定CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)# 定义项目名称和编程语言
project(PdfFilter VERSION 1.0 LANGUAGES CXX)# 设置C++标准 (例如C++17)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_EXTENSIONS False)# podofo
find_library(PODOFO_LIBRARY podofo)# 添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)# 如果有第三方库需要链接,可以使用target_link_libraries
target_link_libraries(${PROJECT_NAME} ${PODOFO_LIBRARY})message("🐼 ${PODOFO_LIBRARY}")

2.3 编译运行

  • 编译
mkdir build
cd build
cmake ..
-- The CXX compiler identification is GNU 13.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
🐼 /usr/lib/libpodofo.so
-- Configuring done (1.4s)
-- Generating done (0.0s)
-- Build files have been written to: /mnt/d/cppworkspace/PDFDemo/build
make
[ 50%] Building CXX object CMakeFiles/PdfFilter.dir/main.cpp.o
[100%] Linking CXX executable PdfFilter
[100%] Built target PdfFilter
  • 运行
./PdfFilter
  • 文件结构
.
|-- main.cpp
|-- CMakeLists.txt
|-- build
|   |-- CMakeCache.txt
|   |-- CMakeFiles
|   |-- Makefile
|   |-- PdfFilter
|   |-- cmake_install.cmake

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文分享➲ arXiv2025 | TTRL: Test-Time Reinforcement Learning

TTRL: Test-Time Reinforcement Learning TTRL&#xff1a;测试时强化学习 https://github.com/PRIME-RL/TTRL &#x1f4d6;导读&#xff1a;本篇博客有&#x1f9a5;精读版、&#x1f407;速读版及&#x1f914;思考三部分&#xff1b;精读版是全文的翻译&#xff0c;篇幅较…

dify插件接入fastmcp示例

文章目录 1. 使用python完成mcp服务1.1 准备环境&#xff08;python安装fastmcp&#xff09;1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略&#xff08;支持 MCP 工具&#xff09; 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置&#xff…

Linux 挖矿木马排查命令清单

Linux 挖矿木马排查命令清单 1. 系统资源使用情况检查 # 查看CPU、内存使用情况 top -c# 检查CPU占用最高的进程 ps aux --sort-%cpu# 查找可疑进程名 ps -ef | grep -i miner\|cpu\|GPU\|xmr# 检查网络连接情况 lsof -i2. 可疑进程和隐藏进程检查 # 检查僵尸进程 ps -ef | …

PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式

一个简单的矩阵乘法例子来演示在 PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式。 这个例子会展示核心的区别在于如何获取和指定计算设备&#xff0c;以及&#xff08;对于 TPU&#xff09;可能需要额外的库和同步操作。 示例代码&#xff1a; import torch import tim…

自主shell命令行解释器

目标 能处理普通命令能处理内建命令 实现原理 用下面的时间轴来表示时间发生次序。时间从左向右。shell由标识为sh的方块&#xff0c;它随着时间从左向右移动。 shell从用户读入字符串“ls”。shell建立一个新的进程&#xff0c;然后等待进程中运行ls程序并等待进程结束。 …

如何在sheel中运行Spark

启动hdfs集群&#xff0c;打开hadoop100:9870&#xff0c;在wcinput目录下上传一个包含很多个单词的文本文件。 启动之后在spark-shell中写代码。 // 读取文件&#xff0c;得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 将单词进行切…

【入门】数字走向II

描述 输入整数N&#xff0c;输出相应方阵。 输入描述 一个整数N。&#xff08; 0 < n < 10 ) 输出描述 一个方阵&#xff0c;每个数字的场宽为3。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int in;i>1;i--){for(…

Python自动化-python基础(下)

六、带参数的装饰器 七、函数生成器 运行结果&#xff1a; 八、通过反射操作对象方法 1.添加和覆盖对象方法 2.删除对象方法 通过使用内建函数: delattr() # 删除 x.a() print("通过反射删除之后") delattr(x, "a") x.a()3 通过反射判断对象是否有指定…

重新定义高性能:Hyperlane —— Rust生态中的极速HTTP服务器

重新定义高性能&#xff1a;Hyperlane —— Rust生态中的极速HTTP服务器 &#x1f680; 为什么选择Hyperlane&#xff1f; 在追求极致性能的Web服务开发领域&#xff0c;Hyperlane 凭借其独特的Rust基因和架构设计&#xff0c;在最新基准测试中展现出令人惊艳的表现&#xff…

通俗的理解MFC消息机制

1. 消息是什么&#xff1f; 想象你家的门铃响了&#xff08;比如有人按门铃、敲门、或者有快递&#xff09;&#xff0c;这些都是“消息”。 在 MFC 中&#xff0c;消息就是系统或用户触发的各种事件&#xff0c;比如鼠标点击&#xff08;WM_LBUTTONDOWN&#xff09;、键盘输入…

腾讯开源SuperSonic:AI+BI如何重塑制造业数据分析?

目录 一、四款主流ChatBI产品 二、ChatBI应用案例与实际落地情况 三、SuperSonic底层原理 3.1、Headless BI 是什么 3.2、S2SQL 是什么 3.3、SuperSonic 平台架构 四、ChatBI应用细节深挖 五、与现有系统的集成方案 六、部署和安全 七、开源生态、可扩展性与二次开…

AI生成视频推荐

以下是一些好用的 AI 生成视频工具&#xff1a; 国内工具 可灵 &#xff1a;支持文本生成视频、图片生成视频&#xff0c;适用于广告、电影剪辑和短视频制作&#xff0c;能在 30 秒内生成 6 秒的高清视频&#xff08;1440p&#xff09;&#xff0c;目前处于免费测试阶段。 即…

OrangePi Zero 3学习笔记(Android篇)5 - usbutils编译(更新lsusb)

目录 1. Ubuntu中编译 2. AOSP编译 3. 去掉原来的配置 3. 打包 4. 验证lsusb 在Ubuntu中&#xff0c;lsusb的源代码源自usbutils。而OrangePi Zero 3中lsusb的位置可以看文件H618-Android12-Src/external/toybox/Android.bp&#xff0c; "toys/other/lsusb.c",…

bcm5482 phy 场景总结

1,BCM5482是一款双端口10/100/1000BASE-T以太网PHY芯片,支持多种速率和双工模式。其配置主要通过MDIO(Management Data Input/Output)接口进行,MDIO接口用于访问PHY芯片内部的寄存器,从而配置网络速率、双工模式以及其他相关参数。 a,具体以下面两种场景举例 2. 寄存器和…

RedHat磁盘的添加和扩容

前情提要 &#x1f9f1; 磁盘结构流程概念图&#xff1a; 物理磁盘 (/dev/sdX) └── 分区&#xff08;如 /dev/sdX1&#xff09;或整块磁盘&#xff08;直接使用&#xff09; └── 物理卷 (PV, 用 pvcreate) └── 卷组 (VG, 用 vgcreate) …

Lua—元表(Metatable)

原表解析 在 Lua table 中我们可以访问对应的 key 来得到 value 值&#xff0c;但是却无法对两个 table 进行操作(比如相加)。 因此 Lua 提供了元表(Metatable)&#xff0c;允许我们改变 table 的行为&#xff0c;每个行为关联了对应的元方法。 setmetatable(table,metatable…

一种运动平台扫描雷达超分辨成像视场选择方法——论文阅读

一种运动平台扫描雷达超分辨成像视场选择方法 1. 专利的研究目标与意义1.1 研究目标1.2 实际意义2. 专利的创新方法与技术细节2.1 核心思路与流程2.1.1 方法流程图2.2 关键公式与模型2.2.1 回波卷积模型2.2.2 最大后验概率(MAP)估计2.2.3 统计约束模型2.2.4 迭代优化公式2.3 …

Listremove数据时报错:Caused by: java.lang.UnsupportedOperationException

看了二哥的foreach陷阱后&#xff0c;自己也遇见了需要循环删除元素的情况&#xff0c;立马想到了当时自己阴差阳错的避开所有坑的解决方式&#xff1a;先倒序遍历&#xff0c;再删除。之前好使&#xff0c;但是这次不好使了&#xff0c;报错Caused by: java.lang.UnsupportedO…

Ceph集群OSD运维手册:基础操作与节点扩缩容实战

#作者&#xff1a;stackofumbrella 文章目录 一、Ceph集群的OSD基础操作查看osd的ID编号查看OSD的详细信息查看OSD的状态信息查看OSD的统计信息查看OSD在主机上的存储信息查看OSD延迟的统计信息查看各个OSD使用率集群暂停接收数据集群取消暂停 OSD写入权重操作查看默认OSD操作…

PHP框架在分布式系统中的应用!

随着互联网业务的快速发展&#xff0c;分布式系统因其高可用性、可扩展性和容错性成为现代应用架构的主流选择。而PHP作为一门成熟的Web开发语言&#xff0c;凭借其简洁的语法、丰富的框架生态和持续的性能优化&#xff0c;逐渐在分布式系统中崭露头角。本文将深入探讨PHP框架在…