gpt4 book ai didi

c++ - C++ 中的 PDF 解析 (PoDoFo)

转载 作者:IT老高 更新时间:2023-10-28 23:22:37 29 4
gpt4 key购买 nike

嗨,我正在尝试从一些 pdf 中解析一些文本,我想使用 PoDoFo,现在我尝试搜索如何使用 PoDoFo 解析 pdf 的示例,但是我能想出的只是示例如何创建和编写不是我真正需要的 pdf 文件。

如果有人有任何使用 PoDoFo 解析 PDF 文件的教程或示例,或者对我可以使用的其他库有建议,请告诉我。我也知道 linux 上有 pdftotext,但是,我不仅不能使用它,而且我更希望能够在内部完成我需要做的所有事情,而不是依赖正在安装的外部程序。

最佳答案

PoDoFo 没有提供从文档中轻松提取文本的方法,但并不难做到。

将文档加载到 PdfMemDocument:

PoDoFo::PdfMemDocument pdf("mydoc.pdf");

遍历每一页:

for (int pn = 0; pn < pdf.GetPageCount(); ++pn) {
PoDoFo::PdfPage* page = pdf.GetPage(pn);

遍历该页面上的所有 PDF 命令:

    PoDoFo::PdfContentsTokenizer tok(page);
const char* token = nullptr;
PoDoFo::PdfVariant var;
PoDoFo::EPdfContentsType type;
while (tok.ReadNext(type, token, var)) {
switch (type) {
case PoDoFo::ePdfContentsType_Keyword:
// process token: it contains the current command
// pop from var stack as necessary
break;
case PoDoFo::ePdfContentsType_Variant:
// process var: push it onto a stack
break;
default:
// should not happen!
break;
}
}
}

“进程 token ”和“进程变量”注释是它变得更复杂的地方。您将获得要处理的原始 PDF 命令。幸运的是,如果您实际上并没有呈现页面并且您想要的只是文本,那么您可以忽略其中的大部分。您需要处理的命令是:

BTETTdTDTsT, Tm, Tf, ", ', TjTJ

BTET 命令标记文本流的开始和结束,因此您希望忽略不在 BT 之间的任何内容/ET 对。

PDF 语言基于 RPN。命令流由压入堆栈的值和将值从堆栈中弹出并处理它们的命令组成。

"'TjTJ 命令是唯一实际生成文本的命令。"'Tj 返回单个字符串。使用 var.IsString()var.GetString() 进行处理。

TJ 返回一个字符串数组。您可以使用以下方法提取每个:

if (var.isArray()) {
PoDoFo::PdfArray& a = var.GetArray();
for (size_t i = 0; i < a.GetSize(); ++i)
if (a[i].IsString())
// do something with a[i].GetString()

其他命令用于确定何时引入换行符。 "' 也引入了换行符。最好的办法是从 Adob​​e 下载 PDF 规范并查找文本处理部分。它更详细地解释了每个命令的作用.

我发现编写一个小程序来获取 PDF 文件并转储每个页面的命令流非常有帮助。

注意:如果您所做的只是提取没有定位信息的原始文本,那么您实际上不需要维护 var 值的堆栈。所有的文本渲染命令最多只有一个参数。您可以简单地假设 var 中的最后一个值包含当前命令的参数。

关于c++ - C++ 中的 PDF 解析 (PoDoFo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11715561/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com