You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:50:11