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教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
Django如何配置mysql数据库
May 04 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python中property函数用法实例分析
Jun 04 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
python 实现汉诺塔游戏
Nov 28 Python
详解Python调用系统命令的六种方法
Jan 28 Python
python库sklearn常用操作
Aug 23 Python
Python学习之时间包使用教程详解
Mar 21 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
解析PHP缓存函数的使用说明
2013/05/10 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
php HTML无刷新提交表单
2016/04/05 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
浅谈js中的bind
2019/03/18 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
python使用matplotlib画饼状图
2018/09/25 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
python中uuid模块实例浅析
2020/12/29 Python
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
计生专干事迹
2014/05/28 职场文书
干部对照检查材料范文
2014/08/26 职场文书
班主任经验交流材料
2014/12/16 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015政治思想表现评语
2015/03/25 职场文书
中秋节主题班会
2015/08/14 职场文书