用 python-docx 创建浮动图片

本文介绍了如何使用 python-docx 库插入浮动图片。通过解析Word文档的xml结构,对比内联图片和浮动图片的差异,展示了创建浮动图片的步骤和代码实现,包括设置图片版式、定位方式,并提供了一个实际应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信大家对python-docx这个常用的操作docx文档的库都不陌生,它支持以内联形状(Inline Shape)的形式插入图片,即图片和文本之间没有重叠,遵循流动版式(flow layout)。但是,截至最新的0.8.10版本,python-docx尚不支持插入浮动图片(floating picture)。这显然不能满足丰富多彩的文档样式的需要,因此本文探究基于python-docx插入浮动图片——剖析xml、追踪源码,最后得到完整代码。

问题提出

作者在尝试实现PDF文档转docx(pdf2docx:https://github.com/dothinking/pdf2docx,开发中)的过程中遇到一个需求:根据背景图片在PDF页面的具体位置(例如左上角坐标和图片区域的长宽),将其重现到docx页面的相应位置。考虑到背景图片与文本的重叠,这就需要实现精确定位的浮动图片,参考下图示例。

Word中的设置

我们先尝试在Office Word中,手动解决上述问题。具备基础的Word使用经验即可知,通过设置图片版式来控制图片的浮动和具体位置。

上图版式设置中的文本环绕样式,大体可以分为三类:

分类 文本重叠 自由定位 样式名称
嵌入型 In line with text
环绕型 Square, Tight, Through, Top and bottom
完全浮动 behind text, In front of text

例如最常见的嵌入型图片,它占据了整行区域,我们既不能将其与文字重叠,也不能自由放置它的位置,而是由页面排版自动确定。对于环绕型图片,文本可以进入图片所在行,但是无法与之重叠;并且,我们可以用鼠标自由拖动其位置。完全浮动型图片则可以浮于文本上方或者衬于文本下方,同时支持随意放置其位置。

如果需要精确定位,则可在图片版式的位置(Position)选项卡进行设置。它提供了多种定位方式,例如绝对定位——根据图片左上角点距离水平和竖直参考的坐标值来定位。至于参考对象,可以是页面(Page)本身,这样(0, 0)就是页面左上角;也可以是边距(Margin),此时(0, 0)即为正文区域的左上角。

综上,我们需要实现精确定位衬于文本下方的图片版式。

docx背后的xml

我们还知道,docx文档的背后是xml格式的数据,python-docx正是通过处理xml的方式来读写word文档。所以,接下来先手工创建word文档,然后查看图片部分的xml内容。

作为对比,首先分别创建一个普通嵌入型图片文件和一个衬于文本下方的浮动型图片文件。然后执行查看步骤:右键docx文件 | 7-zip打开压缩包 | word | document.xml,复制文件内容并格式化xml,得到如下的关于图片部分的片段。为了便于对比分析,删除了一些节点属性。

内联图片片段:

<w:drawing>
    <wp:inline>
        <wp:extent cx="3297600" cy="2782800"/>
        <wp:effectExtent l="0" t="0" r="0" b="0"/>
        <wp:docPr id="1" name="Picture 1"/>
        <wp:cNvGraphicFramePr>
            <a:graphicFrameLocks/>
        </wp:cNvGraphicFramePr>
        <a:graphic>
            <a:graphicData>
                <pic:pic>
                    <!-- more pic content -->
                </pic:pic>
            </a:graphicData>
        </a:graphic>
    </wp:inline>
</w:drawing>

浮动图片片段:

<w:drawing>
    <wp:anchor behindDoc="1" locked="0" layoutInCell="1&
`python-docx` 是 Python 中用于操作 Microsoft Word (.docx)文档的第三方库。它不仅支持创建新文档,还可以对现有文档进行修改和读取。本文将重点介绍如何使用 `python-docx` 库从 .docx 文件中提取文本内容。 --- ### 安装 在开始之前,请确保已经安装了该模块。如果尚未安装,可以通过以下命令完成安装: ```bash pip install python-docx ``` --- ### 读取文档的基本步骤 #### 导入库并打开文档 首先要导入必要的库,并加载目标 .docx 文件: ```python from docx import Document document = Document('example.docx') # 加载名为 example.docx 的文件 ``` #### 提取段落内容 每个 `.docx` 文档由一系列段落组成。我们可以遍历这些段落到获取它们的内容。 ```python for paragraph in document.paragraphs: print(paragraph.text) # 打印出每一段的文字信息 ``` 此代码片段会依次打印每一个段落内的所有可见文字串。 #### 获取表格中的数据 如果文档中有表格,我们也可以轻松访问其单元格内容。 ```python tables = document.tables # 获得所有的表对象列表 if tables: # 检查是否有任何表格存在 table = tables[0] # 取第一个表格为例 rows = [] for row in table.rows: # 循环每一行 cells = [cell.text for cell in row.cells] rows.append(cells) from pprint import pprint # 更好地展示二维数组格式化输出 pprint(rows[:5]) # 展示前五行作为例子 ``` 上面的例子展示了怎么把第一张表格的所有行列转换成了简单的纯文本形式存储在一个列表里边,方便进一步分析处理。 --- ### 注意事项 - **样式丢失**: 使用 `python-docx` 直接读出来的只是纯文本,不会保留原Word里的字体大小、颜色或者其他装饰性质的东西。 - **复杂结构解析困难**: 面对着嵌套层次很深或者是非线性布局的情况时候(如浮动框),单纯依靠这个库可能会遇到挑战。 - **版本兼容问题**: 不同office版本产生的docx可能存在细微差别,在极少数情况下可能引起异常或错误解读。 ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值