文档处理技能(Document Skills)
本技能提供全面的文档处理能力,涵盖三种主要的 Office 文档格式:DOCX(Word 文档)、PDF 和 PPTX(PowerPoint 演示文稿)。支持创建、编辑、分析、格式转换等操作。
二、PDF 处理指南
概述
涵盖使用 Python 库和命令行工具进行的基本 PDF 处理操作。如需填写 PDF 表单,请阅读 forms.md 并按其说明操作。
快速开始
from pypdf import PdfReader, PdfWriter
# 读取 PDF
reader = PdfReader("document.pdf")
print(f"页数:{len(reader.pages)}")
# 提取文本
text = ""
for page in reader.pages:
text += page.extract_text()
Python 库
pypdf - 基本操作
合并 PDF:
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
reader = PdfReader(pdf_file)
for page in reader.pages:
writer.add_page(page)
with open("merged.pdf", "wb") as output:
writer.write(output)
拆分 PDF:
reader = PdfReader("input.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
with open(f"page_{i+1}.pdf", "wb") as output:
writer.write(output)
提取元数据:
reader = PdfReader("document.pdf")
meta = reader.metadata
print(f"标题:{meta.title}")
print(f"作者:{meta.author}")
旋转页面:
reader = PdfReader("input.pdf")
writer = PdfWriter()
page = reader.pages[0]
page.rotate(90) # 顺时针旋转 90 度
writer.add_page(page)
with open("rotated.pdf", "wb") as output:
writer.write(output)
pdfplumber - 文本和表格提取
提取带布局的文本:
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
提取表格:
with pdfplumber.open("document.pdf") as pdf:
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for j, table in enumerate(tables):
print(f"第 {i+1} 页的表格 {j+1}:")
for row in table:
print(row)
高级表格提取(导出到 Excel):
import pandas as pd
with pdfplumber.open("document.pdf") as pdf:
all_tables = []
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
if table: # 检查表格是否非空
df = pd.DataFrame(table[1:], columns=table[0])
all_tables.append(df)
# 合并所有表格
if all_tables:
combined_df = pd.concat(all_tables, ignore_index=True)
combined_df.to_excel("extracted_tables.xlsx", index=False)
reportlab - 创建 PDF
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello.pdf", pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Hello World!")
c.save()
命令行工具
# pdftotext(poppler-utils)- 提取文本
pdftotext input.pdf output.txt
pdftotext -layout input.pdf output.txt # 保留布局
# qpdf - 合并 PDF
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
# qpdf - 拆分页面
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
# qpdf - 旋转页面
qpdf input.pdf output.pdf --rotate=+90:1
常见任务
扫描 PDF 的 OCR(光学字符识别):
# 需要:pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path
images = convert_from_path('scanned.pdf')
text = ""
for i, image in enumerate(images):
text += f"第 {i+1} 页:\n"
text += pytesseract.image_to_string(image)
text += "\n\n"
添加水印:
from pypdf import PdfReader, PdfWriter
watermark = PdfReader("watermark.pdf").pages[0]
reader = PdfReader("document.pdf")
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark)
writer.add_page(page)
with open("watermarked.pdf", "wb") as output:
writer.write(output)
密码保护:
from pypdf import PdfReader, PdfWriter
reader = PdfReader("input.pdf")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt("userpassword", "ownerpassword")
with open("encrypted.pdf", "wb") as output:
writer.write(output)
快速参考
| 任务 | 最佳工具 | 命令/代码 |
|---|---|---|
| 合并 PDF | pypdf | writer.add_page(page) |
| 拆分 PDF | pypdf | 每页一个文件 |
| 提取文本 | pdfplumber | page.extract_text() |
| 提取表格 | pdfplumber | page.extract_tables() |
| 创建 PDF | reportlab | Canvas 或 Platypus |
| 命令行合并 | qpdf | qpdf --empty --pages ... |
| OCR 扫描 PDF | pytesseract | 先转换为图片 |
| 填写 PDF 表单 | pdf-lib 或 pypdf | 见 forms.md |
三、PPTX 创建、编辑与分析
概述
用户可能要求你创建、编辑或分析 .pptx 文件的内容。.pptx 文件本质上也是一个包含 XML 文件和其他资源的 ZIP 归档。
读取和分析内容
文本提取:
# 使用 markitdown 将演示文稿转换为 Markdown
python -m markitdown path-to-file.pptx
原始 XML 访问 —— 关键文件结构:
ppt/presentation.xml- 主演示文稿元数据和幻灯片引用ppt/slides/slide{N}.xml- 各幻灯片内容ppt/notesSlides/notesSlide{N}.xml- 各幻灯片的演讲备注ppt/comments/- 幻灯片批注ppt/slideLayouts/- 布局模板ppt/slideMasters/- 母版幻灯片模板ppt/theme/- 主题和样式信息ppt/media/- 图片和其他媒体文件
创建新演示文稿(无模板)
使用 html2pptx 工作流,将 HTML 幻灯片转换为 PowerPoint 并精确定位。
设计原则
关键要求:
- 在编写代码前说明内容驱动的设计方法
- 仅使用网页安全字体:Arial、Helvetica、Times New Roman、Georgia、Courier New、Verdana、Tahoma、Trebuchet MS、Impact
- 通过大小、粗细和颜色创建清晰的视觉层次
- 确保可读性:强对比度、适当的文字大小、整洁的对齐
- 保持一致性:在幻灯片间重复模式、间距和视觉语言
配色方案选择
创意选择颜色时的考虑维度:
- 主题、行业、情绪、能量水平、目标受众、品牌识别
- 构建调色板:选择 3-5 个协调的颜色(主色 + 辅助色 + 强调色)
- 确保对比度:文字在背景上必须清晰可读
示例配色方案:
- 经典蓝:深海军蓝 (#1C2833)、石板灰 (#2E4053)、银色 (#AAB7B8)
- 青绿与珊瑚:青绿 (#5EA8A7)、珊瑚红 (#FE4447)
- 黑金:金色 (#BF9A4A)、黑色 (#000000)、奶油色 (#F4F6F6)
- 森林绿:黑色 (#191A19)、绿色 (#4E9F3D)、深绿 (#1E5128)
布局提示
- 双列布局(推荐):全宽标题,下方两列——文本在一列,图表/表格在另一列
- 全幻灯片布局:让主要内容占据整个幻灯片以获得最大影响力
- 绝不垂直堆叠:不要在单列中将图表/表格放在文本下方
工作流
- 阅读
html2pptx.md了解详细语法和规则 - 为每张幻灯片创建适当尺寸的 HTML 文件(如 16:9 为 720pt x 405pt)
- 使用
html2pptx()函数转换 HTML 幻灯片为 PowerPoint - 生成缩略图并检查布局问题
编辑现有演示文稿
工作流:
- 阅读
ooxml.md了解 OOXML 结构和编辑工作流 - 解包:
python ooxml/scripts/unpack.py <pptx文件> <输出目录> - 编辑 XML 文件
- 关键:每次编辑后立即验证:
python ooxml/scripts/validate.py <目录> --original <文件> - 打包:
python ooxml/scripts/pack.py <输入目录> <pptx文件>
基于模板创建演示文稿
工作流:
- 提取模板文本并创建缩略图网格进行分析
- 分析模板并保存清单到
template-inventory.md - 基于模板清单创建演示文稿大纲
- 使用
rearrange.py复制、重排和删除幻灯片 - 使用
inventory.py提取所有文本 - 生成替换文本并保存到 JSON
- 使用
replace.py应用替换
创建缩略图网格
python scripts/thumbnail.py template.pptx [输出前缀]
特性:
- 默认 5 列,每网格最多 30 张幻灯片(5x6)
- 可调列数:
--cols 4(范围:3-6) - 幻灯片从零索引开始
幻灯片转图片
# 步骤 1:PPTX 转 PDF
soffice --headless --convert-to pdf template.pptx
# 步骤 2:PDF 页面转 JPEG
pdftoppm -jpeg -r 150 template.pdf slide
依赖项
- markitdown:
pip install "markitdown[pptx]"(文本提取) - pptxgenjs:
npm install -g pptxgenjs(创建演示文稿) - playwright:
npm install -g playwright(HTML 渲染) - sharp:
npm install -g sharp(SVG 光栅化和图片处理) - LibreOffice:PDF 转换
- Poppler:PDF 转图片
- defusedxml:
pip install defusedxml(安全 XML 解析)
代码风格指南
重要:生成文档操作代码时:
- 编写简洁的代码
- 避免冗长的变量名和多余的操作
- 避免不必要的 print 语句