20行Python代码实现一款永久免费PDF编辑工具的实现


Posted in Python onAugust 27, 2020

PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献、文档...很多都是PDF格式。它以格式稳定的优势,使得我们在打印、分享、传输过程中能够最优的保持原有色彩和格式。

PDF是以PostScript语言图像模型为基础的一种文档格式,它在格式的稳定性方面虽然具有很大优势。但是,在可编辑性方面却为使用者引入了另外一个困扰。

20行Python代码实现一款永久免费PDF编辑工具的实现

例如,在文档的分割、合并、剪切、转换、编辑等方面PDF就有些捉襟见肘了。

Adobe Reader、福昕阅读器、熊猫PDF...经常用到的PDF工具只能用于文档阅读,但是免费版都不可以用于文档编辑。虽然,网页版PDF工具,例如SmallPDF、I love PDF可以用于PDF的编辑,但是对于文档大小也有限制。

曾经,为了替换PDF中的一页,我几乎试遍了所有市面上主流的PDF工具,最终还是不得不选择使用付费工具来解决问题。

事后想了想,既然这些商业化软件不靠谱,为什么不考虑自己动手开发一款工具呢?明明几十行代码能够解决的问题,为什么要费那么多劲去下载、安装那些没有节操的软件呢?

本文就来介绍一下利用Python轻松开发一款PDF编辑工具,可以用于PDF转TxT、分割、合并、剪切、转换。

PyPDF2

PyPDF2是一个第三方的python PDF库,它能够对PDF文件进行分割、合并、裁剪和转换页面。

另外,它还可以对PDF文件添加自定义数据、水印、密码,也可以从PDF文件中检索出文本和元数据。

安装

使用pip直接安装:

$ pip install PyPDF2

下面就来演示几项PDF编辑功能,并且会逐行解释代码的含义。

删除PDF页

先给出实现代码,

from PyPDF2 import PdfFileWriter, PdfFileReader

output = PdfFileWriter()   // 1
input1 = PdfFileReader(open("example.pdf", "rb")) // 2

def delete_pdf(index):
 pages = input1.getNumPages() // 3

 for i in range(pages):
 if i+1 in index:
  continue
 output.addPage(input1.getPage(i)) // 4

 outputStream = open("PyPDF2-output.pdf", "wb")
 output.write(outputStream) // 5

delete_pdf([2,3,4])

下面来解释一下代码中的几个关键点:

  • 声明一个用于输出PDF的实例;
  • 读取本地PDF文件;
  • 获取PDF文档的页数;
  • 读取PDF的第i页,添加到输出output实例中;
  • 把编辑后的文档保存到本地;

合并PDF

已经实现了删除PDF页,接下来就看一下如何把另外一个PDF中的页面合并到当前PDF中。

方法1:

可以沿着前面删除PDF页的方式进行拓展一下,对PDF进行合并。

from PyPDF2 import PdfFileWriter, PdfFileReader

output = PdfFileWriter()
input1 = PdfFileReader(open("example.pdf", "rb"))
input2 = PdfFileReader(open("simple2.pdf", "rb")) // 1

def merge_pdf(add_index, origin_index):
 pages = input1.getNumPages()
 k = 0
 for i in range(pages):
 if i+1 in add_index:
  output.addPage(input2.getPage(origin_index[k])) // 2
  pages += 1
  k += 1
 output.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 // 1

merger = PdfFileMerger()

input1 = open("document1.pdf", "rb") // 2
input2 = open("document2.pdf", "rb")
input3 = open("document3.pdf", "rb")

merger.append(fileobj = input1, pages = (0,3)) // 3

merger.merge(position = 2, fileobj = input2, pages = (0,1)) // 4

merger.append(input3) // 5

output = 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转TxT

pdfminer在GitHub的托管项目中,在目录tools下给出了一些实用的工具集,例如,PDF转HTML、PDF转HTML、PDF转TXT。我们可以直接通过使用下面命令提出PDF文档中的文本信息。

$ pdf2txt.py samples/simple1.pdf

总结

通过上述2款Python库,就可以实现从页面到文本元数据的编辑,本文只是简单的介绍了每项的基本用法。关于详细的用法和函数列表,可以阅读官方文档,或者阅读GitHub上项目源码进行了解。此外,可以在这些基本的用法基础上进行发散思维,发掘更多有价值的应用场景,例如,提出文本数据之后调用翻译API进行文献翻译。也可以,对软件进行封装,开发成一款通用的PDF编辑工具。

到此这篇关于20行Python代码实现一款永久免费PDF编辑工具的实现的文章就介绍到这了,更多相关Python 免费PDF编辑工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
Python 中的Selenium异常处理实例代码
May 03 Python
python基于物品协同过滤算法实现代码
May 31 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
如何在向量化NumPy数组上进行移动窗口
May 18 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 Python
python使用pymysql模块操作MySQL
Jun 16 Python
基于python实现操作redis及消息队列
Aug 27 #Python
Python3如何在服务器打印资产信息
Aug 27 #Python
python 8种必备的gui库
Aug 27 #Python
Django静态文件加载失败解决方案
Aug 26 #Python
Python趣味入门教程之循环语句while
Aug 26 #Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 #Python
如何把python项目部署到linux服务器
Aug 26 #Python
You might like
杏林同学录(五)
2006/10/09 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
python实现的config文件读写功能示例
2019/09/24 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
影视制作岗位职责
2013/12/04 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
消防安全宣传口号
2014/06/10 职场文书
销售口号大全
2014/06/11 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
浅谈MySQL user权限表
2021/06/18 MySQL
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL