PoDoFo 0.10.3提取PDF文本遇API问题,求正确实现方案
PoDoFo 0.10.3 提取PDF文本实现方案
问题根源
PoDoFo 0.10.x版本对API做了重构,PdfMemDocument不再包含GetPageCount()方法,需通过页面容器获取页数;同时提取文本需要借助PdfContentsTokenizer解析页面内容流。
完整可运行代码
#include <vector> #include <string> #include <iostream> #include <podofo/podofo.h> using namespace PoDoFo; void parseOneFile(const std::string_view& filename, std::vector<std::string>& pageTexts) { PdfMemDocument document; document.Load(filename.data()); // 获取文档总页数 const int pageCount = document.GetPages().GetCount(); for (int pn = 0; pn < pageCount; ++pn) { PdfPage* page = document.GetPages().GetPageAt(pn); if (!page) continue; std::string pageText; PdfContentsTokenizer tokenizer(page); PdfVariant variant; std::string token; // 遍历页面内容流中的所有token while (tokenizer.ReadNext(token, variant)) { // 处理单行文本操作符 Tj if (token == "Tj") { if (variant.IsString()) { pageText += variant.GetString().GetStringUtf8(); } } // 处理多行文本操作符 TJ else if (token == "TJ") { if (variant.IsArray()) { const PdfArray& arr = variant.GetArray(); for (const auto& elem : arr) { if (elem.IsString()) { pageText += elem.GetString().GetStringUtf8(); } } } } // 可选:处理换行操作符,按需添加 else if (token == "T*") { pageText += "\n"; } } pageTexts.emplace_back(std::move(pageText)); } } // 使用示例 int main() { std::vector<std::string> allPageTexts; parseOneFile("test.pdf", allPageTexts); // 输出提取结果 for (size_t i = 0; i < allPageTexts.size(); ++i) { std::cout << "第 " << i+1 << " 页文本:\n" << allPageTexts[i] << "\n\n"; } return 0; }
关键说明
- 页数与页面获取:通过
document.GetPages().GetCount()获取总页数,GetPages().GetPageAt(pn)获取指定页面,这是PoDoFo 0.10.x的标准用法。 - 文本解析核心:PDF文本内容通过
PdfContentsTokenizer读取,重点处理Tj(单行文本)和TJ(文本数组)两个操作符,拼接成单页完整文本。 - 编码处理:使用
GetStringUtf8()确保提取的文本为UTF-8编码,避免中文等非ASCII字符乱码。
内容的提问来源于stack exchange,提问作者ThomasAlvaEdison
相关产品推荐
相关产品推荐

