PDF文档中表格以及形状解析

news2025/3/3 10:05:52

我们在做PDF文档解析时有时需要解析PDF文档中的表格、形状等数据。跟解析文本类似的常见的解决方案也是两种。文档解析跟ocr技术处理。下面我们来看看使用文档解析的方案来做PDF文档中的表格、图形解析(使用pdfium库)。
表格解析:
在pdfium库中在解析表格时是将表格的线解析成单独的对象。所以我们在解析时只需要遍历页面中的所有线条,拿到线条之后再进行表格结构的重新组装即可。
以下为读取页面中线的相关代码:

std::string strPdfPath = "pdf.pdf";
//初始化库
FPDF_InitLibrary();
//加载文档
FPDF_DOCUMENT document = FPDF_LoadDocument(strPdfPath.c_str(), nullptr);
if (!document)
{
    //load error
}
//获取页数
int page_count = FPDF_GetPageCount(document);
//此处我们只演示处理第一页
FPDF_PAGE page = FPDF_LoadPage(document, 0); // 加载第一页 (索引 0)
if (page)
{
    int objCount = FPDFPage_CountObjects(page); //获取当前页的对象数
    for (int i = 0; i < objCount; ++i)
    {
        FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
        int nObjType = FPDFPageObj_GetType(obj);//对象类型
        switch (nObjType)
        {
            case FPDF_PAGEOBJ_UNKNOWN:
                break;
            case FPDF_PAGEOBJ_PATH: 
            {
                int nSegments = FPDFPath_CountSegments(obj); //
                std::vector<CPoint> vecPts;
                for (int j = 0; j < nSegments; j++)
                {
                    FPDF_PATHSEGMENT segment = FPDFPath_GetPathSegment(obj, j);
                    int nSegType = FPDFPathSegment_GetType(segment);//线段类型
                    switch (nSegType)
                    {
                        case FPDF_SEGMENT_UNKNOWN:
                            break;
                        case FPDF_SEGMENT_LINETO:
                        {
                            float x, y;
                            FPDFPathSegment_GetPoint(segment, &x, &y);
                            CPoint pt(x, y);
                            vecPts.push_back(pt);                                                   
                        }
                        break;
                        case FPDF_SEGMENT_BEZIERTO:
                        {
                            //                        
                        }
                        break;
                        case FPDF_SEGMENT_MOVETO:
                        {
                            float x, y;
                            FPDFPathSegment_GetPoint(segment, &x, &y);    
                            CPoint pt(x, y);
                            vecPts.push_back(pt);                        
                        }
                        break;
                        default:
                            break;                   
                    }                
                }            
            }     
            break;   
            default:
                break;                               
        }    
    }
}
FPDF_ClosePage(page);

通过上述代码我们获取Path对象中的数据即可拿到表格的线条,需要的注意的时如果只拿表格的线的话需要对线的数量做判断,如果对象只有两个点则为表格的线。这里拿到的线是整体的线。
在这里插入图片描述
比如上边的表格拿到的线数量为8条线段。
如果需要将线组成一个表格结构那我们需要自己做处理。大致的处理思路是将长线段打断为短线段然后再将短的线段组合成一个个的小多边形,根据多边形的上下左右共边关系生成一个表格结构。至于这里为什么要生成一个多边形,是为了后续做文本跟表格关联做准备。
根据之前文本解析文章中我们可以看到在获取文本信息时也能拿到文本的位置、大小等信息。所以我们在进行文本表格关联时只需要判断文本位置的那个点是否在表格的多边形内即可,如果在多边形内则说明PDF中该文本为表格中该单元格的数据。这样我们就可以生成一个虚拟的表格数据了。对于图片也是这样处理,拿到图片的中心点如果该点在多边形内则该图片为该表格中的数据。

形状解析:
读取代码跟读取线的代码一样,只是在读取形状时线的数量大于2。如果是圆、半圆之类的则其中一些点为贝塞尔曲线。我在测试时即使形状是线在解析时拿到的线的数量也是4个(一个闭合的多边形)。其他的形状经过测试也是一个闭合的多边形。
在这里插入图片描述
比如Word中的这些线条在解析出来后每个对象都是一些线段跟贝塞尔曲线组合成的一个闭合区域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解并实现自定义 unordered_map 和 unordered_set

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;unorder…

228页PPT丨制造业核心业务流程优化咨询全案(战略营销计划生产研发质量),附核心系统集成架构技术支撑体系,2月26日资料已更新

一、订单全生命周期管理优化 1. 智能订单承诺&#xff08;CTP&#xff09;系统 ●集成ERP/APS/MES数据&#xff0c;实时计算产能可视性 ●应用蒙特卡洛模拟评估订单交付风险 ●建立动态插单评估模型&#xff08;基于边际贡献与产能占用系数&#xff09; 2. 跨部门协同机制…

6.6.5 SQL访问控制

文章目录 GRANT授予权限REVOKE回收权限 GRANT授予权限 GRANT语句可以给用户授予权限&#xff0c;基本格式是GRANT 权限 TO 用户。在授权时&#xff0c;WITH GRANT OPTION是可选项&#xff0c;有此句话&#xff0c;被授予权限的用户还能把权限赋给其他用户。 REVOKE回收权限 RE…

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题&#xff0c;今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中&#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)&#xff0c;而size()是调用的string对象现在有…

智慧校园平台在学生学习与生活中的应用

随着科技的发展&#xff0c;教育领域也在不断探索新的模式与方法。智慧校园平台作为教育信息化的重要组成部分&#xff0c;正逐渐成为推动教育改革、提高教学质量的关键工具。 一.智慧校园平台概述 智慧校园平台是一种集成了教学管理、资源服务、数据分析等多功能于一体的数字…

AtCoder Beginner Contest 001(A - 積雪深差、B - 視程の通報、C - 風力観測、D - 感雨時刻の整理)题解

由于我发现网上很少有人会发很久之前AtCoder Beginner Contes的题&#xff0c;所以我打算从AtCoder Beginner Contest 001开始写。大约两周一更&#xff0c;需要的可以订阅专栏&#xff0c;感谢支持Thanks♪(&#xff65;ω&#xff65;)&#xff89; →题目翻译 A - 積雪深差…

Windows本地Docker+Open-WebUI部署DeepSeek

最近想在自己的电脑本地部署一下DeepSeek试试&#xff0c;由于不希望污染电脑的Windows环境&#xff0c;所以在wsl中安装了ollama&#xff0c;使用ollama拉取DeepSeek模型。然后在Windows中安装了Docker Desktop&#xff0c;在Docker中部署了Open-WebUI&#xff0c;最后再在Ope…

WSBDF レクチア 定义2 引理3 wsbdf的乘子

定义2 引理3 wsbdf的乘子 ここまで 寝みます❓

Odoo免费开源CRM技术实战:从商机线索关联转化为售后工单的应用

文 / 开源智造 Odoo金牌服务 Odoo&#xff1a;功能强大且免费开源的CRM Odoo 引入了一种高效的客户支持管理方式&#xff0c;即将 CRM 线索转换为服务台工单。此功能确保销售和支持团队能够无缝协作&#xff0c;从而提升客户满意度并缩短问题解决时间。通过整合 CRM 模块与服…

C语言(3)—循环、数组、函数的详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、函数二、循环与数组 1.循环2.数组 总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、函数 在C语言中&#xff0c;函数…

架构师论文《论面向对象设计的应用与实现》

软考论文-系统架构设计师 摘要 我所在的公司是国内一家专注于智慧城市建设的科技企业&#xff0c;为适应城市数字化转型中对于高内聚、低耦合、可扩展性的技术需求&#xff0c;2021年3月&#xff0c;公司立项开发“智慧社区综合管理平台”&#xff0c;旨在整合物业管理、安防监…

现代未来派品牌海报设计液体装饰英文字体安装包 Booster – Liquid Font

CS Booster – 具有动态流的液体显示字体 具有液体美感的现代显示字体 CS Booster 是一种未来主义的显示字体&#xff0c;采用流畅和有机的形式设计&#xff0c;赋予其流畅、灵活和不断移动的外观。独特的液体灵感形状和非刚性边缘使这款字体脱颖而出&#xff0c;提供一种既俏…

(十 四)趣学设计模式 之 策略模式!

目录 一、 啥是策略模式&#xff1f;二、 为什么要用策略模式&#xff1f;三、 策略模式的实现方式四、 策略模式的优缺点五、 策略模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

kkfileview部署

kkfileview部署 链接: 官方文档 链接: gitee 链接: github 首先打开官网如下&#xff1a; OK&#xff0c;我们从官方文档的教程中看到&#xff0c;部署步骤如下: 是不是很简单&#xff0c;没错&#xff0c;于是我们按照步骤从码云上下载&#xff0c;然后解压&#xff0c;然…

文件描述符(File Descriptor)

一、介绍 内核&#xff08;kernel&#xff09;利用文件描述符&#xff08;file descriptor&#xff09;来访问文件。文件描述符是非负整数。打开现存文件或新建文件时&#xff0c;内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。 二、功能 文件…

钉钉MAKE AI生态大会思考

1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…

[操作系统] 文件的软链接和硬链接

文章目录 引言硬链接&#xff08;Hard Link&#xff09;什么是硬链接&#xff1f;硬链接的特性硬链接的用途 软链接&#xff08;Symbolic Link&#xff09;什么是软链接&#xff1f;软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…

【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像

【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像 文章目录 ADC原始数据C语言解析Python的2D-FFT图像附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput informati…

LeeCode题库第三十九题

39.组合总和 项目场景&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同…

B/B+树与mysql索引

数据结构操作网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(log n)O(log n) B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(…