python实现拆分、合并、删除pdf

PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献、文档…很多都是PDF格式。它以格式稳定的优势,使得我们在打印、分享、传输过程中能够最优的保持原有色彩和格式。PDF是以PostScript语言图像模型为基础的一种文档格式,它在格式的稳定性方面虽然具有很大优势。但是,在可编辑性方面却为使用者引入了另外一个困扰。

例如,在文档的分割、合并、剪切、转换、编辑等方面PDF就有些捉襟见肘了。Adobe Reader、福昕阅读器、熊猫PDF…经常用到的PDF工具只能用于文档阅读,但是免费版都不可以用于文档编辑。虽然,网页版PDF工具,例如SmallPDF、I love PDF可以用于PDF的编辑,但是对于文档大小也有限制。曾经,为了替换PDF中的一页,我几乎试遍了所有市面上主流的PDF工具,最终还是不得不选择使用付费工具来解决问题。事后想了想,既然这些商业化软件不靠谱,为什么不考虑自己动手开发一款工具呢?明明几十行代码能够解决的问题,为什么要费那么多劲去下载、安装那些没有节操的软件呢?本文就来介绍一下利用Python轻松开发一款PDF编辑工具,可以用于PDF转TxT、分割、合并、剪切、转换。PyPDF2PyPDF2是一个第三方的python PDF库,它能够对PDF文件进行分割、合并、裁剪和转换页面。另外,它还可以对PDF文件添加自定义数据、水印、密码,也可以从PDF文件中检索出文本和元数据。安装使用pip直接安装:
$ pip install PyPDF2

下面就来演示几项PDF编辑功能,并且会逐行解释代码的含义。删除PDF页先给出实现代码

from PyPDF2 import PdfFileWriter, PdfFileReaderoutput = PdfFileWriter()     // 1
input1 = PdfFileReader(open("example.pdf", "rb")) // 2def delete_pdf(index):pages = input1.getNumPages() // 3for i in range(pages):if i+1 in index:continueoutput.addPage(input1.getPage(i))  // 4outputStream = open("PyPDF2-output.pdf", "wb")output.write(outputStream)  // 5delete_pdf([2,3,4])

下面来解释一下代码中的几个关键点:声明一个用于输出PDF的实例;读取本地PDF文件;获取PDF文档的页数;读取PDF的第i页,添加到输出output实例中;把编辑后的文档保存到本地;合并PDF已经实现了删除PDF页,接下来就看一下如何把另外一个PDF中的页面合并到当前PDF中。方法1:可以沿着前面删除PDF页的方式进行拓展一下,对PDF进行合并。

from PyPDF2 import PdfFileWriter, PdfFileReaderoutput = PdfFileWriter()
input1 = PdfFileReader(open("example.pdf", "rb"))
input2 = PdfFileReader(open("simple2.pdf", "rb")) // 1def merge_pdf(add_index, origin_index):pages = input1.getNumPages()k = 0for i in range(pages):if i+1 in add_index:output.addPage(input2.getPage(origin_index[k])) // 2pages += 1k += 1output.addPage(input1.getPage(i))outputStream = open("PyPDF2-output.pdf", "wb")output.write(outputStream)merge_pdf([2,3,4], [0, 0, 0])

读取需要合并的源文件;遍历到指定页,合并源PDF的页面;方法2:除了方法1,还有另外一种方法可以合并PDF:

from PyPDF2 import PdfFileMerger // 1merger = PdfFileMerger()input1 = open("document1.pdf", "rb") // 2
input2 = open("document2.pdf", "rb")
input3 = open("document3.pdf", "rb")merger.append(fileobj = input1, pages = (0,3)) // 3merger.merge(position = 2, fileobj = input2, pages = (0,1)) // 4merger.append(input3) // 5output = open("document-output.pdf", "wb")
merger.write(output)

导入PyPDF2合并模块PdfFileMerger;读取需要处理和合并的PDF文档;从第一个PDF文档中取出需要合并的前3页;把第二个PDF文档的第一页插入到文档中;把第三个PDF文档附到输出文档末尾;除了上述介绍的2项主要功能,PyPDF2也有一些其他小功能:旋转input1.getPage(1).rotateClockwise(90)
使得页面1旋转90度。添加水印

page = input1.getPage(3)
watermark = PdfFileReader(open("watermark.pdf", "rb"))
page.mergePage(watermark.getPage(0))

其中,水印存储在另外一个PDF文档watermark.pdf中。加密

password = "secret"
output.encrypt(password)

首先给一个secret密码,然后使用encrypt对输出文档进行加密。pdfminer前面介绍的PyPDF2主要擅长于PDF页面级编辑,而对于文本和源数据级别编辑能力较弱。所以,这里就来介绍另外一款Python库来弥补它的不足。PDFMiner是一个PDF文档的文本提取工具,它具有如下特性:能够准确获取文本的位置和布局信息;可以将PDF转换为HTML/XML等格式;可以提取目录;可以提取标签内容;支持各种字体类型(Type1、TrueType、Type3和CID);支持中、日、韩语言和垂直书写文本;安装
$ pip install pdfminer
PDF转TxTpdfminer在GitHub的托管项目中,在目录tools下给出了一些实用的工具集,例如,PDF转HTML、PDF转HTML、PDF转TXT。我们可以直接通过使用下面命令提出PDF文档中的文本信息。$ pdf2txt.py samples/simple1.pdf
总结通过上述2款Python库,就可以实现从页面到文本元数据的编辑,本文只是简单的介绍了每项的基本用法。关于详细的用法和函数列表,可以阅读官方文档,或者阅读GitHub上项目源码进行了解。此外,可以在这些基本的用法基础上进行发散思维,发掘更多有价值的应用场景,例如,提出文本数据之后调用翻译API进行文献翻译。也可以,对软件进行封装,开发成一款通用的PDF编辑工具。

参考链接:https://www.zhihu.com/question/31586273

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

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

相关文章

Android官方开发文档Training系列课程中文版:手势处理之拖拽或缩放

原文地址:https://developer.android.com/training/gestures/scale.html 这节课主要学习如何使用触摸手势来拖动、放大屏幕上的对象。 拖动对象 如果你的重点在Android 3.0以上的版本,那么你可以使用内置的拖拽事件监听器View.OnDragListener。 触摸手…

2021年了,对话系统凉透了吗?

文 | 兔子酱编 | 夕小瑶大家好,我是可盐可甜的兔子酱,一枚卖萌屋的资深潜水小编,今天终于有了自己的第一篇文章,希望耗时一周撰写的本文能让大家有所收获~这篇文章,算是对自己在头部大厂2年算法岗炼丹经历的一个经验浓…

前端可用性保障实践

本文基于已发表在Infoq的“美团收银台前端可用性保障实践”一文编辑而成。 一般可用性都是说后端服务的可用性,都说我们的服务可用性到了几个9,很少有人把可用性放到前端来。其实对于任何一个有UI交互流程的业务,都会有前端服务可用性&#x…

LeetCode 762. 二进制表示中质数个计算置位

1. 题目 给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。 (注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。) …

报名通道开启 | 顶会 ICLR 2021:医疗对话生成与自动诊断国际竞赛,邀你来战!...

ICLR,2013 年由深度学习三巨头中的Yoshua Bengio 和 Yann LeCun 牵头创办,已受到研究者和开发者的广泛认可,是当之无愧的深度学习领域顶级会议。今年,由中山大学、加利福尼亚大学圣迭戈分校和腾讯天衍实验室等组织联合举办的医疗对…

论文浅尝 | 图神经网络的对抗攻击和防御相关文献集

本文转载自公众号:专知。作者:Wei Jin。导读:本资源整理了关于图形数据或GNN(图形神经网络)上的对抗攻击和防御的论文链接。并对其进行分类。目录Survey PapersAttack PapersDefense PapersCertified Robustness Papers地址连接:h…

Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理

原文地址:https://developer.android.com/training/gestures/viewgroup.html 在ViewGroup中处理触摸事件要格外小心,因为在ViewGroup中有很多子View,而这些子View对于不同的触摸事件来说是不同的目标。要确保每个View都正确的接收了相应的触…

李宏毅《机器学习》作业班+带打比赛

人工智能来势汹汹,学习人工智能该从哪里开始呢?人工智能的学习路径又是怎样的?须知入门人工智能第一步就是机器学习。但是,在上千份同学的学习反馈中,我们发现了2个人工智能学习领域的痛难点:1、课程偏理论…

mysql查询时间段内的数据

mysql查询时间段内的数据 -- 今天 select fullName,addedTime from t_user where to_days(addedTime) < to_days(now()); -- 昨天 select fullName,addedTime from t_user where to_days(NOW()) - TO_DAYS(addedTime) < 1; -- 近7天 select fullName,addedTime…

论文浅尝 – KDD2020 | 使用图对比编码的图神经网络预训练模型

论文笔记整理&#xff1a;陈名杨&#xff0c;浙江大学在读博士生&#xff0c;研究方向为知识图谱表示学习。图表示学习是一个当前关注度较高的领域&#xff0c;并且有许多真实的应用。然而当前的很多图表示学习方法都是对一个领域或者某一个图训练一个模型&#xff0c;也就是说…

LeetCode 575. 分糖果(set集合去重)

1. 题目 给定一个偶数长度的数组&#xff0c;其中不同的数字代表着不同种类的糖果&#xff0c;每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。 输入: candies [1,1,2,2,3,3] 输出: 3 解析: 一共有三种种类的糖…

Android官方开发文档Training系列课程中文版:键盘输入处理之指定输入的类型

原文地址&#xff1a;http://android.xsoftlab.net/training/keyboard-input/index.html 引言 在文本框接收到焦点时&#xff0c;Android系统会在屏幕上显示一个软键盘。为了提供良好的用户体验&#xff0c;你可以指定相关输入类型的特性&#xff0c;以及输入法应当如何展现。…

美团 R 语言数据运营实战

一、引言 近年来&#xff0c;随着分布式数据处理技术的不断革新&#xff0c;Hive、Spark、Kylin、Impala、Presto 等工具不断推陈出新&#xff0c;对大数据集合的计算和存储成为现实&#xff0c;数据仓库/商业分析部门日益成为各类企业和机构的标配。在这种背景下&#xff0c;是…

Android官方开发文档Training系列课程中文版:键盘输入处理之控制输入法的显示方式

原文地址&#xff1a;http://android.xsoftlab.net/training/keyboard-input/visibility.html 当输入的焦点进入或者离开文本框时&#xff0c;Android会适时的显示或隐藏输入法。系统还会决定UI及文本框如何出现在输入法的上方。比如&#xff0c;当垂直方向上的可用空间非常紧…

python用schedule模块实现定时任务

python用schedule模块实现定时任务 import schedule import timedef test():print("Im working...") def test2(): print("Im working... in job2")# 每10分钟执行一次job函数 schedule.every(10).minutes.do(test) # 每10秒执行一次job函数 schedule.…

天天说常识推理,究竟常识是什么?

文 | 花小花Posy写这篇文章的时候&#xff0c;我去搜了搜常识的例子。“睁开眼睛打喷嚏是不可能的。&#xff08;还真没留意。&#xff09;““北极熊是左撇子。“”长颈鹿没办法咳嗽。”呃&#xff1f;好吧&#xff0c;我需要补一补自己的常识。那么这些所谓的“常识”真的是常…

论文笔记 | Counterfactual Samples Synthesizing for Robust VQA

论文笔记整理&#xff1a;窦春柳&#xff0c;天津大学硕士。来源&#xff1a;CVPR 2020链接&#xff1a;https://openaccess.thecvf.com/content_CVPR_2020/papers/Chen_Counterfactual_Samples_Synthesizing_for_Robust_Visual_Question_Answering_CVPR_2020_paper.pdf动机当今…

Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus

背景 对于Android系统来说&#xff0c;消息传递是最基本的组件&#xff0c;每一个App内的不同页面&#xff0c;不同组件都在进行消息传递。消息传递既可以用于Android四大组件之间的通信&#xff0c;也可用于异步线程和主线程之间的通信。对于Android开发者来说&#xff0c;经常…

Android官方开发文档Training系列课程中文版:键盘输入处理之处理键盘按键

原文地址&#xff1a;http://android.xsoftlab.net/training/keyboard-input/commands.html 当用户将焦点给到可编辑文本的View时&#xff0c;例如EditText这种&#xff0c;并且该设备还拥有实体键盘&#xff0c;那么所有的输入都会被系统处理。然而&#xff0c;如果你希望可以…

MYSQL返回指定时间间隔函数DATE_SUB和TO_DAYS详解

现在北京时间&#xff1a;2021年1月25日 11点 select time,content from shsqsj where time > DATE_SUB(Now(),INTERVAL 2 DAY); 返回的数据是&#xff1a;2021年1月23日23日11点到现在时刻&#xff08;2021年1月25日 11点 &#xff09;的数据。更多请参考 DATE_SUB函数 现…