用途
DOCX 技能用于创建、编辑和分析 .docx 文件。.docx 本质上是一个 ZIP 归档,内部包含 XML 文件和其他资源,因此可以通过读取和编辑这些内容来处理文档。该技能针对不同任务提供了不同的工具和工作流。
主要能力
- 文本提取:使用 pandoc 将文档转换为 markdown,可保留文档结构并显示修订追踪。
- 原始 XML 访问:用于处理批注、复杂格式、文档结构、嵌入媒体和元数据。
- 创建新文档:使用 docx-js(JavaScript/TypeScript)从零创建 Word 文档。
- 编辑现有文档:使用 Document 库(Python 的 OOXML 操作库)进行文档修改,复杂场景可直接访问底层 DOM。
- 修订追踪(Redlining):在 OOXML 中实现完整的修订标记,支持插入和删除。
- 文档转图像:通过 LibreOffice 和 Poppler 将 DOCX 转为 PDF 再转为 JPEG/PNG 图像,用于可视化分析。
使用方式
读取与分析内容
文本提取:
pandoc --track-changes=all path-to-file.docx -o output.md
# 选项:--track-changes=accept/reject/all
原始 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 文档
使用 docx-js,通过 JavaScript/TypeScript 创建 Word 文档。
工作流:
- 必须完整阅读 docx-js.md(约 500 行),不得设置任何范围限制。
- 使用 Document、Paragraph、TextRun 组件创建 JavaScript/TypeScript 文件。
- 使用 Packer.toBuffer() 导出为 .docx。
编辑现有 Word 文档
使用 Document 库(Python 的 OOXML 操作库)。
工作流:
- 必须完整阅读 ooxml.md(约 600 行),不得设置任何范围限制。
- 解包文档:
python ooxml/scripts/unpack.py <office_file> <output_directory> - 使用 Document 库创建并运行 Python 脚本。
- 打包最终文档:
python ooxml/scripts/pack.py <input_directory> <office_file>
修订追踪工作流
该工作流允许在 OOXML 中实现修订前,先用 markdown 规划完整的修订内容。
批处理策略:将相关更改分组为每批 3-10 个更改,每批测试后再进行下一批。
原则:最小化、精确编辑。只标记实际更改的文本,将替换拆分为:[未更改文本] + [删除] + [插入] + [未更改文本]。保留原始 run 的 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 表示:
pandoc --track-changes=all path-to-file.docx -o current.md - 识别并分组更改,使用章节/标题编号、段落标识符、grep 模式或文档结构定位。不要使用 markdown 行号。
- 阅读文档并解包:完整阅读 ooxml.md,解包文档,注意解包脚本建议的 RSID。
- 分批实现更改:将更改按章节、类型或邻近度分组,每批 3-10 个。对每批:a. 在 word/document.xml 中 grep 文本以验证文本如何拆分;b. 使用 get_node 查找节点,实现更改,然后 doc.save()。注意每次脚本运行后行号会变化,写脚本前始终重新 grep。
- 打包文档:
python ooxml/scripts/pack.py unpacked reviewed-document.docx - 最终验证:转换为 markdown 并检查所有更改是否正确应用,确认没有引入意外更改。
将文档转换为图像
两步过程:
- DOCX 转 PDF:
soffice --headless --convert-to pdf document.docx - PDF 页转 JPEG:
pdftoppm -jpeg -r 150 document.pdf page
选项:
- -r 150:设置分辨率为 150 DPI
- -jpeg:输出 JPEG 格式(可用 -png)
- -f N:起始页
- -l N:结束页
- page:输出文件前缀
示例:pdftoppm -jpeg -r 150 -f 2 -l 5 document.pdf page(仅转换第 2-5 页)
适用场景
- 需要程序化创建、编辑或分析 .docx 文档。
- 法律、学术、商业或政府文档的修订审阅(必须使用修订追踪工作流)。
- 处理他人文档时推荐使用修订追踪工作流。
- 需要提取文档文本、批注、复杂格式或元数据。
- 需要将 Word 文档转换为图像进行可视化分析。
限制
- 创建新文档必须完整阅读 docx-js.md,编辑现有文档必须完整阅读 ooxml.md,不得设置范围限制。
- 修订追踪必须系统性地实现所有更改,不能遗漏。
- 不要使用 markdown 行号定位更改,因为它们不映射到 XML 结构。
- 每次脚本运行后行号会变化,写脚本前必须重新 grep。
- 代码风格要求简洁,避免冗长变量名和冗余操作,避免不必要的 print 语句。
依赖
必需依赖(如未安装则安装):
- 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 解析)