📚 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>
📦 常見用途
- 批量生成 PDF 報告
- 批量提取頁數、作者、標題等元數據
- 根據程序邏輯創建圖形、表格型 PDF
- 讀取 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