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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
Python实现二分法算法实例
Feb 02 Python
在Django中创建第一个静态视图
Jul 15 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
Python使用sort和class实现的多级排序功能示例
Aug 15 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python+pyqt5实现24点小游戏
Jan 24 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
学习python需要有编程基础吗
Jun 02 Python
详解pycharm自动import所需的库的操作方法
Nov 30 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
Python 统计序列中元素的出现频度
Apr 26 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
php的ajax简单实例
2014/02/27 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
js计数器代码
2006/11/04 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
Element Input组件分析小结
2018/10/11 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
教育专业自荐书范文
2013/12/17 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
保安岗位职责
2014/02/21 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
部队2015年终工作总结
2015/04/02 职场文书
怎样写观后感
2015/06/19 职场文书
告知书格式
2015/07/01 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技