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.pswp.cn/bicheng/80468.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80468.shtml
英文地址,請注明出處:http://en.pswp.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框架在…