目录

前言

一、环境准备与基础操作

1. 安装必要库

2. 读取PDF基本信息

二、PDF文件处理

1. PDF拆分与合并

2. PDF加密与解密

三、PDF内容提取

1. 提取文本内容

2. 提取表格数据

3. 提取图片

四、PDF与Word互转

1. PDF转Word

2. Word转PDF

五、PDF批量处理

1. 批量重命名PDF文件

2. 批量添加水印

六、综合案例:自动化PDF报告生成

七、实践建议

1. 文件管理

2.性能优化

3.安全考虑

八、下期预告


前言

PDF文档因其跨平台、格式固定的特性,在办公场景中广泛应用。然而,PDF的处理往往比普通文档更加复杂。本篇将深入讲解如何使用Python实现PDF文档的自动化处理。

一、环境准备与基础操作

1. 安装必要库

pip install PyPDF2 pdfminer.six pdf2image

2. 读取PDF基本信息

import PyPDF2

def get_pdf_info(pdf_path):
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfFileReader(file)
        info = {
            '页数': reader.getNumPages(),
            '作者': reader.getDocumentInfo().author,
            '标题': reader.getDocumentInfo().title,
            '创建时间': reader.getDocumentInfo().creationDate
        }
        return info

# 使用示例
pdf_info = get_pdf_info('示例文档.pdf')
print(pdf_info)

二、PDF文件处理

1. PDF拆分与合并

def split_pdf(pdf_path, output_folder):
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfFileReader(file)
        for i in range(reader.getNumPages()):
            writer = PyPDF2.PdfFileWriter()
            writer.addPage(reader.getPage(i))
            output_path = f"{output_folder}/page_{i+1}.pdf"
            with open(output_path, 'wb') as output_file:
                writer.write(output_file)

def merge_pdfs(pdf_list, output_path):
    merger = PyPDF2.PdfFileMerger()
    for pdf in pdf_list:
        merger.append(pdf)
    merger.write(output_path)
    merger.close()

# 使用示例
split_pdf('示例文档.pdf', 'output_pages')
merge_pdfs(['file1.pdf', 'file2.pdf'], '合并文档.pdf')

2. PDF加密与解密

def encrypt_pdf(input_path, output_path, password):
    with open(input_path, 'rb') as file:
        reader = PyPDF2.PdfFileReader(file)
        writer = PyPDF2.PdfFileWriter()
        
        for i in range(reader.getNumPages()):
            writer.addPage(reader.getPage(i))
        
        writer.encrypt(password)
        with open(output_path, 'wb') as output_file:
            writer.write(output_file)

def decrypt_pdf(input_path, output_path, password):
    with open(input_path, 'rb') as file:
        reader = PyPDF2.PdfFileReader(file)
        if reader.isEncrypted:
            reader.decrypt(password)
        
        writer = PyPDF2.PdfFileWriter()
        for i in range(reader.getNumPages()):
            writer.addPage(reader.getPage(i))
        
        with open(output_path, 'wb') as output_file:
            writer.write(output_file)

# 使用示例
encrypt_pdf('示例文档.pdf', '加密文档.pdf', 'mypassword')
decrypt_pdf('加密文档.pdf', '解密文档.pdf', 'mypassword')

三、PDF内容提取

1. 提取文本内容

from pdfminer.high_level import extract_text

def extract_pdf_text(pdf_path):
    text = extract_text(pdf_path)
    return text

# 使用示例
text = extract_pdf_text('示例文档.pdf')
print(text[:500])  # 打印前500个字符

2. 提取表格数据

import pdfplumber

def extract_tables(pdf_path):
    tables = []
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            tables.extend(page.extract_tables())
    return tables

# 使用示例
tables = extract_tables('示例文档.pdf')
for i, table in enumerate(tables):
    print(f"表格{i+1}:")
    for row in table:
        print(row)

3. 提取图片

from pdf2image import convert_from_path

def extract_images(pdf_path, output_folder):
    images = convert_from_path(pdf_path)
    for i, image in enumerate(images):
        image.save(f"{output_folder}/page_{i+1}.png", 'PNG')

# 使用示例
extract_images('示例文档.pdf', 'output_images')

四、PDF与Word互转

1. PDF转Word

from pdf2docx import Converter

def pdf_to_word(pdf_path, docx_path):
    cv = Converter(pdf_path)
    cv.convert(docx_path, start=0, end=None)
    cv.close()

# 使用示例
pdf_to_word('示例文档.pdf', '转换文档.docx')

2. Word转PDF

from docx2pdf import convert

def word_to_pdf(docx_path, pdf_path):
    convert(docx_path, pdf_path)

# 使用示例
word_to_pdf('示例文档.docx', '转换文档.pdf')

五、PDF批量处理

1. 批量重命名PDF文件

import os

def batch_rename_pdf(folder_path, prefix):
    for i, filename in enumerate(os.listdir(folder_path)):
        if filename.endswith('.pdf'):
            new_name = f"{prefix}_{i+1}.pdf"
            os.rename(
                os.path.join(folder_path, filename),
                os.path.join(folder_path, new_name)
            )

# 使用示例
batch_rename_pdf('pdf_folder', '合同')

2. 批量添加水印

from PyPDF2 import PdfFileReader, PdfFileWriter

def add_watermark(input_pdf, output_pdf, watermark_pdf):
    watermark = PdfFileReader(watermark_pdf)
    watermark_page = watermark.getPage(0)
    
    reader = PdfFileReader(input_pdf)
    writer = PdfFileWriter()
    
    for i in range(reader.getNumPages()):
        page = reader.getPage(i)
        page.mergePage(watermark_page)
        writer.addPage(page)
    
    with open(output_pdf, 'wb') as output_file:
        writer.write(output_file)

def batch_add_watermark(folder_path, watermark_pdf):
    for filename in os.listdir(folder_path):
        if filename.endswith('.pdf'):
            input_path = os.path.join(folder_path, filename)
            output_path = os.path.join(folder_path, f"watermarked_{filename}")
            add_watermark(input_path, output_path, watermark_pdf)

# 使用示例
batch_add_watermark('pdf_folder', '水印模板.pdf')

六、综合案例:自动化PDF报告生成

def generate_pdf_report(data, template_path, output_path):
    # 创建Word文档
    doc = Document(template_path)
    
    # 填充数据
    replacements = {
        '{标题}': data['标题'],
        '{日期}': data['日期'],
        '{作者}': data['作者'],
        '{内容}': data['内容']
    }
    
    for para in doc.paragraphs:
        for run in para.runs:
            for old_text, new_text in replacements.items():
                if old_text in run.text:
                    run.text = run.text.replace(old_text, new_text)
    
    # 保存为临时Word文件
    temp_docx = 'temp_report.docx'
    doc.save(temp_docx)
    
    # 转换为PDF
    word_to_pdf(temp_docx, output_path)
    
    # 清理临时文件
    os.remove(temp_docx)

# 使用示例
report_data = {
    '标题': '2023年第三季度报告',
    '日期': '2023-09-30',
    '作者': '数据分析部',
    '内容': '本季度销售额同比增长15%,主要得益于...'
}

generate_pdf_report(report_data, '报告模板.docx', '季度报告.pdf')

七、实践建议

1. 文件管理

  • 建立标准文件命名规范

  • 使用版本控制管理重要文档

  • 定期备份处理结果

2.性能优化

  • 批量处理时使用多线程

  • 缓存常用模板和水印文件

  • 优化PDF处理顺序减少IO操作

3.安全考虑

  • 处理敏感PDF时使用加密

  • 验证输入文件格式

  • 设置合理的文件权限

八、下期预告

在下一篇文章中,我们将深入讲解邮件自动化实战,包括:

  • 使用smtplib发送邮件

  • 自动添加附件

  • 定时发送报告

  • 邮件内容模板化

记住:

  • 从简单的PDF处理任务开始

  • 逐步建立自己的PDF处理工具库

  • 将常用功能封装成可复用模块

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐