20行Python代码实现一款永久免费PDF编辑工具
作者:程序员枸杞. 发布时间:2023-11-17 23:51:45
PDF是我们经常会接触到的一种文件格式,文献、文档...很多都是PDF格式。它以格式稳定的优势,使得我们在打印、分享、传输过程中能够最优的保持原有色彩和格式。
PDF是以PostScript语言图像模型为基础的一种文档格式,它在格式的稳定性方面虽然具有很大优势。但是,在可编辑性方面却为使用者引入了另外一个困扰。
例如,在文档的分割、合并、剪切、转换、编辑等方面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
来源:https://blog.csdn.net/SixStar_FL/article/details/125635991
猜你喜欢
- 在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的标准。而采用索引来加快数据处理速度也成为广大数据库用户所
- package work;import java.io.BufferedReader;import java.io.IOException;
- 本文介绍了asp中 adpbe.stream 的语法,各种参数使用说明,方便大家查阅。更多请看:VBScript 速查手册(语言参考) ch
- 1、简要说明结巴分词支持三种分词模式,支持繁体字,支持自定义词典2、三种分词模式全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快
- 近又开始做网页,发现之前写的页面不规范,这次从头在来,希望一次比一次进步,先从CSS中的标点符号开始吧,这篇做为草稿已经放了很长时间了,还是
- 代码如下:--相信大家肯定经常会把数据导入到数据库中,但是可能会有些记录行的所有列的数据是null,这为null的数据是我们不需要 --现在
- Microsoft JET Database Engine 错误 '80040e2
- 首先,把这个“功能”包含到页首:<!--#include virtual="/readini/inifile.in
- 调用tf.reset_default_graph()重置计算图当在搭建网络查看计算图时,如果重复运行程序会导致重定义报错。为了可以在同一个线
- XMLHttpRequest 最近在 W3C 标准之路上又迈进了一步,W3C Web API&nbs
- EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )在线正则表达式测试:http://www.aspxhome.com/RegE
- 给网页添加打印按钮,除了打印之外,还有页面设置、打印预览、复制本文链接到剪贴板等网页基本应用。正象我在图中标注的,大部分按钮只能适用于IE浏
- 什么是SQL 指令植入式攻击?在设计或者维护Web网站时,你也许担心它们会受到某些卑鄙用户的恶意攻击。的确,如今的Web网站开发者们针对其站
- 在web开发中常常要使用js,为了提高效率一般都会制作js的类文件。这样在使用中更新复用都很方便。下面按照我工作中的一个案例,介绍如何定义j
- 前几天,看到有人写了个superLink的东东,主要的做什么用呢?我们有时会给在大块元素加个window.location='htt
- 文字向下滾動,逐渐隐藏效果~ 挺好的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT
- 1. 区分读锁定 和 写 锁定。 如果每次都使用 写锁定,那么连多个进程读取一个文件也要排队,这样的效率肯定不行。 2. 区分 阻塞 与 非
- 我想没多少人敢保证写JavaScript能不用调试,那选择用什么方式调试会比较好呢?告别了我最爱的alert("MM")
- 学习vue和nodejs的过程当中,涉及到了axios,今天为了测试,写了get和post两个方法来跟node服务端交互,结果因为heade
- 阅读上一章:打印样式Chapter 12 CSS布局本书到此为止,讨论的主要是页面内部元素,也就是内容,但是大结构怎么办?长久以来,设计者都