找回密码
 立即注册
查看: 1391|回复: 0

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

  • TA的每日心情
    开心
    2022-1-29 18:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    184

    主题

    414

    回帖

    585

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    549470

    崭露头角活跃达人新人登场

    Seekladoom 发表于 2020-11-10 18:06:42 | 显示全部楼层 |阅读模式
    本帖最后由 Seekladoom 于 2020-11-11 01:39 编辑

    转自知乎:
    https://zhuanlan.zhihu.com/p/153468702

    PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献、文档...很多都是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直接安装:
    1. $ pip install PyPDF2
    复制代码
    下面就来演示几项PDF编辑功能,并且会逐行解释代码的含义。


    删除PDF页
    先给出实现代码:
    1. from PyPDF2 import PdfFileWriter, PdfFileReader

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

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

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

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

    12. delete_pdf([2,3,4])
    复制代码



    下面来解释一下代码中的几个关键点:
    1.声明一个用于输出PDF的实例;
    2.读取本地PDF文件;
    3.获取PDF文档的页数;
    4.读取PDF的第i页,添加到输出output实例中;
    5.把编辑后的文档保存到本地;



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


    方法1:
    可以沿着前面删除PDF页的方式进行拓展一下,对PDF进行合并。
    1. from PyPDF2 import PdfFileWriter, PdfFileReader

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

    5. def merge_pdf(add_index, origin_index):
    6. pages = input1.getNumPages()
    7. k = 0
    8. for i in range(pages):
    9.   if i+1 in add_index:
    10.    output.addPage(input2.getPage(origin_index[k])) // 2
    11.    pages += 1
    12.    k += 1
    13.   output.addPage(input1.getPage(i))

    14. outputStream = open("PyPDF2-output.pdf", "wb")
    15. output.write(outputStream)

    16. merge_pdf([2,3,4], [0, 0, 0])
    复制代码
    1.读取需要合并的源文件;
    2.遍历到指定页,合并源PDF的页面;

    方法2:
    除了方法1,还有另外一种方法可以合并PDF:
    1. from PyPDF2 import PdfFileMerger // 1

    2. merger = PdfFileMerger()

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

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

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

    8. merger.append(input3) // 5

    9. output = open("document-output.pdf", "wb")
    10. merger.write(output)
    复制代码

    导入PyPDF2合并模块PdfFileMerger;
    1.读取需要处理和合并的PDF文档;
    2.从第一个PDF文档中取出需要合并的前3页;
    3.把第二个PDF文档的第一页插入到文档中;
    4.把第三个PDF文档附到输出文档末尾;
    5.除了上述介绍的2项主要功能,PyPDF2也有一些其他小功能:

    旋转
    1. input1.getPage(1).rotateClockwise(90)
    复制代码
    使得页面1旋转90度。

    添加水印
    1. page = input1.getPage(3)
    2. watermark = PdfFileReader(open("watermark.pdf", "rb"))
    3. page.mergePage(watermark.getPage(0))
    复制代码
    其中,水印存储在另外一个PDF文档watermark.pdf中。

    加密
    1. password = "secret"
    2. output.encrypt(password)
    复制代码
    首先给一个secret密码,然后使用encrypt对输出文档进行加密。

    pdfminer
    前面介绍的PyPDF2主要擅长于PDF页面级编辑,而对于文本和源数据级别编辑能力较弱。
    所以,这里就来介绍另外一款Python库来弥补它的不足。
    PDFMiner是一个PDF文档的文本提取工具,它具有如下特性:

    · 能够准确获取文本的位置和布局信息;
    · 可以将PDF转换为HTML/XML等格式;
    · 可以提取目录;
    · 可以提取标签内容;
    · 支持各种字体类型(Type1、TrueType、Type3和CID);
    · 支持中、日、韩语言和垂直书写文本;


    安装
    1. <font face="微软雅黑" size="3">$ pip install pdfminer</font>
    复制代码

    PDF转TXT
    pdfminer在GitHub的托管项目中,在目录tools下给出了一些实用的工具集,例如,PDF转HTML、PDF转HTML、PDF转TXT。我们可以直接通过使用下面命令提出PDF文档中的文本信息。
    1. <font face="微软雅黑" size="3">$ pdf2txt.py samples/simple1.pdf</font>
    复制代码

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


    最近,为了方便大家,我花费了半个月的时间把这几年来收集的各种实用工具整合到一起,其中涉及影音娱乐、效率办公、系统清理、编程开发等上百款强大工具,其中涵盖Windows、Mac、Andriod、Chrome,我把各种软件的安全下载链接整理到一个文档中供大家使用,减少麻烦、避免踩坑,目录如下:



    所有干货送给大家,希望能够点赞支持一下!
    https://pan.baidu.com/s/1StnTCgCgOful535PMU_ioQ(提取码:0000)


    知乎搜索“开源 PDF 嵌入字体 Python”的结果:
    https://www.zhihu.com/search?type=content&q=%E5%BC%80%E6%BA%90%20PDF%20%E5%B5%8C%E5%85%A5%E5%AD%97%E4%BD%93%20Python


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    一个对动画组来说真正耐用的中文字体应该具备哪些条件?
    https://bbs.acgrip.com/forum.php?mod=viewthread&tid=5310

    使用思源字体在Aegisub中制作字幕时的一些常见问题
    https://bbs.acgrip.com/forum.php?mod=viewthread&tid=3805
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表