环境
from xml.dom import minidom
目标
从一个word文档保留原格式复制到另一个word文档中,直接使用xml.dom去操作word文档,而不使用python-docx库。
Word格式
文件格式
word的docx本质是个压缩包,其中最主要的文档相关的内容使用xml格式存储的。当然绝大多数的文件都是以xml格式存在。
文件结构
├─1
│ │ [Content_Types].xml 包含了word要使用到的扩展
│ │
│ ├─docProps
│ │ app.xml
│ │ core.xml 包含文件作者
│ │
│ ├─word
│ │ │ document.xml word文档中文字表格图片等详细内容,也是编辑word的主要文件
│ │ │ endnotes.xml
│ │ │ fontTable.xml
│ │ │ footnotes.xml
│ │ │ settings.xml
│ │ │ styles.xml
│ │ │ webSettings.xml
│ │ │
│ │ ├─media 媒体文件夹中包含了word中需要用的的媒体文件
│ │ │ image1.gif
│ │ │
│ │ ├─theme 主题文件夹
│ │ │ theme1.xml
│ │ │
│ │ └─_rels 里面包含着document.xml引用的关系,将各个文件用rId联系
│ │ document.xml.rels 里面包含着图片的引用关系,如果你修改的图片不显示大概这里没有改
│ │
│ └─_rels
│ .rels
├─2
│ │ [Content_Types].xml
│ │
│ ├─docProps
│ │ app.xml
│ │ core.xml
│ │
│ ├─word
│ │ │ document.xml
│ │ │ endnotes.xml
│ │ │ fontTable.xml
│ │ │ footnotes.xml
│ │ │ settings.xml
│ │ │ styles.xml
│ │ │ webSettings.xml
│ │ │
│ │ ├─theme
│ │ │ theme1.xml
│ │ │
│ │ └─_rels
│ │ document.xml.rels
│ │
│ └─_rels
│ .rels
- <w:p> 表示一个段落
- <w:r> 表示一个样式串,指明它包括的文本的显示样式
- <w:t> 表示真正的文本内容
- <w:tbl> 表示一个表格
- <w:tr> 表示表格一行
- <w:tc> 表示一个cell,我立理解是单元格
其中文字被包含在<w:t>的节点下应该用firstchild来指向
问题复现
当我去从一个word文档的文字,图片以及公式保留格式复制到另一个word文档中,我首先是将源文档中document.xml相关节点复制到目标文档中。效果是一切ok的,除了照片无法显示,这时我就去查看源文件信息,发现还有media文件夹里的内容没有复制过去。于是复制图片到目标文档的对应目录中,结果还是无法显示,并且这时打开word文档会出现无法读取的内容。
于是两个问题需要解决
- 如何正确显示图片?
- 如何解决word报错?
正确显示图片
以下是doucument.xml里图片相关信息
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0"
wp14:anchorId="77FAF658" wp14:editId="331AEBE1">
<wp:extent cx="2842786" cy="2132374" />
<wp:effectExtent l="0" t="0" r="0" b="1270" />
<wp:docPr id="1" name="图片 1" />
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
noChangeAspect="1" />
</wp:cNvGraphicFramePr>
<a:graphic
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData
uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic
xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0"