name: pdf description: 处理 PDF 文件 - 提取文本、创建 PDF、合并文档。在用户要求读取 PDF、创建 PDF 或处理 PDF 文件时使用。
PDF 处理技能
你现在拥有 PDF 操作的专业知识。遵循以下工作流程:
读取 PDF
选项 1:快速文本提取(推荐)
# 使用 pdftotext(poppler-utils)
pdftotext input.pdf - # 输出到标准输出
pdftotext input.pdf output.txt # 输出到文件
# 如果没有 pdftotext,尝试:
python3 -c "
import fitz # PyMuPDF
doc = fitz.open('input.pdf')
for page in doc:
print(page.get_text())
"
选项 2:带元数据的逐页提取
import fitz # pip install pymupdf
doc = fitz.open("input.pdf")
print(f"页数:{len(doc)}")
print(f"元数据:{doc.metadata}")
for i, page in enumerate(doc):
text = page.get_text()
print(f"--- 第 {i+1} 页 ---")
print(text)
创建 PDF
选项 1:从 Markdown 创建(推荐)
# 使用 pandoc
pandoc input.md -o output.pdf
# 使用自定义样式
pandoc input.md -o output.pdf --pdf-engine=xelatex -V geometry:margin=1in
选项 2:以编程方式
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("output.pdf", pagesize=letter)
c.drawString(100, 750, "你好,PDF!")
c.save()
选项 3:从 HTML 创建
# 使用 wkhtmltopdf
wkhtmltopdf input.html output.pdf
# 或者使用 Python
python3 -c "
import pdfkit
pdfkit.from_file('input.html', 'output.pdf')
"
合并 PDF
import fitz
result = fitz.open()
for pdf_path in ["file1.pdf", "file2.pdf", "file3.pdf"]:
doc = fitz.open(pdf_path)
result.insert_pdf(doc)
result.save("merged.pdf")
分割 PDF
import fitz
doc = fitz.open("input.pdf")
for i in range(len(doc)):
single = fitz.open()
single.insert_pdf(doc, from_page=i, to_page=i)
single.save(f"page_{i+1}.pdf")
关键库
| 任务 | 库 | 安装 |
|---|---|---|
| 读取/写入/合并 | PyMuPDF | pip install pymupdf |
| 从头创建 | ReportLab | pip install reportlab |
| HTML 转 PDF | pdfkit | pip install pdfkit + wkhtmltopdf |
| 文本提取 | pdftotext | brew install poppler / apt install poppler-utils |
最佳实践
- 始终检查工具是否已安装然后再使用它们
- 处理编码问题 - PDF 可能包含各种字符编码
- 大型 PDF:逐页处理以避免内存问题
- 扫描的 PDF 的 OCR:如果文本提取返回空,请使用
pytesseract