1. 安装库
pip install PyPDF2
pip install pdfplumber
2. 拆分PDF
- 将一个PDF拆分成几个PDF
from PyPDF2 import PdfFileReader, PdfFileWriter
def split_pdf(filename, filepath, save_dirpath, step):
#step: 每step页一拆分
if not os.path.exists(save_dirpath):
os.mkdir(save_dirpath)
pdf_reader = PdfFileReader(filepath)
# 读取每一页的数据
pages = pdf_reader.getNumPages()
for page in range(0, pages, step):
pdf_writer = PdfFileWriter()
# 拆分pdf,每 step 页的拆分为一个文件
for index in range(page, page+step):
if index < pages:
pdf_writer.addPage(pdf_reader.getPage(index))
# 保存拆分后的小文件
save_path = os.path.join(save_dirpath, filename+str(int(page/step)+1)+'.pdf')
print(save_path)
with open(save_path, "wb") as out:
pdf_writer.write(out)
print("文件已成功拆分,保存路径为:"+save_dirpath)
split_pdf('test',r'C:\Users\Sandra\Desktop\test.pdf', r'C:\Users\Sandra\Desktop', step=5)
# C:\Users\Sandra\Desktop\test1.pdf
# C:\Users\Sandra\Desktop\test2.pdf
# C:\Users\Sandra\Desktop\test3.pdf
# 文件已成功拆分,保存路径为:C:\Users\Sandra\Desktop
// 可太方便了,再也不用花钱拆分PDF了
3. 合并PDF
- 将几个PDF合并成一个
def concat_pdf(filename, read_dirpath, save_filepath):
pdf_writer = PdfFileWriter()
# 对文件名进行排序
list_filename = os.listdir(read_dirpath)
list_filename.sort(key=lambda x: int(x[:-4].replace(filename, "")))
# 这个是把后面.pdf去掉然后排序
for filename in list_filename:
print(filename)
filepath = os.path.join(read_dirpath, filename)
# 读取文件并获取文件的页数
pdf_reader = PdfFileReader(filepath)
pages = pdf_reader.getNumPages()
# 逐页添加
for page in range(pages):
pdf_writer.addPage(pdf_reader.getPage(page))
# 保存合并后的文件
with open(save_filepath, "wb") as out:
pdf_writer.write(out)
print("文件已成功合并,保存路径为:"+save_filepath)
concat_pdf('test', r'C:\Users\Sandra\Desktop\files', r'C:\Users\Sandra\Desktop\all.pdf')
# 我files里有test1、test2、test3仨pdf,最后另存为名字叫all的
4. 提取文字
- 提取第n页的文字
import pdfplumber
def extract_text_info(filepath,n):
with pdfplumber.open(filepath) as pdf:
page = pdf.pages[n]
print(page.extract_text())
extract_text_info(r'C:\Users\Sandra\Desktop\test.pdf',0)
# 第一页
- 提取所有页的文字
def extract_text_info(filepath):
with pdfplumber.open(filepath) as pdf:
for page in pdf.pages
print(page.extract_text())
5. 提取图片
import fitz
import re
filepath = r'C:\Users\Sandra\Desktop\test.pdf'
pic_dirpath = r'C:\Users\Sandra\Desktop'
if not os.path.exists(pic_dirpath):
os.makedirs(pic_dirpath)
# 使用正则表达式来查找图片
check_XObject = r"/Type(?= */XObject)"
check_Image = r"/Subtype(?= */Image)"
img_count = 0
"""1. 打开pdf,打印相关信息"""
pdf_info = fitz.open(filepath)
# 1.16.8版本用法 xref_len = doc._getXrefLength()
# 最新版本写法
xref_len = pdf_info.xref_length()
# 打印PDF的信息
print("文件名:{}, 页数: {}, 对象: {}".format(filepath, len(pdf_info), xref_len-1))
"""2. 遍历PDF中的对象,遇到是图像才进行下一步,不然就continue"""
for index in range(1, xref_len):
# 1.16.8版本用法 text = doc._getXrefString(index)
# 最新版本
text = pdf_info.xref_object(index)
is_XObject = re.search(check_XObject, text)
is_Image = re.search(check_Image, text)
# 如果不是对象也不是图片,则不操作
if is_XObject or is_Image:
img_count += 1
# 根据索引生成图像
pix = fitz.Pixmap(pdf_info, index)
pic_filepath = os.path.join(pic_dirpath, 'img_' + str(img_count) + '.png')
"""pix.size 可以反映像素多少,简单的色素块该值较低,可以通过设置一个阈值过滤。以阈值 10000 为例过滤"""
# if pix.size < 10000:
# continue
"""三、 将图像存为png格式"""
if pix.n >= 5:
# 先转换CMYK
pix = fitz.Pixmap(fitz.csRGB, pix)
# 存为PNG
pix.writePNG(pic_filepath)
6. 文档加密和解密
- 加密
filepath = r'C:\Users\Sandra\Desktop\test.pdf'
save_filepath = r'C:\Users\Sandra\Desktop\testmi.pdf'
pdf_reader = PdfFileReader(filepath)
pdf_writer = PdfFileWriter()
for page_index in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page_index))
# 添加密码123456
pdf_writer.encrypt('123456')
with open(save_filepath, "wb") as out:
pdf_writer.write(out)
- 解密
filepath = r'C:\Users\Sandra\Desktop\jiami.pdf'
save_filepath = r'C:\Users\Sandra\Desktop\jiemi.pdf'
pdf_reader = PdfFileReader(filepath)
pdf_reader.decrypt('123456')
pdf_writer = PdfFileWriter()
for page_index in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page_index))
with open(save_filepath, "wb") as out:
pdf_writer.write(out)