1. PyPDF2 和 pdfplumber 库安装
- PyPDF2 官网:https://pythonhosted.org/PyPDF2/
- PyPDF2 可以更好的读取、写入、分割、合并 PDF 文件;
- pdfplumber 官网:https://github.com/jsvine/pdfplumber
- pdfplumber 可以更好地读取 PDF 文件内容和提取 PDF 中的表格;
- 这两个库不属于 python 标准库,都需要单独安装;
2. python 提取 PDF 文字内容
2 .1 利用 pdfplumber 提取文字
import PyPDF2
import pdfplumber
with pdfplumber.open("test.pdf") as p:
page = p.pages[2]
print(page.extract_text())
2 .2 利用 pdfplumber 提取表格并写入 excel
extract_table()
:如果一页有一个表格;extract_tables()
:如果一页有多个表格;
import PyPDF2
import pdfplumber
from openpyxl import Workbook
with pdfplumber.open("test.pdf") as p:
page = p.pages[24]
table = page.extract_table()
print(table)
workbook = Workbook()
sheet = workbook.active
for row in table:
sheet.append(row)
workbook.save(filename="新 pdf.xlsx")
缺陷:当提取出来的表格有很多空行时,怎么去掉这些空行呢?
判断:将列表中每个元素都连接成一个字符串,如果还是一个空字符串那么肯定就是空行。
import PyPDF2
import pdfplumber
from openpyxl import Workbook
with pdfplumber.open("test.pdf") as p:
page = p.pages[24]
table = page.extract_table()
print(table)
workbook = Workbook()
sheet = workbook.active
for row in table:
if not "".join([str(i) for i in row]) == "":
sheet.append(row)
workbook.save(filename = "新 pdf.xlsx")
3. PDF 合并及页面的排序和旋转
3.1 分割及合并 pdf
① 拆分 pdf
一个“test.pdf”的文件,将其每一页存为一个 PDF 文件。
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\test.pdf")
for page in range(pdf_reader.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(f"D:\\PythonCode\\{page}.pdf", "wb") as out:
pdf_writer.write(out)
② 合并 pdf
将被拆分的“test.pdf”文件重新合并为一个“merge.pdf”文件。
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_writer = PdfFileWriter()
for i in range(0,len(os.listdir(r"D:\PythonCode\test"))):
print(i,i+1)
pdf_reader = PdfFileReader("D:\\PythonCode\\test\{}.pdf".format(i,i+1))
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
with open("D:\\PythonCode\\test\merge.pdf", "wb") as out:
pdf_writer.write(out)
3.2 旋转及排序 pdf
① 旋转 pdf
.rotateClockwise(90 的倍数)
:顺时针旋转 90 度.rotateCounterClockwise(90 的倍数)
:逆时针旋转 90 度
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\49.pdf")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
if page % 2 == 0:
rotation_page = pdf_reader.getPage(page).rotateCounterClockwise(90)
else:
rotation_page = pdf_reader.getPage(page).rotateClockwise(90)
pdf_writer.addPage(rotation_page)
with open("D:\\PythonCode\\旋转.pdf", "wb") as out:
pdf_writer.write(out)
"""
上述代码中,我们循环遍历了这个 pdf,对于偶数页我们逆时针旋转 90°,对于奇数页我
们顺时针旋转 90°; 注意:旋转的角度只能是 90 的倍数;
"""
② 排序 pdf
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\merge.pdf")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()-1, -1, -1):
pdf_writer.addPage(pdf_reader.getPage(page))
with open("D:\\PythonCode\\倒序.pdf", "wb") as out:
pdf_writer.write(out)
4. pdf 批量加水印及加密、解密
4.1 批量加水印
from PyPDF2 import PdfFileReader, PdfFileWriter
from copy import copy
water = PdfFileReader(r"D:\PythonCode\水印.pdf")
water_page = water.getPage(0)
pdf_reader = PdfFileReader(r"D:\PythonCode\aa.pdf")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
my_page = pdf_reader.getPage(page)
new_page = copy(water_page)
new_page.mergePage(my_page)
pdf_writer.addPage(new_page)
with open("D:\\PythonCode\\添加水印后的 aa.pdf", "wb") as out: pdf_writer.write(out)
"""
这里有一点需要注意:进行 pdf 合并的时候,我们希望“水印”在下面,文字在上面,因
此 是“水印”.mergePage(“图片页”)
"""
4.2 批量加密、解密
① 加密 pdf
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\test.pdf")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
# 添加密码
pdf_writer.encrypt("hy123456")
with open("D:\\PythonCode\\test.pdf", "wb") as out:
pdf_writer.write(out)
② 解密 pdf 并保存为未加密的 pdf
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\test.pdf")
pdf_reader.decrypt("hy123456")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
with open("D:\\PythonCode\\未加密.pdf", "wb") as out:pdf_writer.write(out)