docx
DOCX 创建、编辑和分析
概述
用户可能会要求你创建、编辑或分析 .docx 文件的内容。.docx 文件本质上是一个包含 XML 文件和其他资源的 ZIP 压缩包,你可以对其进行读取或编辑。针对不同的任务,你有不同的工具和工作流可用。
工作流决策树
读取/分析内容
使用下方的“文本提取”或“原始 XML 访问”部分
创建新文档
使用“创建新的 Word 文档”工作流
编辑现有文档
-
你自己的文档 + 简单修改 使用“基础 OOXML 编辑”工作流
-
他人的文档 使用 “修订(Redlining)工作流”(推荐默认)
-
法律、学术、商业或政府文档 使用 “修订(Redlining)工作流”(必须)
读取和分析内容
文本提取
如果你只需要读取文档的文本内容,应该使用 pandoc 将文档转换为 markdown。Pandoc 对保留文档结构提供了极佳的支持,并且可以显示修订内容:
# 将文档转换为带有修订的 markdown
pandoc --track-changes=all path-to-file.docx -o output.md
# 选项: --track-changes=accept/reject/all
原始 XML 访问
对于批注、复杂格式、文档结构、嵌入媒体和元数据,你需要访问原始 XML。对于任何这些功能,你需要解压文档并读取其原始 XML 内容。
解压文件
python ooxml/scripts/unpack.py <office_file> <output_directory>
关键文件结构
word/document.xml- 主文档内容word/comments.xml- document.xml 中引用的批注word/media/- 嵌入的图像和媒体文件- 修订使用
<w:ins>(插入)和<w:del>(删除)标签
创建新的 Word 文档
当从头开始创建新的 Word 文档时,请使用 docx-js,它允许你使用 JavaScript/TypeScript 创建 Word 文档。
工作流
- 强制性 - 阅读整个文件:从头到尾完整阅读
docx-js.md(约 500 行)。切勿在读取此文件时设置任何范围限制。 在进行文档创建之前,请阅读完整的文件内容以获取详细的语法、关键格式规则和最佳实践。 - 使用 Document、Paragraph、TextRun 组件创建一个 JavaScript/TypeScript 文件(你可以假设所有依赖项都已安装,如果没有,请参阅下面的依赖项部分)
- 使用 Packer.toBuffer() 导出为 .docx
编辑现有 Word 文档
编辑现有 Word 文档时,请使用 Document library(一个用于 OOXML 操作的 Python 库)。该库自动处理基础设施设置并提供文档操作方法。对于复杂场景,你可以通过该库直接访问底层 DOM。
工作流
- 强制性 - 阅读整个文件:从头到尾完整阅读
ooxml.md(约 600 行)。切勿在读取此文件时设置任何范围限制。 阅读完整文件内容以获取 Document 库 API 和直接编辑文档文件的 XML 模式。 - 解压文档:
python ooxml/scripts/unpack.py <office_file> <output_directory> - 创建并运行使用 Document 库的 Python 脚本(参见 https://www.google.com/search?q=ooxml.md 中的“Document Library”部分)
- 打包最终文档:
python ooxml/scripts/pack.py <input_directory> <office_file>
Document 库既提供了用于常见操作的高级方法,也提供了用于复杂场景的直接 DOM 访问。
用于文档审查的修订(Redlining)工作流
此工作流允许你在 OOXML 中实施之前,先使用 markdown 规划全面的修订。关键:为了实现完整的修订,你必须系统地实施所有更改。
分批策略:将相关更改分成 3-10 个一组。这使得调试更易于管理,同时保持效率。在进入下一批次之前测试每一批次。
原则:最小化、精确编辑
实施修订时,只标记实际更改的文本。重复未更改的文本会使编辑难以审查,并且显得不专业。将替换分解为:[未更改文本] + [删除] + [插入] + [未更改文本]。通过从原始文件中提取 <w:r> 元素并重用它,来保留未更改文本的原始运行 RSID。
示例 - 将句子中的 "30 days" 更改为 "60 days":
# 错误 - 替换整句
'<w:del><w:r><w:delText>The term is 30 days.</w:delText></w:r></w:del><w:ins><w:r><w:t>The term is 60 days.</w:t></w:r></w:ins>'
# 正确 - 仅标记更改的部分,保留未更改文本的原始 <w:r>
'<w:r w:rsidR="00AB12CD"><w:t>The term is </w:t></w:r><w:del><w:r><w:delText>30</w:delText></w:r></w:del><w:ins><w:r><w:t>60</w:t></w:r></w:ins><w:r w:rsidR="00AB12CD"><w:t> days.</w:t></w:r>'
修订工作流步骤
-
获取 markdown 表示:将文档转换为 markdown 并保留修订:
pandoc --track-changes=all path-to-file.docx -o current.md -
识别并分组更改:审查文档并识别所有需要的更改,将其组织成逻辑批次:
定位方法(用于在 XML 中查找更改):
- 章节/标题编号(例如 "Section 3.2", "Article IV")
- 段落标识符(如果有编号)
- 具有唯一周围文本的 Grep 模式
- 文档结构(例如“第一段”,“签名块”)
- 切勿使用 markdown 行号 —— 它们无法映射到 XML 结构
批次组织(每批次分组 3-10 个相关更改):
- 按章节:"批次 1: 第 2 节修订", "批次 2: 第 5 节更新"
- 按类型:"批次 1: 日期更正", "批次 2: 当事人名称更改"
- 按复杂性:从简单的文本替换开始,然后处理复杂的结构更改
- 按顺序:"批次 1: 第 1-3 页", "批次 2: 第 4-6 页"
-
阅读文档并解压:
- 强制性 - 阅读整个文件:从头到尾完整阅读
ooxml.md(约 600 行)。切勿在读取此文件时设置任何范围限制。 特别注意“Document Library”和“Tracked Change Patterns(修订模式)”部分。 - 解压文档:
python ooxml/scripts/unpack.py <file.docx> <dir> - 记下建议的 RSID:解压脚本将建议一个用于修订的 RSID。复制此 RSID 以在步骤 4b 中使用。
- 强制性 - 阅读整个文件:从头到尾完整阅读
-
分批实施更改:逻辑地分组更改(按章节、按类型或按位置)并在单个脚本中一起实施。这种方法:
- 使调试更容易(较小的批次 = 更容易隔离错误)
- 允许增量进展
- 保持效率(3-10 个更改的批次大小效果很好)
建议的批次分组:
- 按文档章节(例如“第 3 节更改”,“定义”,“终止条款”)
- 按更改类型(例如“日期更改”,“当事人名称更新”,“法律术语替换”)
- 按位置(例如“第 1-3 页的更改”,“文档前半部分的更改”)
对于每一批相关的更改:
a. 映射文本到 XML:在
word/document.xml中 grep 文本,以验证文本如何在<w:r>元素之间分割。b. 创建并运行脚本:使用
get_node查找节点,实施更改,然后doc.save()。参见 https://www.google.com/search?q=ooxml.md 中的 “Document Library” 部分获取模式。注意:务必在编写脚本之前立即 grep
word/document.xml以获取当前行号并验证文本内容。行号在每次运行脚本后都会改变。 -
打包文档:所有批次完成后,将解压后的目录转换回 .docx:
python ooxml/scripts/pack.py unpacked reviewed-document.docx -
最终验证:对完整文档进行全面检查:
- 将最终文档转换为 markdown:
pandoc --track-changes=all reviewed-document.docx -o verification.md - 验证所有更改是否已正确应用:
grep "original phrase" verification.md # 应该找不到它 grep "replacement phrase" verification.md # 应该找到它 - 检查是否引入了非预期的更改
- 将最终文档转换为 markdown:
将文档转换为图像
为了直观地分析 Word 文档,请使用两步流程将其转换为图像:
-
将 DOCX 转换为 PDF:
soffice --headless --convert-to pdf document.docx -
将 PDF 页面转换为 JPEG 图像:
pdftoppm -jpeg -r 150 document.pdf page这将创建如
page-1.jpg,page-2.jpg等文件。
选项:
-r 150:将分辨率设置为 150 DPI(根据质量/大小平衡进行调整)-jpeg:输出 JPEG 格式(如果首选 PNG,请使用-png)-f N:要转换的第一页(例如,-f 2从第 2 页开始)-l N:要转换的最后一页(例如,-l 5在第 5 页停止)page:输出文件的前缀
特定范围的示例:
pdftoppm -jpeg -r 150 -f 2 -l 5 document.pdf page # 仅转换第 2-5 页
代码风格指南
重要:生成 DOCX 操作代码时:
- 编写简洁的代码
- 避免冗长的变量名和多余的操作
- 避免不必要的打印语句
依赖项
必需的依赖项(如果不可用,请安装):
- pandoc:
sudo apt-get install pandoc(用于文本提取) - docx:
npm install -g docx(用于创建新文档) - LibreOffice:
sudo apt-get install libreoffice(用于 PDF 转换) - Poppler:
sudo apt-get install poppler-utils(用于 pdftoppm 将 PDF 转换为图像) - defusedxml:
pip install defusedxml(用于安全的 XML 解析)
More from m4n5ter/skills
ipynb-notebooks
面向 .ipynb Notebook(Jupyter / JupyterLab / Google Colab / VS Code)的创建、审阅、重构与展示。涵盖工程化目录结构、token 高效处理、演示/分享模式、以及 uv/venv 可复现工作流。
16jj-vcs
面向 Jujutsu(jj) 版本控制的使用、工作流、revset/fileset 语法、Git 互操作与配置排错指导。用于解答 jj 命令与概念差异、迁移 Git 流程到 jj、处理冲突/回滚、配置与远程书签相关问题。
1xlsx
全面的电子表格创建、编辑和分析,支持公式、格式设置、数据分析和可视化。当需要处理电子表格(.xlsx, .xlsm, .csv, .tsv 等)以进行以下操作时使用:(1) 创建带有公式和格式的新电子表格,(2) 读取或分析数据,(3) 在保留公式的同时修改现有电子表格,(4) 电子表格中的数据分析和可视化,或 (5) 重新计算公式
1agent-browser
Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with web pages, fill forms, take screenshots, test web applications, or extract information from web pages.
1training-data-curation
Guidelines for creating high-quality datasets for LLM post-training (SFT/DPO/RLHF). Use when preparing data for fine-tuning, evaluating data quality, or designing data collection strategies.
1tinker-training-cost
Calculate training costs for Tinker fine-tuning jobs. Use when estimating costs for Tinker LLM training, counting tokens in datasets, or comparing Tinker model training prices. Tokenizes datasets using the correct model tokenizer and provides accurate cost estimates.
1