本文目录导读:

我来系统地介绍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()
注意事项
- 库的选择:根据需求选择合适的库
- 编码问题:中文PDF可能需要特殊处理
- 加密PDF:需要密码才能操作
- 性能考虑:大文件处理时注意内存使用
- 版本兼容:不同PDF版本可能支持功能不同
这些示例涵盖了Python操作PDF文件的主要场景,你可以根据具体需求选择合适的库和方法。