Python中pdfplumber与pypdf2库如何对pdf进行操作

Python操作PDF全总结

  • 介绍
  • pdfplumber使用方法
    • 安装
    • 使用
      • 简单样例
      • 提取单页pdf文字
      • 提取所有页pdf文字
      • 提取所有pdf文字并写入文本中
      • 提取PDF表格
  • pypdf2使用方法
    • 安装
    • 使用详情
      • PdfFileReader 对象的属性和方法
        • PDF 读取操作:
      • PdfFileWrite
        • PDF 写入操作:
      • 分割PDF:
      • 合并PDF:
      • PDF旋转
      • PDF加密解密
        • 加密
        • 解密
      • PDF添加水印
  • 最后

介绍

最近一个小demo需要对PDF进行操作,于是一不做而不休本着人人为我,我为人人的角度写我在做PDF操作时候用到的方法,同时也相当于给自己做知识普及,
pypdf2模块:
可以读取、写入、分割、合并PDF文件,需要单独安装

pdfplumber模块:
为了更好的读取PDF文件内容
可以提取PDF中的表格

因此若处理对象是PDF文档本身,则推荐使用pypdf2,如对 PDF 文档进行分割,合并, 插入等操作。
若处理对象是 PDF 文档中的文本,表格等内容,则推荐使用 pdfplumber。

pdfplumber使用方法

pdfplumber库按页处理 pdf ,获取PDF中的每个文本字符、矩形和行的详细信息,以及可以进行表格提取和可视化调试。主要应用于机器生成的PDF上,而非扫描的pdf文档。
具体介绍地址:https://github.com/jsvine/pdfplumber

安装

  1. RPM式系统(Redhat、CentOS)
pip install pdfplumber
  1. DEB式系统(Debian、Ubuntu)以下任一
pip install pdfplumber
apt install python-pdfplumber
  1. Windows
pip install pdfplumber

然后进行测试,如果能够正常显示则表明倒入成功。

使用

简单样例

import pdfplumber
with pdfplumber.open("test.pdf") as pdf:
    first_page = pdf.pages[0]
    print(first_page.chars[0])

其中:pdfplumber提供了两种读取pdf的方式:
pdfplumber.open("test.pdf")
pdfplumber.load(file_like_object)
这两种方法都返回pdfplumber.PDF类的实例(instance)。
加载带密码的pdf需要传入参数password,例如:
pdfplumber.open("file.pdf", password = "test")

提取单页pdf文字

import pdfplumber
with pdfplumber.open("test.pdf") as pdf:
    first_page = pdf.pages[0]
    text = first_page.extract_text()#提取文本
    print(text)

Python中pdfplumber与pypdf2库如何对pdf进行操作_第1张图片

提取所有页pdf文字

import pdfplumber
with pdfplumber.open("test.pdf") as pdf:
    for page in pdf.pages: #遍历所有页码
        text = page.extract_text()#提取文本
        print(text)

提取所有pdf文字并写入文本中

import pdfplumber
with pdfplumber.open("test.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()#提取文本
        txt_file = open("test2.txt",mode='a',encoding='utf-8')
        txt_file.write(text)

提取PDF表格

pdfplumber的表检测方法大量借鉴了Anssi Nurminen的硕士学位论文),并受到Tabula的启发。 它是这样的:

  • 对于任何给定的PDF页面,请找到(a)明确定义的行 且/或(b)页面上的单词对齐所隐含的行。
  • 合并重叠或几乎重叠的线。
  • 找到所有这些线的交点。
  • 查找使用这些相交作为其顶点的最细粒度的矩形集(即单元格)。
  • 将连续的单元格分组到表中
# 提取pdf表格
import pdfplumber
with pdfplumber.open("test.pdf") as pdf:
    PDF = pdf.pages[0] #指定页码
    table1 = PDF.extract_table()#提取单个表格
    # table2 = PDF.extract_tables()#提取多个表格
    print(table1)

具体提取参数设置可以参考https://blog.csdn.net/weixin_48629601/article/details/107224376

pypdf2使用方法

安装

  1. RPM式系统(Redhat、CentOS)
pip install pypdf2
  1. DEB式系统(Debian、Ubuntu)以下任一
pip install pypdf2
apt install python-pypdf2
  1. Windows
pip install pypdf2

使用详情

PyPDF2 中有两个最常用的类:PdfFileReader和PdfFileWriter,分别用于读取 PDF 和写入 PDF。其中PdfFileReader传入参数可以是一个打开的文件对象,也可以是表示文件路径的字符串。而PdfFileWriter则必须传入一个以写方式打开的文件对象。

PdfFileReader 对象的属性和方法

属性和方法 描述
getDestinationPageNumber(destination) 检索给定目标对象的页码
getDocumentInfo() 检索 PDF 文件的文档信息字典
getFields(tree = None,retval = None,fileObj= None) 如果此 PDF 包含交互式表单字段,则提取字段数据
getFormTextFields() 从文档中检索带有文本数据(输入,下拉列表)的表单域
getNumPages() 计算此 PDF 文件中的页数
getOutlines(node = None,outline = None,) 检索文档中出现的文档大纲
getPage(pageNumber) 从这个 PDF 文件中检索指定编号的页面
getPageLayout() 获取页面布局
getPageMode() 获取页面模式
getPageNumber(pageObject) 检索给定 pageObject 处于的页码
getXmpMetadata()) 从 PDF 文档根目录中检索 XMP 数据
isEncrypted 显示 PDF 文件是否加密的只读布尔属性
namedDestinations 访问该getNamedDestinations()函数的只读属性
PDF 读取操作:
# encoding:utf-8
from PyPDF2 import PdfFileReader, PdfFileWriter

readFile = 'RxJava 完全解析.pdf'
# 获取 PdfFileReader 对象
pdfFileReader = PdfFileReader(readFile)  # 或者这个方式:pdfFileReader = PdfFileReader(open(readFile, 'rb'))
# 获取 PDF 文件的文档信息
documentInfo = pdfFileReader.getDocumentInfo()
print('documentInfo = %s' % documentInfo)
# 获取页面布局
pageLayout = pdfFileReader.getPageLayout()
print('pageLayout = %s ' % pageLayout)

# 获取页模式
pageMode = pdfFileReader.getPageMode()
print('pageMode = %s' % pageMode)

xmpMetadata = pdfFileReader.getXmpMetadata()
print('xmpMetadata  = %s ' % xmpMetadata)

# 获取 pdf 文件页数
pageCount = pdfFileReader.getNumPages()

print('pageCount = %s' % pageCount)
for index in range(0, pageCount):
    # 返回指定页编号的 pageObject
    pageObj = pdfFileReader.getPage(index)
    print('index = %d , pageObj = %s' % (index, type(pageObj)))  # 
    # 获取 pageObject 在 PDF 文档中处于的页码
    pageNumber = pdfFileReader.getPageNumber(pageObj)
    print('pageNumber = %s ' % pageNumber)

PdfFileWrite

这个类支持 PDF 文件,给出其他类生成的页面。
属性和方法 描述
addAttachment(fname,fdata) 在 PDF 中嵌入文件
addBlankPage(width= None,height=None) 追加一个空白页面到这个 PDF 文件并返回它
addBookmark(title,pagenum,parent=None,color=None,bold=False,italic=False,fit=’/fit,*args’)
addJS(javascript) 添加将在打开此 PDF 是启动的 javascript
addLink(pagenum,pagedest,rect,border=None,fit=’/fit’,*args) 从一个矩形区域添加一个内部链接到指定的页面
addPage(page) 添加一个页面到这个PDF 文件,该页面通常从 PdfFileReader 实例获取
getNumpages() 页数
getPage(pageNumber) 从这个 PDF 文件中检索一个编号的页面
insertBlankPage(width=None,height=None,index=0) 插入一个空白页面到这个 PDF 文件并返回它,如果没有指定页面大小,就使用最后一页的大小
insertPage(page,index=0) 在这个 PDF 文件中插入一个页面,该页面通常从 PdfFileReader 实例获取
removeLinks() 从次数出中删除连接盒注释
removeText(ignoreByteStringObject = False) 从这个输出中删除图像
write(stream) 将添加到此对象的页面集合写入 PDF 文件
PDF 写入操作:
def addBlankpage():
    readFile = 'test.pdf'
    outFile = 'test1.pdf'
    pdfFileWriter = PdfFileWriter()

    # 获取 PdfFileReader 对象
    pdfFileReader = PdfFileReader(readFile)  # 或者这个方式:pdfFileReader = PdfFileReader(open(readFile, 'rb'))
    numPages = pdfFileReader.getNumPages()

    for index in range(0, numPages):
        pageObj = pdfFileReader.getPage(index)
        pdfFileWriter.addPage(pageObj)  # 根据每页返回的 PageObject,写入到文件
        pdfFileWriter.write(open(outFile, 'wb'))

    pdfFileWriter.addBlankPage()   # 在文件的最后一页写入一个空白页,保存至文件中
    pdfFileWriter.write(open(outFile,'wb'))

分割PDF:

from PyPDF2 import  PdfFileReader, PdfFileWriter
file_reader = PdfFileReader("Python编码规范中文版.pdf")
# getNumPages() 获取总页数
for page in range(file_reader.getNumPages()):
    # 实例化对象
    file_writer = PdfFileWriter()
    # 将遍历的每一页添加到实例化对象中
    file_writer.addPage(file_reader.getPage(page))
    with open("D:\\pdffiles\\{}.pdf".format(page),'wb') as out:
        file_writer.write(out)

合并PDF:

from PyPDF2 import  PdfFileReader, PdfFileWriter
file_writer = PdfFileWriter()
for page in range(34):
    # 循环读取需要合并pdf文件
    file_reader = PdfFileReader("{}.pdf".format(page))
    # 遍历每个pdf的每一页
    for page in range(file_reader.getNumPages()):
        # 写入实例化对象中
        file_writer.addPage(file_reader.getPage(page))

with open("合并.pdf",'wb') as out:
    file_writer.write(out)

PDF旋转

# 旋转pdf,只能按照90度的倍数旋转
from PyPDF2 import  PdfFileReader, PdfFileWriter
file_reader = PdfFileReader("test.pdf")
file_writer = PdfFileWriter()
page = file_reader.getPage(0).rotateClockwise(90) # 第1页顺时针旋转90度
file_writer.addPage(page) # 写入
page = file_reader.getPage(1).rotateCounterClockwise(90) # 第2页逆时针旋转90度
file_writer.addPage(page) # 写入
with open("旋转.pdf",'wb') as out:
    file_writer.write(out)

PDF加密解密

加密
from PyPDF2 import  PdfFileReader, PdfFileWriter
file_reader = PdfFileReader("test.pdf")
file_writer = PdfFileWriter()
for page in range(file_reader.getNumPages()):
    file_writer.addPage(file_reader.getPage(page))

file_writer.encrypt('123456') # 设置密码
with open("加密后.pdf",'wb') as out:
    file_writer.write(out)
解密
from PyPDF2 import  PdfFileReader, PdfFileWriter
file_reader = PdfFileReader("加密后.pdf")
file_reader.decrypt('123456')
file_writer = PdfFileWriter()
for page in range(file_reader.getNumPages()):
    file_writer.addPage(file_reader.getPage(page))

with open("解密后.pdf",'wb') as out:
    file_writer.write(out)

PDF添加水印

# 添加水印
from PyPDF2 import  PdfFileReader, PdfFileWriter
from copy import copy
sy = PdfFileReader("test.pdf")
mark_page = sy.getPage(0) # 水印所在的页数
# 读取添加水印的文件
file_reader = PdfFileReader("test1.pdf")
file_writer = PdfFileWriter()

for page in range(file_reader.getNumPages()):
    # 读取需要添加水印每一页pdf
    source_page = file_reader.getPage(page)
    new_page = copy(mark_page) #
    new_page.mergePage(source_page) # new_page(水印)在下面,source_page原文在上面
    file_writer.addPage(new_page)

with open("test2.pdf",'wb') as out:
    file_writer.write(out)

最后

附上github地址:https://github.com/jsvine/pdfplumber
http://mstamy2.github.io/PyPDF2/

你可能感兴趣的:(自学,参考,python,xpdf)