在 Python 中,处理 PDF 文件可以使用以下库:
PyPDF2
:支持 PDF 的读取、合并、拆分和加解密,但对 PDF 的编辑和写入支持有限。PyMuPDF (fitz)
:支持读取、写入、编辑 PDF,功能强大。pdfplumber
:专注于从 PDF 提取结构化数据(如表格)。reportlab
:用于生成 PDF 文件。pdfminer.six
:适合从 PDF 中提取文本内容。
以下是使用这些库处理 PDF 文件的教程。
1. 安装必要的库
安装常用的 PDF 库:
pip install PyPDF2 pymupdf pdfplumber reportlab pdfminer.six
2. 使用 PyPDF2
处理 PDF 文件
读取 PDF 文件
from PyPDF2 import PdfReader
# 打开 PDF 文件
reader = PdfReader("example.pdf")
# 获取总页数
print(f"总页数: {len(reader.pages)}")
# 读取某一页的内容
page = reader.pages[0] # 第一页
print(page.extract_text())
写入(合并/拆分)PDF 文件
from PyPDF2 import PdfWriter
# 创建一个 PDF Writer
writer = PdfWriter()
# 添加页面
writer.add_page(reader.pages[0])
# 保存到新文件
with open("output.pdf", "wb") as f:
writer.write(f)
3. 使用 PyMuPDF (fitz)
处理 PDF
读取 PDF 文件
PyMuPDF
支持高效读取 PDF,并支持访问图像和表格。
import fitz # PyMuPDF
# 打开 PDF 文件
doc = fitz.open("example.pdf")
# 获取总页数
print(f"总页数: {doc.page_count}")
# 读取某一页的内容
page = doc[0] # 第一页
print(page.get_text())
从 PDF 提取图像
# 提取 PDF 中的图像
for page_num in range(len(doc)):
page = doc[page_num]
images = page.get_images(full=True)
for img_index, img in enumerate(images):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
image_ext = base_image["ext"]
with open(f"page{page_num+1}_img{img_index+1}.{image_ext}", "wb") as img_file:
img_file.write(image_bytes)
创建和编辑 PDF
# 创建 PDF
doc = fitz.open()
page = doc.new_page()
page.insert_text((72, 72), "Hello, PDF!", fontsize=20)
doc.save("new_file.pdf")
4. 使用 pdfplumber
提取表格和文本
提取结构化数据
import pdfplumber
# 打开 PDF 文件
with pdfplumber.open("example.pdf") as pdf:
for page in pdf.pages:
# 提取文本
print(page.extract_text())
# 提取表格
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
5. 使用 reportlab
生成 PDF
生成简单 PDF 文件
from reportlab.pdfgen import canvas
# 创建 PDF 文件
c = canvas.Canvas("generated.pdf")
# 添加内容
c.drawString(100, 750, "Hello, PDF!")
c.drawString(100, 720, "这是一个用 ReportLab 生成的 PDF。")
# 保存 PDF 文件
c.save()
生成包含图表的 PDF
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors
# 创建 PDF 文件
doc = SimpleDocTemplate("table_example.pdf", pagesize=letter)
# 创建表格
data = [
["Name", "Age", "City"],
["Alice", "30", "New York"],
["Bob", "25", "San Francisco"],
["Charlie", "35", "Boston"],
]
table = Table(data)
table.setStyle(
TableStyle(
[
("BACKGROUND", (0, 0), (-1, 0), colors.grey),
("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("BOTTOMPADDING", (0, 0), (-1, 0), 12),
("GRID", (0, 0), (-1, -1), 1, colors.black),
]
)
)
# 写入 PDF
doc.build([table])
6. 使用 pdfminer.six
提取文本
pdfminer.six
是一个强大的库,支持复杂 PDF 文件的文本提取。
提取文本
from pdfminer.high_level import extract_text
# 提取 PDF 的文本
text = extract_text("example.pdf")
print(text)
7. 小结
PyPDF2
:用于基本的 PDF 操作(读取、拆分、合并)。PyMuPDF (fitz)
:功能全面,支持提取文本、图像,甚至编辑 PDF。pdfplumber
:专注于结构化数据的提取(如表格)。reportlab
:生成 PDF 文件的最佳选择。pdfminer.six
:适合复杂文本提取。