word的docx以xml格式实现Python自动化遇到图片无法正常显示以及word无法读取的内容报错的解决思路

环境

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文档会出现无法读取的内容。

于是两个问题需要解决

  1. 如何正确显示图片?
  2. 如何解决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" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值