PDF文档中文本解析

ops/2025/2/22 12:38:53/

常用的PDF文档解析解决方案有两种。
一是通过文档结构读取解析,另一种是通过ocr技术处理。
这里我们主要说一下文档读取解析的方案,现在常用的解析库有mupdfpdfium、Aspose等第三方库来处理。其中mupdfpdfium为开源、免费的。Aspose是一款收费的商业库。
下边我们分别说一说各种库的使用。

mupdf
库编译以及链接至项目中这里就不做介绍了我们主要说一下使用该库做文本提取,代码示例如下:

std::string strPath = "pdf.pdf";
fz_context* ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
fz_register_document_handlers(ctx);
fz_document* doc = fz_open_document(ctx, strPath.c_str());
int nCount = fz_count_pages(ctx, doc);
if (nCount > 0)
{//这里我们只演示第一页数据的获取,如果需要获取其他页的则自行处理fz_stext_page* text_page = fz_new_stext_page(ctx, fz_bound_page(ctx, page));fz_device* device = fz_new_stext_device(ctx, text_page, NULL);fz_run_page(ctx, page, device, fz_identity, NULL);fz_stext_block* block;SStringW sstrData;for (block = text_page->first_block; block; block = block->next){if (block->type == FZ_STEXT_BLOCK_TEXT){fz_stext_line* line;for (line = block->u.t.first_line; line; line = line->next){fz_stext_char* ch;for (ch = line->first_char; ch; ch = ch->next){//获取字符SStringW sstrChar;sstrChar.Format(L"%c", ch->c);sstrData += sstrChar;     //获取字体std::string strFont = ch->font->name;//其他参数获取可自行实现,具体能获取那些可参考fz_stext_char结构,比如颜色、大小、位置等数据//TODO:                                                                                                        }    sstrData += L"\n";        }        }  }
}

pdfium
代码示例如下:

std::string strPath = "pdf.pdf";
FPDF_InitLibrary();
FPDF_DOCUMENT document = FPDF_LoadDocument(strPath.c_str(), nullptr);
if (!document)
{//error
}
int nCount = FPDF_GetPageCount(document);
if (nCount > 0)
{//这里我们只演示第一页数据的获取,如果需要获取其他页的则自行处理FPDF_PAGE page = FPDF_LoadPage(document, 0); // 加载第一页 (索引 0)if (page) {std::wstring wstrText; FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page);if (text_page){int char_count = FPDFText_CountChars(text_page);for (int i = 0; i < char_count; ++i) {unsigned short ch = FPDFText_GetUnicode(text_page, i);wchar_t wide_char = static_cast<wchar_t>(ch);wstrText += wide_char;}FPDFText_ClosePage(text_page);     }             }
}

在实际使用中发现使用mupdf解析文本时每一个block即为一段落的文本。但是在pdfium中获取的文本为整页中的所有文本,如果要划分段落则需要使用者自己根据字符的位置信息自己做归类处理。

Aspose
代码示例如下:

if (!System::IO::File::Exists(u"Example1.pdf"))
{//文件不存在
}
auto extractor = MakeObject<Facades::PdfExtractor>();
extractor->BindPdf(u"Example1.pdf");
extractor->ExtractText();auto memStream = MakeObject<System::IO::MemoryStream>();
extractor->GetText(memStream);auto unicode = System::Text::Encoding::get_Unicode();
String allText = unicode->GetString(memStream->ToArray());

http://www.ppmy.cn/ops/160510.html

相关文章

AI会取代人类?云电脑会取代传统PC吗?

随着DeepSeek的诞生及运用&#xff0c;AI相关内容再次引发社会的广泛关注和探讨。不仅不少人预测未来AI或将取代多数人类的工作&#xff0c;更可怕的是细细观察会发现目前AI其实已经取代了很多“蓝领”甚至“白领”的工作。不得不感叹AI真的太强、太全面了&#xff0c;果真是人…

该如何搭建高效的跨境网络专线?

在如今这个全球化的商业环境中&#xff0c;跨境网络专线成为了企业与个人实现高效、安全跨国通信的重要工具。大家好&#xff0c;在接下来的内容中&#xff0c;我将深入为您探讨跨境网络专线的概念、特点以及搭建流程&#xff0c;帮助您更好地理解和利用这一技术。 一、什么是…

jvm中各个参数的理解

MEMORY - MANAGERS 定义 MEMORY - MANAGERS即内存管理器&#xff0c;它是操作系统或软件系统中负责管理计算机内存资源的组件。从本质上来说&#xff0c;它是一种软件机制&#xff0c;旨在协调计算机系统中内存的分配、使用和回收等操作&#xff0c;确保系统能够高效、稳定地…

MinkowskiEngine安装(CUDA11.8+torch2.0.1+RTX4070TI)

1、背景 1&#xff09;因为项目要用这个库&#xff1a;MinkowskiEngine&#xff0c;Minkowski Engine — MinkowskiEngine 0.5.3 documentation 然后就用了之前安装好 MinkowskiEngine 的torch1.8.1,cuda11.1的环境。 2&#xff09;自己的代码出现cuda不支持torch用gpu进行矩…

Docker 性能优化指南

Docker 提供了强大的容器化功能&#xff0c;能够帮助开发者在不同的环境中构建、测试和部署应用。然而&#xff0c;随着容器化应用的不断增长&#xff0c;Docker 容器可能会面临一些性能瓶颈&#xff0c;影响其运行效率、资源占用和扩展能力。为了确保容器在生产环境中的高效运…

2024华为OD机试真题-单词接龙(C++)-E卷B卷-100分

2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述: 输入描述: 输出描述: 示例1 示例2 题目解析 考点 代码 c++ 题目描述: 单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取…

【登月计划】 DAY2 中期:产品研发与设计验证(4-6)--《设计图纸如何从电脑飞进生产线?揭秘研发系统的 “暗箱操作”》

目录 四、乐高教学&#xff1a;拆解 CAD/CAE 与 PLM 的 “共生关系” 1. CAD 系统&#xff1a;工程师的 “数字画笔” &#x1f3a8; 2. CAE 系统&#xff1a;产品的 “虚拟实验室” &#x1f52c; 3. PLM 系统&#xff1a;设计的 “大管家” 五、装逼话术&#xff1a;设计…

FPGA与传统硬件开发:开发流程与效率对比

随着科技的不断进步&#xff0c;硬件开发已经不再是一个单一的领域。在众多硬件开发平台中&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;因其灵活性、可重构性和高性能&#xff0c;逐渐成为电子工程师和硬件开发者的首选工具之一。然而&#xff0c;FPGA开发与传统…