使用Python获取PDF文本和图片的精确位置

在处理和分析PDF文档时,获取文本和图片在页面上的精确位置是一个重要的操作。通过确定这些元素的具体坐标,我们可以实现对PDF内容的更精细控制和理解,这对于自动化文档处理、信息提取以及内容重组等工作流程尤为关键。通过Python编程语言,我们可以轻松获取PDF页面上文本及图像的精确坐标,使我们能够在不影响其原有排版的情况下对内容进行操作。本文将介绍如何使用Python获取PDF文本和图片在页面上的位置坐标

文章目录

    • 用Python在PDF中查找文本并获取其页面坐标位置
    • 用Python获取PDF页面指定图像的坐标位置

本文所使用的方法需要用到Spire.PDF for Python,PyPI:pip install spire.pdf

Spire.PDF for Python通过一个起点位于页面左上角的坐标系来处理PDF页面元素的位置,x轴向右延伸,y轴向下延伸。当我们在PDF页面放置文本、图像等内容时,我们可以直接使用x和y两个数值来确定位置。同时,我们也可以使用库中的属性获取指定元素在其页面上的位置。
页面坐标如图所示:
Spire.PDF for Python PDF页面坐标示意

用Python在PDF中查找文本并获取其页面坐标位置

PdfTextFinder类可以帮助我们以指定的查找选项在指定PDF页面中查找文本。查找到指定文本后,我们可以使用PdfTextFragment.Positions[0].XPdfTextFragment.Positions[0].Y属性访问文本的起始坐标,从而确定其精确位置。
同时,PdfTextFragment类还提供TextTextStates[].FontSize以及TextStates[].FontName属性来获取文本的更多信息,从而方便开发者对文本进行完全复制等操作。
以下是使用Python获取PDF文本的页面坐标位置的操作步骤示例:

  1. 导入所需模块:PdfDocumentPdfTextFinderPdfTextFindOptionsTextFindParameter
  2. 创建PdfDocument实例,使用PdfDocument.LoadFromFile()方法载入用于操作的PDF文档。
  3. 使用PdfDocument.Pages.get_Item()获取指定页面页面,或循环文档所有页面循环页面。
  4. 使用页面创建PdfTextFinder实例。
  5. 创建PdfTextFindOptions实例,通过PdfTextFindOptions.Parameter属性,使用TextFindParameter指定查找选项。
  6. 通过PdfTextFinder.Options应用查找选项。
  7. 使用PdfTextFinder.Find(str: text)方法在页面上查找指定文本。
  8. 判断是否有查找结果。如果有,则遍历查找结果,使用PdfTextFragment.Positions[0].XPdfTextFragment.Positions[0].Y属性获取文本的坐标。
  9. 输出结果,或对文本进行其他操作。

代码示例

from spire.pdf import PdfDocument, PdfTextFinder, PdfTextFindOptions, TextFindParameter# 创建一个 PdfDocument 实例
pdf = PdfDocument()# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")textFound = False # 标志,用于检查是否找到文本
# 遍历所有页
for i in range(pdf.Pages.Count):# 获取一页page = pdf.Pages.get_Item(i)# 创建一个 PdfTextFinder 实例finder = PdfTextFinder(page)# 设置搜索选项options = PdfTextFindOptions()options.Parameter = TextFindParameter.WholeWord  # 搜索完整单词finder.Options = options# 查找文本results = finder.Find("History and Cultural Significance")# 检查是否找到文本if len(results) > 0:textFound = True  # 标记为已找到# 遍历所有结果for text in results:# 获取起始坐标x = text.Positions[0].Xy = text.Positions[0].Y# 获取结束坐标x2 = text.Positions[-1].Xprint("在第 " + str(i+1) + " 页找到文本,坐标:\n" + "X: " + str(x) + "\nY: " + str(y) + "\n")
# 如果没有找到文本,打印未找到的消息
if not textFound:print("未找到文本。")pdf.Close()

结果
Python获取PDF文本位置

用Python获取PDF页面指定图像的坐标位置

我们可以使用PdfPageBase.ImagesInfo属性获取指定PDF页面的图片信息列表,然后遍历列表获取,使用PdfImageInfo.Bounds.XPdfImageInfo.Bounds.Y属性获取图片的起始坐标。此外,我们还可以使用PdfImageInfo.Image属性直接获取图片为Stream,从而进行保存、复制等操作。
以下是获取PDF图片的页面坐标位置的操作步骤示例:

  1. 导入所需模块:PdfDocument
  2. 创建PdfDocument实例,使用PdfDocument.LoadFromFile()方法载入用于操作的PDF文档。
  3. 使用PdfDocument.Pages.get_Item()获取指定页面页面,或循环文档所有页面循环页面。
  4. 使用PdfPageBase.ImagesInfo属性获取页面的图片信息列表。
  5. 判断页面是否包含图片。如果包含,则遍历图片信息列表,使用PdfImageInfo.Bounds.XPdfImageInfo.Bounds.Y属性获取图片的起始坐标。
  6. 输出结果,或对图像进行其他操作。

代码示例

from spire.pdf import PdfDocument# 创建一个 PdfDocument 实例
pdf = PdfDocument()# 加载一个 PDF 文档
pdf.LoadFromFile("G:/Documents/Sample.pdf")imageFound = False  # 标志,用于指示是否找到图片
# 遍历所有页
for i in range(pdf.Pages.Count):# 获取一页page = pdf.Pages.get_Item(i)# 获取页面中的图片信息imagesInfo = page.ImagesInfo# 检查页面是否包含图片if len(imagesInfo) > 0:imageFound = True  # 标记为已找到图片# 遍历所有图片for j in range(len(imagesInfo)):# 获取图片信息imageInfo = page.ImagesInfo[j]# 获取图片的坐标x = imageInfo.Bounds.Xy = imageInfo.Bounds.Y# 打印坐标信息print(f"第 {i + 1} 页的第 {j + 1} 张图片。坐标:\nX={x}, Y={y}")
# 如果没有找到任何图片,打印未找到图片的消息
if not imageFound:print("文档中没有图片。")
pdf.Close()

结果
Python获取PDF图片位置

本文介绍如何使用Python或PDF文档中文本和图片在页面上的坐标,从而确定其精确位置。

申请免费License

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换

背景:某集团企业需要将oracle中间件全套产品,包含SOA BPM,IDM,OID,UCM,Webcenter Portal等全套中间件服务器进行迁移,从物理机迁移到虚拟化机器,同时,将现有的单节点测试服务器优化成为高可用的集群服务器,如下是核心迁…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机, vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式;nat模式;host模式 一、桥接模式 所谓桥接模式,也就是虚拟机与宿主机处于同一个网段, 宿主机…

300多种复古手工裁剪拼贴艺术时尚字母、数字、符号海报封面Vlog视频MOV+PNG素材

300复古时尚大小写字母、数字、符号拼贴海报封面平面设计Vlog视频标题动画 Overlay - Cut-Out Letters Animations Pack - Animated Letters, Numbers, and Symbols 使用 Cut-Out Letters Animations Pack 提升您的内容!包含 300多个高品质动画资源,包括…

探索Flink动态CEP:杭州银行的实战案例

摘要:本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容: Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

ViT-Reg:面向tinyML平台的回归聚焦型硬件感知微调Vision Transformer

论文标题:ViT-Reg: Regression-Focused Hardware-Aware Fine-Tuning for ViT on tinyML Platforms 作者信息:Md Ragib Shaharear、Arnab Neelim Mazumder 和 Tinoosh Mohsenin,分别来自约翰霍普金斯大学电气与计算机工程系和马里兰大学巴尔的…

基于OpenCV和Python的人脸识别系统_django

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 操作日志管理 用户登录界面 用户…

【原创学习笔记】近期项目中使用的西门子V20变频器总结(上篇)

现场V20 22kW变频器如图所示 进线分别为L1,L2,L3,PE线,出现分别为U,V,W接电机 在西门子官网查询手册后,查询可知可以通过多种方式控制变频器,比如:面板(BOP)控制,端子(NPN/PNP&…

spring专题笔记(六):bean的自动装配(自动化注入)-根据名字进行自动装配、根据类型进行自动装配。代码演示,通俗易懂。

目录 一、根据名字进行自动装配--byName 二、根据类型进行自动装配 byType 本文章主要是介绍spring的自动装配机制, 用代码演示spring如何根据名字进行自动装配、如何根据类型进行自动装配。代码演示,通俗易懂。 一、根据名字进行自动装配--byName Us…

实战分享:开发设计文档模版及编写要点

总框架 一、需求类开发设计文档模版 1、PRD链接 PRD文档链接 2、后端设计 1)流程图/代码逻辑描述 描述代码逻辑,要求清晰准确,尽量用图表描述 超过3人天工作量的需求必须有流程图 2)库表设计 涉及数据库的改动&#xff0c…

Edge Scdn是用来干什么的?

酷盾安全Edge Scdn,即边缘式高防御内容分发网络,主要是通过分布在不同地理位置的多个节点,使用户能够更快地访问网站内容。同时,Edge Scdn通过先进的技术手段,提高了网上内容传输的安全性,防止各种网络攻击…

牛客周赛73B:JAVA

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 \hspace{15pt}小红拿到了正整数 xxx ,她希望你找到一个长度为 kkk 的区间,满足区间内恰好有 nnn 个数是 xxx 的倍数。你能帮帮她吗? 输入描述: …

微信小程序中遇到过的问题

记录微信小程序中遇到的问题(持续更新ing) 问题描述:1. WXML中无法直接调用JavaScript方法。2. css中无法直接引用背景图片。3. 关于右上角胶囊按钮。4. 数据绑定问题。5. 事件处理问题。 问题描述: 1. WXML中无法直接调用JavaSc…

Docker 安装mysql ,redis,nacos

一、Mysql 一、Docker安装Mysql 1、启动Docker 启动:sudo systemctl start dockerservice docker start 停止:systemctl stop docker 重启:systemctl restart docker 2、查询mysql docker search mysql 3、安装mysql 3.1.默认拉取最新版…

Leecode刷题C语言之字符串及其反转中是否存在同一子字符串

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool isSubstringPresent(char* s) {int i,lenstrlen(s),end;for(i0;i<len-1;i){if(s[i]s[i1]) return true;for(endlen-1;end>1;end--){if(s[i]s[end]&&s[i1]s[end-1]) return true;}}return false; }解…

uniapp登录

第一步整登录 先整个appid APPID和APPSecret https://developers.weixin.qq.com/community/develop/article/doc/000ca4601b8f70e379febac985b413 一个账号只能整一个小程序 正确流程 调用uni.login https://juejin.cn/post/7126553599445827621 https://www.jb51.net/a…

【开源免费】基于SpringBoot+Vue.JS安康旅游网站(JAVA毕业设计)

本文项目编号 T 098 &#xff0c;文末自助获取源码 \color{red}{T098&#xff0c;文末自助获取源码} T098&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

AIGC:生成图像动力学

文章目录 前言一、介绍二、方法2.1、运动预测模块运动纹理 2.2、图像渲染模块 三、数据集实验总结 前言 让静态的风景图能够动起来真的很有意思&#xff0c;不得不说CVPR2024 best paper实质名归&#xff0c;创意十足的一篇文章&#xff01;&#xff01;&#xff01; paper&a…

cesium入门学习二

之前学习了cesium的一些基本操作&#xff0c;现在学习cesium怎么加载模型&#xff0c;以及一些其他操作。 1.学习汇总目录 第一篇&#xff1a;cesium入门学习一-CSDN博客 2.cesium效果显示以及代码 2.1 加载模型并显示 效果&#xff1a; js代码&#xff1a; // 创建 Ces…

路由策略

控制层流量 --- 路由协议传递路由信息时产生的流量 数据层流量 --- 设备访问目标地址时产生的流量 所谓的路由策略----在控制层面转发流量的过程中&#xff0c;截取流量&#xff0c;之后修改流量再转发或不转发的技术&#xff0c;最终达到影响路由器路由表的生成&#xff0c…

网络安全 - Cross-site scripting

1.1.1 摘要 在本系列的第一篇博文中&#xff0c;我向大家介绍了SQL Injection常用的攻击和防范的技术。这个漏洞可以导致一些非常严重的后果&#xff0c;但幸运的是我们可以通过限制用户数据库的权限、使用参数化的SQL语句或使用ORM等技术来防范SQL Injection的发生&#xff0c…