因需要添加word封面图,并未找到相关资料直接添加封面图,操作word插入封面图后想到一个解决办法就是插入图片修改大小使其成为封面图。
查找资料后遇到一个问题就是如何修改图片环绕方式,经多方查找后找到一篇文章,简单的思路就是添加xml

docx背后的xml

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

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

pip install python-docx

# -*- coding: utf-8 -*-# filename: add_float_picture.py'''
Implement floating image based on python-docx.
- Text wrapping style: BEHIND TEXT <wp:anchor behindDoc="1">
- Picture position: top-left corner of PAGE `<wp:positionH relativeFrom="page">`.
Create a docx sample (Layout | Positions | More Layout Options) and explore the
source xml (Open as a zip | word | document.xml) to implement other text wrapping
styles and position modes per `CT_Anchor._anchor_xml()`.
'''from docx.oxml import parse_xml, register_element_cls
from docx.oxml.ns import nsdecls
from docx.oxml.shape import CT_Picture
from docx.oxml.xmlchemy import BaseOxmlElement, OneAndOnlyOne# refer to docx.oxml.shape.CT_Inline
class CT_Anchor(BaseOxmlElement):"""``<w:anchor>`` element, container for a floating image."""extent = OneAndOnlyOne('wp:extent')docPr = OneAndOnlyOne('wp:docPr')graphic = OneAndOnlyOne('a:graphic')@classmethoddef new(cls, cx, cy, shape_id, pic, pos_x, pos_y):"""Return a new ``<wp:anchor>`` element populated with the values passedas parameters."""anchor = parse_xml(cls._anchor_xml(pos_x, pos_y))anchor.extent.cx = cxanchor.extent.cy = cyanchor.docPr.id = shape_idanchor.docPr.name = 'Picture %d' % shape_idanchor.graphic.graphicData.uri = ('http://schemas.openxmlformats.org/drawingml/2006/picture')anchor.graphic.graphicData._insert_pic(pic)return anchor@classmethoddef new_pic_anchor(cls, shape_id, rId, filename, cx, cy, pos_x, pos_y):"""Return a new `wp:anchor` element containing the `pic:pic` elementspecified by the argument values."""pic_id = 0  # Word doesn't seem to use this, but does not omit itpic = CT_Picture.new(pic_id, filename, rId, cx, cy)anchor = cls.new(cx, cy, shape_id, pic, pos_x, pos_y)anchor.graphic.graphicData._insert_pic(pic)return anchor@classmethoddef _anchor_xml(cls, pos_x, pos_y):return ('<wp:anchor distT="0" distB="0" distL="0" distR="0" simplePos="0" relativeHeight="0" \n''           behindDoc="1" locked="0" layoutInCell="1" allowOverlap="1" \n''           %s>\n''  <wp:simplePos x="0" y="0"/>\n''  <wp:positionH relativeFrom="page">\n''    <wp:posOffset>%d</wp:posOffset>\n''  </wp:positionH>\n''  <wp:positionV relativeFrom="page">\n''    <wp:posOffset>%d</wp:posOffset>\n''  </wp:positionV>\n''  <wp:extent cx="914400" cy="914400"/>\n''  <wp:wrapNone/>\n''  <wp:docPr id="666" name="unnamed"/>\n''  <wp:cNvGraphicFramePr>\n''    <a:graphicFrameLocks noChangeAspect="1"/>\n''  </wp:cNvGraphicFramePr>\n''  <a:graphic>\n''    <a:graphicData uri="URI not set"/>\n''  </a:graphic>\n''</wp:anchor>' % (nsdecls('wp', 'a', 'pic', 'r'), int(pos_x), int(pos_y)))# refer to docx.parts.story.BaseStoryPart.new_pic_inline
def new_pic_anchor(part, image_descriptor, width, height, pos_x, pos_y):"""Return a newly-created `w:anchor` element.The element contains the image specified by *image_descriptor* and is scaledbased on the values of *width* and *height*."""rId, image = part.get_or_add_image(image_descriptor)cx, cy = image.scaled_dimensions(width, height)shape_id, filename = part.next_id, image.filenamereturn CT_Anchor.new_pic_anchor(shape_id, rId, filename, cx, cy, pos_x, pos_y)# refer to docx.text.run.add_picture
def add_float_picture(p, image_path_or_stream, width=None, height=None, pos_x=0, pos_y=0):"""Add float picture at fixed position `pos_x` and `pos_y` to the top-left point of page."""run = p.add_run()anchor = new_pic_anchor(run.part, image_path_or_stream, width, height, pos_x, pos_y)run._r.add_drawing(anchor)# refer to docx.oxml.__init__.py
register_element_cls('wp:anchor', CT_Anchor)
 document = Document(path)pic = document.paragraphs[0] #其实位置添加add_float_picture(pic, img_path, width=Cm(21.29), height=Cm(30.18), pos_x=Cm(0.11), pos_y=Cm(-0.2))# 判断文件是否存在,不存在则创建save_file_path = settings.MEDIA_ROOT + f'/userfile/{userID}/report_ini/'if not os.path.exists(save_file_path):os.makedirs(save_file_path)save_file_name = get_save_filename()document.save(save_file_path + save_file_name)

源文地址:https://www.zhangshengrong.com/p/OgN5D9zDan/

python-docx插入图片调整为封面图相关推荐

  1. 微信公众平台后台编辑器上线图片缩放和封面图裁剪功能

    今日,微信公众平台后台编辑器又上线了两个更新,图片缩放和封面图裁剪功能,微信团队真喜欢深夜放毒,不想让人睡的节奏.[微信公众平台编辑器可以剪裁和替换正文图片了] 两个新增的功能如下 1.图片缩放 插入 ...

  2. java 向word插入图片 调整图片位置

    你可以使用 Apache POI 库来向 Word 文档中插入图片并调整图片位置. 首先,确保你已经将 Apache POI 库添加到了你的项目中. 然后,你需要打开一个 Word 文档并获取到文档中 ...

  3. 【教程】Edraw Max(亿图图示):怎么插入图片到思维导图中?

    Edraw Max(亿图图示)作为一款功能非常强大的可视化绘图软件,不仅操作简单,还具有直观.友好的绘图界面.尤其是在使用Edraw Max(亿图图示)绘制思维导图时,可以通过形象生动的画面再附上文字 ...

  4. Typora+路过图床实现插入图片即上传图床

    背景   最近开始用Typora写东西,想着在插入图片的时候能够实时把图片上传到图床.本着白嫖的精神,于是在网上搜索有哪些免费的图床.一轮看下来,发现还挺多,不过基本上都有空间限制,唯独路过图床.感觉 ...

  5. typora插入图片调整位置

    typora图片左右位置调整 Typora图片左右位置调整 先看下默认情况 设置左对齐方式 任意左右偏移 Typora图片左右位置调整 我所使用的Typora插入图片后默认位置是居中对齐,但是图片太小 ...

  6. 【python批量插入图片到一个pdf中】

    批量插入图片到一个pdf中 需求 解决思路 代码详解 需求 把大量的img图片插入到一个pdf中,一张图片为pdf的一页 解决思路 先把大量的图片转为一个个的pdf,然后合并所有的pdf 话不多说,直 ...

  7. Python Excel插入图片

    #插入图片成功 def Write_Img(request):import xlsxwriterbook = xlsxwriter.Workbook('e:\\sample.xlsx')sheet = ...

  8. Python xlwings插入图片(Excel插入图片)

    文章目录 一.相对路径(报错) 二.绝对路径 三.指定位置和大小 四.居中插入 智能居中插入 遇到的坑 参考文献 测试图片 一.相对路径(报错) 使用相对路径插入会报错(确认路径正确无误) impor ...

  9. python代码插入图片_jupyter notebook插入本地图片的实现

    如何在Jupyter Notebook中插入本地图片? 我在网上搜索的时候,看到网上写的都是,将cell调节成为markdown cell, 然后输入下面的代码 ![title](img/pictur ...

  10. python docx 提取图片_Python提取docx文档中所有嵌入式图片和浮动图片

    术语: 浮动图片,是指在Word文档中位置可以自由移动.可以环绕文字或放置于文字上方.下方的图片,不占文档流的位置,可以和文字或嵌入式图片重叠. 嵌入式图片或行内图片,和文档中的文字一样占文档流的位置 ...

最新文章

  1. [原] 64位win7编译OpenCV SVN版本
  2. linux中python编译器的配置_linux下配置python3详解
  3. 扫盲行动之九:Vi编辑器的基本使用方法!
  4. UNITY Destroy()和DestroyImadiate()的区别
  5. 第一阶段冲刺(第七天)
  6. Node 之 模块加载原理与加载方式
  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(2) - SSE程序设计环境概述
  8. 入门第十课 Python语句的编写之while
  9. 解析xlsx与xls--使用2012poi.jar
  10. 设计Twitter时间轴并进行搜索
  11. 【LeetCode】Combination Sum(组合总和)
  12. centos 下安装mysql-5.6.11
  13. 从零基础入门Tensorflow2.0 ----一、2. 实战回归模型
  14. HTML网页设计结课作业——11张精美网页 html+css+javascript+bootstarp
  15. manjaro i3wm 的一些配置
  16. 大唐杯 5G协议与信令 任务六、任务七(24:30-35:00)
  17. 关于BOM的一些基本知识以及表格的操作
  18. 1+1备份和1:1冗余备份区别
  19. 请说说自己对鲁迅本人他作品的了解计算机,“鲁迅作品复习”综合性学习试题及答案...
  20. 设置windows开机隐藏启动,隐藏欢迎界面

热门文章

  1. 数据可视化—随机漫步
  2. [RK3288][Android5.1] 调试笔记 --- LVDS+EDP双屏机器调节白平衡色温
  3. Oracle执行计划变更
  4. 独家研究 I 某新一线城市中高端养老社区项目(CCRC)入住客户画像深度洞察研究报告
  5. SAP-MM-PA精解分析系列之供应商(01)-基本概念及业务介绍
  6. html怎么修改像素,PS怎么修改像素又不改变尺寸?
  7. 手机上html满屏飘爱心代码,微信满屏爱心怎么弄?微信满屏爱心特效方法步骤...
  8. 常用量化回测数据/收益指标的一些说明
  9. js实现手机横竖屏事件
  10. PPT如何压缩?PPT文件压缩的方法有哪些