Python案例如何操作PDF文件?

wen python案例 6

本文目录导读:

Python案例如何操作PDF文件?

  1. 常用Python PDF库
  2. 读取PDF内容
  3. 创建新PDF
  4. 合并和拆分PDF
  5. PDF加密和解密
  6. 高级操作示例
  7. 实用工具函数
  8. 完整示例程序
  9. 注意事项

我来系统地介绍Python操作PDF文件的常见方法,包括读取、写入、编辑和处理等操作。

常用Python PDF库

# 安装常用库
# pip install PyPDF2    # 读取、拆分、合并PDF
# pip install pdfplumber  # 提取文本和表格
# pip install reportlab    # 创建新PDF
# pip install pdfminer.six  # 高级文本提取
# pip install pdf2image     # PDF转图片

读取PDF内容

# 方法1:使用PyPDF2读取
import PyPDF2
def read_pdf_pypdf2(file_path):
    """读取PDF文本内容"""
    with open(file_path, 'rb') as file:
        pdf_reader = PyPDF2.PdfReader(file)
        text = ""
        for page_num in range(len(pdf_reader.pages)):
            page = pdf_reader.pages[page_num]
            text += page.extract_text() + "\n"
        return text
# 方法2:使用pdfplumber(更准确)
import pdfplumber
def read_pdf_plumber(file_path):
    """更准确地读取PDF内容"""
    text = ""
    with pdfplumber.open(file_path) as pdf:
        for page in pdf.pages:
            text += page.extract_text() + "\n"
    return text
# 方法3:提取表格数据
def extract_tables_from_pdf(file_path):
    """提取PDF中的表格"""
    tables = []
    with pdfplumber.open(file_path) as pdf:
        for page in pdf.pages:
            page_tables = page.extract_tables()
            tables.extend(page_tables)
    return tables

创建新PDF

from reportlab.lib.pagesizes import letter, A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table
def create_simple_pdf(output_path):
    """创建简单PDF文档"""
    # 创建文档
    doc = SimpleDocTemplate(output_path, pagesize=A4)
    # 创建样式
    styles = getSampleStyleSheet()
    # 构建内容
    story = []
    # 添加标题= Paragraph("PDF生成示例", styles['Title'])
    story.append(title)
    # 添加段落
    text = """
    这是一个使用Python生成的PDF文档示例。
    包含文本、图片和表格等多种元素。
    """
    paragraph = Paragraph(text, styles['Normal'])
    story.append(paragraph)
    # 添加表格
    data = [
        ['姓名', '年龄', '城市'],
        ['张三', '25', '北京'],
        ['李四', '30', '上海'],
        ['王五', '28', '广州']
    ]
    table = Table(data)
    story.append(table)
    # 构建PDF
    doc.build(story)
    print(f"PDF已创建: {output_path}")
# 创建带表格和图片的PDF
def create_complex_pdf(output_path, image_path=None):
    """创建复杂PDF"""
    doc = SimpleDocTemplate(output_path, pagesize=A4)
    styles = getSampleStyleSheet()
    story = []
    # 标题
    story.append(Paragraph("公司年度报告", styles['Title']))
    story.append(Spacer(1, 20))
    # 段落
    content = """
    本报告总结了公司过去一年的经营状况和发展成果。
    通过全体员工的共同努力,我们取得了显著的成绩。
    """
    story.append(Paragraph(content, styles['Normal']))
    story.append(Spacer(1, 15))
    # 添加图片
    if image_path:
        try:
            img = Image(image_path, width=400, height=300)
            story.append(img)
        except:
            print(f"无法加载图片: {image_path}")
    # 添加表格
    data = [
        ['部门', '业绩', '达成率'],
        ['销售部', '100万', '95%'],
        ['技术部', '完成8个项目', '100%'],
        ['市场部', '拓展50家客户', '90%']
    ]
    table = Table(data)
    story.append(Spacer(1, 20))
    story.append(table)
    doc.build(story)
# 使用示例
# create_simple_pdf("example.pdf")
# create_complex_pdf("report.pdf", "chart.png")

合并和拆分PDF

from PyPDF2 import PdfMerger, PdfWriter, PdfReader
def merge_pdfs(pdf_list, output_path):
    """合并多个PDF文件"""
    merger = PdfMerger()
    for pdf in pdf_list:
        merger.append(pdf)
    merger.write(output_path)
    merger.close()
    print(f"合并完成: {len(pdf_list)}个文件 → {output_path}")
def split_pdf(input_pdf, output_prefix):
    """拆分PDF为单页"""
    reader = PdfReader(input_pdf)
    for i, page in enumerate(reader.pages):
        writer = PdfWriter()
        writer.add_page(page)
        output_file = f"{output_prefix}_page_{i+1}.pdf"
        with open(output_file, 'wb') as output:
            writer.write(output)
    print(f"拆分完成: {len(reader.pages)}页")

PDF加密和解密

from PyPDF2 import PdfReader, PdfWriter
def encrypt_pdf(input_pdf, output_pdf, password):
    """加密PDF文件"""
    reader = PdfReader(input_pdf)
    writer = PdfWriter()
    # 复制所有页面
    for page in reader.pages:
        writer.add_page(page)
    # 设置密码
    writer.encrypt(password)
    # 保存加密文件
    with open(output_pdf, 'wb') as file:
        writer.write(file)
    print(f"PDF已加密: {output_pdf}")
def decrypt_pdf(input_pdf, output_pdf, password):
    """解密PDF文件"""
    reader = PdfReader(input_pdf)
    if reader.is_encrypted:
        reader.decrypt(password)
    writer = PdfWriter()
    for page in reader.pages:
        writer.add_page(page)
    with open(output_pdf, 'wb') as file:
        writer.write(file)
    print(f"PDF已解密: {output_pdf}")

高级操作示例

import io
from PyPDF2 import PdfWriter, PdfReader
from pdf2image import convert_from_path
def pdf_images_to_text(pdf_path):
    """将扫描版PDF转为文本(需要OCR)"""
    # 首先安装:pip install pdf2image pytesseract
    from PIL import Image
    import pytesseract
    # 转换为图片
    images = convert_from_path(pdf_path)
    text = ""
    for i, image in enumerate(images):
        # OCR识别
        page_text = pytesseract.image_to_string(image, lang='chi_sim')
        text += f"--- 第{i+1}页 ---\n{page_text}\n"
    return text
def extract_metadata(pdf_path):
    """提取PDF元数据"""
    reader = PdfReader(pdf_path)
    metadata = reader.metadata
    if metadata:
        print("PDF元数据:")
        for key, value in metadata.items():
            print(f"{key}: {value}")
def modify_pdf_pages(input_pdf, output_pdf):
    """修改PDF页面顺序和旋转"""
    reader = PdfReader(input_pdf)
    writer = PdfWriter()
    # 旋转第一页180度
    if len(reader.pages) > 0:
        page = reader.pages[0]
        page.rotate(180)
        writer.add_page(page)
        # 添加其他页面
        for page_num in range(1, len(reader.pages)):
            writer.add_page(reader.pages[page_num])
    # 重排页面顺序(倒序)
    # for page in reversed(reader.pages):
    #     writer.add_page(page)
    with open(output_pdf, 'wb') as file:
        writer.write(file)

实用工具函数

import os
class PDFTools:
    """PDF工具类"""
    @staticmethod
    def get_pdf_info(file_path):
        """获取PDF信息"""
        reader = PdfReader(file_path)
        info = {
            '页数': len(reader.pages),
            '文件大小': f"{os.path.getsize(file_path)/1024:.2f} KB",
            '是否加密': reader.is_encrypted,
            '元数据': reader.metadata
        }
        return info
    @staticmethod
    def convert_to_images(pdf_path, output_folder):
        """PDF转图片"""
        images = convert_from_path(pdf_path)
        for i, image in enumerate(images):
            image_path = os.path.join(output_folder, f"page_{i+1}.jpg")
            image.save(image_path, "JPEG")
        return len(images)
    @staticmethod
    def batch_process(folder_path, operation='info'):
        """批量处理PDF文件"""
        results = []
        for filename in os.listdir(folder_path):
            if filename.lower().endswith('.pdf'):
                file_path = os.path.join(folder_path, filename)
                if operation == 'info':
                    results.append(PDFTools.get_pdf_info(file_path))
                elif operation == 'count':
                    reader = PdfReader(file_path)
                    results.append({'file': filename, 'pages': len(reader.pages)})
        return results

完整示例程序

def main():
    """PDF操作演示程序"""
    print("=== PDF操作演示 ===\n")
    # 创建示例PDF
    print("1. 创建示例PDF...")
    sample_text = """
    Python PDF 操作手册
    第一章:基础操作
    Python提供了多种库来操作PDF文件,
    包括读取、创建、修改和转换等功能。
    主要功能清单:
    - 读取PDF内容
    - 创建新的PDF文档
    - 合并多个PDF
    - 拆分PDF为单页
    - 添加水印
    - 加密解密
    """
    # 实际使用时,创建PDF并执行各种操作
    create_simple_pdf("sample.pdf")
    print("2. 读取PDF内容...")
    content = read_pdf_plumber("sample.pdf")
    print(content)
    print("3. 获取PDF信息...")
    info = PDFTools.get_pdf_info("sample.pdf")
    for key, value in info.items():
        print(f"{key}: {value}")
if __name__ == "__main__":
    main()

注意事项

  1. 库的选择:根据需求选择合适的库
  2. 编码问题:中文PDF可能需要特殊处理
  3. 加密PDF:需要密码才能操作
  4. 性能考虑:大文件处理时注意内存使用
  5. 版本兼容:不同PDF版本可能支持功能不同

这些示例涵盖了Python操作PDF文件的主要场景,你可以根据具体需求选择合适的库和方法。

抱歉,评论功能暂时关闭!