Python工具箱系列(四十六)

PDF(Portable Document Format)是一种便携文档格式,它基于PostScripty这种脚本语言。

​​

PDF文档操作

PDF(Portable Document Format)是一种便携文档格式,它基于PostScripty这种脚本语言,它是第一个独立于设备的页面描述语言。pdf格式是与平台无关,独立于底层操作系统和渲染引擎。由于PDF文档遵循标准格式,相关生态建设完善,应用广泛,非常值得花费时间讨论使用python进行操作。


 

python中能够操作pdf格式文档的库有:
 

◆PyMuPDF

◆pikepdf

◆pdfplumber

◆ReportLab

◆borb

主攻方向稍有不同,大致分类是:
 

◆pikepdf专注对已经存在的PDF的操作,例如分割、合并、旋转等

◆pdfplumber专注PDF内容提取,例如文本(位置、字体及颜色等)和形状(矩形、直线、曲线),此外还能够解析表格

◆ReportLab专注PDF页面内容(文本、图、表等)的创建

◆PyMuPDF和borb同时支持读、写及PDF页面操作,功能最为全面

◆borb是较新的库,功能也较为完善,但经过笔者试用,对于中文的支持不好

PyMuPDF的基本功能全面,非常适应用于批处理PDF。使用python来操作PDF/WORD/EXCEL/PPT等类文档,应该有如下的期望:

◆进行创作是非常不称手的。为何不用Office提供的工具软件进行编辑创作呢。因此,不能够指望这类库以及python提供非常全面完善的能力

◆能够在原来文档的基础上,进行批量化的一些操作。例如,可以基于某个模板,批量得制作邀请函,只要简单得修改姓名即可。或者根据数据库中的内容,在模板的基础上,定期形成周报、月报类固定格式的文档

◆能够在原来文档的基础上,增加、删除以及调整图片、文字与页面布局

所以,下述代码均从已经存在的内容入手进行演示:
 

01.

图片处理

timport os
import fitzprint(fitz.__doc__)def export2png(filename,pageno):"""将pdf文件指定页(从0开始算)导出为PNG图片文件Args:filename (string): PDF文件名pageno (int): 页号(从0开始)"""with fitz.open(filename) as doc:page = doc[pageno]pix = page.get_pixmap()  pix.save("page-%i.png" % pageno)def export2svg(filename,pageno):"""将pdf文件指定页(从0开始算)导出为SVG矢量图Args:filename (string): PDF文件名pageno (int): 页号(从0开始)"""with fitz.open(filename) as doc:page = doc[pageno]svg = page.get_svg_image(matrix=fitz.Identity)output = open("page-%i.svg" % pageno,'w')output.write(svg)output.close()def figs2pdf(filename,startdir):"""将指定目录下的所有图片文件合并成为PDF文件Args:filename (string): 未来要生成的PDF文件名称startdir (string): 图片所在目录"""doc = fitz.open()# 列出目录下所有文件imglist = os.listdir(startdir) imglist.sort() for _, f in enumerate(imglist):# 遍历并且打开每个图片文件img = fitz.open(os.path.join(startdir, f))# 计算图片大小rect = img[0].rectpdfbytes = img.convert_to_pdf()img.close()# 将图片文件贴合到PDF页上imgPDF = fitz.open("pdf", pdfbytes) page = doc.new_page(width = rect.width,height = rect.height) page.show_pdf_page(rect, imgPDF, 0)# 保存到目标PDF中doc.save(filename) def convert(inputfile,outputfile):"""对图片格式进行转换Args:inputfile (string): 源图片outputfile (string): 目标图片"""pix = fitz.Pixmap(inputfile)pix.save(outputfile)       pdfname = r'd:\test\sed.pdf'figs2pdf(r'd:\test\demo.pdf',r'D:\test\all\figures')export2png(pdfname,10)
export2svg(pdfname,10)convert(r"D:\test\all\serial1\000000.gif",r'd:\test\0.psd')
convert(r"D:\test\all\serial1\000000.jpg",r'd:\est\1.png')

上述代码演示了合并图片与分解PDF到图片,转换图片格式等功能。

•其中figs2pdf函数完成了从指定目录的多个图片合成一个PDF文件的常用功能。相对复杂一些。

•pymupdf也提供了逆向生成图片的方法。

•export2png将指定PDF文件的指定页转换成为PNG文件,效果比截图好

•export2svg将指定PDF文件的指定页转换成为svg文件,而SVG文件是矢量图、能够编辑,这个功能更是强大

•convert函数能够将多种图片格式进行转换。代码演示了转换成为psd与png格式。当然这些功能是pymupdf赠送的功能,不能够与pillow等专业库相比

下面的代码演示如何从pdf中提取文字,以及获得PDF文档中的各类链接。

import fitzdef showmeta(filename):"""显示PDF的基本信息Args:filename (string): 要打开的PDF文件名称"""print(fitz.__doc__)doc = fitz.open(filename)print(doc.page_count)print(doc.metadata)def showlinks(filename):"""显示PDF中的所有超链Args:filename (string): 要打开的PDF文件名称"""with fitz.open(filename) as doc:for page in doc:for link in page.links():# 显示一个列表if link["kind"] == fitz.LINK_GOTO:print("Jump to page", link["page"] + 1)elif link["kind"] in (fitz.LINK_GOTOR, fitz.LINK_LAUNCH):print("Open or launch file", link["file"])elif link["kind"] == fitz.LINK_URI:print("Open URI", link["uri"])def showtext(filename, pageno, option='text'):"""显示pdf中的文字Args:filename (string): 要打开的PDF文件名称pageno (int): 页号option (选项): 可能是'text','block'等Returns:list: 所有的文字列表"""with fitz.open(filename) as doc:page = doc[pageno]return page.get_text(option)def searchtext(filename, pageno, searchstr):"""在pdf中搜寻文字Args:filename (string): 要打开的PDF文件名称pageno (int): 页号searchstr (string): 要搜索的内容Returns:list: 匹配文字所在的区域列表。"""with fitz.open(filename) as doc:page = doc[pageno]areas = page.search_for(searchstr)return areaspdfname = r'd:\test\阿里技术地图.pdf'print(showtext(pdfname, 9))
areas = searchtext(pdfname, 1, '数据挖掘')
for rect in areas:print(rect)
showlinks(pdfname)

以上代码中:

•showtext需要传递相关的选项。pymupdf可以提取多种类型的文字。具体可以参考

•searchtext函数的返回与通常的预期不同,返回的是多个区域所形成的列表。主要用途是为了相关的工具软件显示用,例如可以高亮等。如果用这个函数只是期待返回具体的文字内容的话,不妨直接获得文字,然后再使用字符串的搜索功能。

•showlinks函数直接获得了所有页上所有的链接。大部分链接是内部的跳转,也有使用编辑软件加入的外部超链。文字内的包含的URL使用pymupdf是找不到的,必须自己写函数对字符串进行语议分析才能够获得,这个也是pymupdf不完善的地方。

除了上述对PDF本身的操作外,还有从PDF到DOCX文档的双向转换需要。由DOCX文档转PDF文档非常容易,直接在WORD中选择打印或者导出即可,没有什么可以讨论的。但是反过来稍微困难些,可以考虑以下方法:

•直接用WORD打开PDF,然后另存为DOCX文档。

•使用pdf2docx转化

•使用python-office转化

pdf2docx是一个轻量级的第三方库,对中文的支持不错,本身是基于pymupdf库发展起来的,它的安装过程如下。

pip install pdf2docx
# upgrade
pip install --upgrade pdf2docx

《阿里的技术地图》这个PDF可以从网上下载到,内容比较丰富,值得一看。如果想要转换成为WORD文档,示例代码如下。

from pdf2docx import Converterinputfilename = r'd:\test\阿里技术地图.pdf'
outputfilename = r'd:\test\demo.docx'cv = Converter(inputfilename)
# 将PDF全部内容转换成为DOCX
cv.convert(outputfilename)
cv.close()cv = Converter(inputfilename)
# 将PDF部分页转换为DOCX
cv.convert(outputfilename,start=3,end=5)
cv.close()cv = Converter(inputfilename)
# 将PDF个别页转换为DOCX
cv.convert(outputfilename,pages=[10,16,8])
cv.close()

这个库转换速度不是太快,还提供了多进程的功能,但实际使用时会有BUG出现,不建议使用。
 


 

END

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

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

相关文章

清华大学提出全新加速训练大模型方法SoT

近日,微软研究和清华大学的研究人员共同提出了一种名为“Skeleton-of-Thought(SoT)”的全新人工智能方法,旨在解决大型语言模型(LLMs)生成速度较慢的问题。 尽管像GPT-4和LLaMA等LLMs在技术领域产生了深远影响,但其处…

提供电商数据|带你简单认识天猫API接口相关参数文档调用说明

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB为非结构化数据查询插上飞翔的翅膀——以企业知识库为例

前言 以前我曾疑惑,对于非结构化的内容,如一张图片或一段视频,如何实现搜索呢?图片或视频作为二进制文件,我们如何将其转化为可搜索的数据并存储起来,然后在搜索时将其还原呢? 后来我发现&…

5个高防CDN的特点

1. 支持泛解析自定义HTTPS/SSL隐藏源IP。 2. 支持缓存加速永久在线SEO优化。当网站原服务器宕机时,如果开启了此功能,用户仍然可以访问网站(用户看到的是 缓存数据),从而达到了网站永不中断服务的效果,可以…

Minio8版本冲突问题

今天在配置minio的时候遇到了一个报错 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-11-24 10:31:42.897 ERROR 14312 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *******************…

blk_mq_init_queue函数学习记录

blk-mq编程,主要要调用两个函数进行初始化工作,blk_mq_init_queue这是第二个。该函数先是申请了struct request_queue结构,这个请求队列后面用于赋值给磁盘那个结构体的相应成员。 struct request_queue *blk_mq_init_queue(struct blk_mq_t…

python3到文件的读取以及输出

excel表格的读取和输入输出 python中txt的读取和输入输出 txt输出报错👇 UnicodeEncodeError: ascii codec cant encode characters in position 154-157: ordinal not in range(128)解决方法

Tomcat 配置

1: 打开 2:选择版本号,我这边是 1.7 3:添加 web 4: 添加jar包 5:添加 6:添加 Tomcat

【每日一题】1410. HTML实体解析器-2023.11.23

题目: 1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括: 双引号:字符实体为 &…

vim翻页快捷键

Vim翻页 整页 Ctrlf向下翻页,下一页,相当于Page DownCtrlb向上翻页,上一页,相当于Page Up 半页 Ctrld向下半页,下一半页,光标下移Ctrlu向上半页,上衣半页,光标上移 按行 Ctrle…

vue2【组件的构成】

目录 1:什么是组件化开发 2:vue中的组件化开发 3:vue组件的三个组成部分 4:组件中定义方法,监听器,过滤器,计算属性节点。 5:template中只允许唯一根节点,style默认…

OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator

今天为大家介绍一款来自 OpenMLDB 社区的优秀独立工具 - OpenMLDB SQL Simulator(https://github.com/vagetablechicken/OpenMLDBSQLEmulator) ,可以让你更加高效方便的开发、调试 OpenMLDB SQL。 为了高效的实现时序特征计算,Op…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员,最近他接到了一个头疼的任务,那就是评估公司系统的安全性,因此他前来咨询,在得知SOCKS5代理IP可以帮他之后,他不禁产生疑问,这是什么原理?其实和小张一样的朋友不…

命令查询职责分离 (CQRS)

CQRS 的最初需求 多年来,传统的 CRUD(创建、读取、更新、删除)模式一直是系统架构的支柱。在 CRUD 中,读取和写入操作通常由相同的数据模型和相同的数据库模式处理。虽然这种方法简单直观,但随着系统规模的扩大和需求…

第99步 深度学习图像目标检测:SSDlite建模

基于WIN10的64位系统演示 一、写在前面 本期,我们继续学习深度学习图像目标检测系列,SSD(Single Shot MultiBox Detector)模型的后续版本,SSDlite模型。 二、SSDlite简介 SSDLite 是 SSD 模型的一个变种&#xff0c…

竹云参编《公共数据授权运营平台技术要求》团体标准正式发布

2023年11月23日,第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开,国家数据局党组书记、局长刘烈宏,浙江省委常委、常务副省长徐文光出席会议并致辞。会上,国家工业信息安全发展研究中心发布并解读了我国首部…

[Linux] 冯诺依曼体系结构 与 操作系统

文章目录 1、冯诺依曼体系结构2、操作系统 1、冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程,对云开发的入门做了介绍,以及使用一个省市地区联动的地址选择器…

三次输错密码后,系统是怎么做到不让我继续尝试的?

1故事背景 忘记密码这件事,相信绝大多数人都遇到过,输一次错一次,错到几次以上,就不允许你继续尝试了。 但当你尝试重置密码,又发现新密码不能和原密码重复: 图片 相信此刻心情只能用一张图形容&#xf…

Mobaxterm 使用lrzsz传输文件(rz/sz)

Mobaxterm 使用lrzsz传输文件报错 1. 现象 最近从xshell切换到Mobaxterm其他一切正常,就是使用rz传输文件时会出现错误,比较苦恼. 会出现以下错误 [rootcentos7 rpmbuild]# rz ▒CCCCCCCCCCC23be50ive.**B0100000023be502. 解决方法 去官网(https://mobaxterm.mobatek.net…