zoukankan      html  css  js  c++  java
  • 付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具

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

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

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1097524789

    例如,在文档的分割、合并、剪切、转换、编辑等方面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])
    

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

    1. 声明一个用于输出PDF的实例;

    2. 读取本地PDF文件;

    3. 获取PDF文档的页数;

    4. 读取PDF的第 i 页,添加到输出 output 实例中;
    5. 把编辑后的文档保存到本地;

    合并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])
    
    1. 读取需要合并的源文件;

    2. 遍历到指定页,合并源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)
    
    1. 导入PyPDF2合并模块 PdfFileMerger ;
    2. 读取需要处理和合并的PDF文档;

    3. 从第一个PDF文档中取出需要合并的前3页;

    4. 把第二个PDF文档的第一页插入到文档中;

    5. 把第三个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编辑工具

  • 相关阅读:
    hdu-1142(记忆化搜索+dij)
    hdu-1140(求距离,精度判断)
    hdu-1131(卡特兰数+大数)
    hdu-1130(卡特兰数+大数乘法,除法模板)
    hdu-1129(模拟题)
    hdu-1128(数学问题,筛数)
    hdu-1124(数学问题,求n!的尾零的个数)
    hdu-1115(计算多边形重心)
    hdu-1121(差分法--数学问题)
    表达式求值(堆栈)
  • 原文地址:https://www.cnblogs.com/shann001/p/13322494.html
Copyright © 2011-2022 走看看