Python办公自动化 | Task 04 Python与PDF

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值