前言

python的docx库想必大家并不陌生,就是处理word文档(docx格式)的三方库。但有些格式总是遍查各个网站都没有结果,无法处理。比如,对段落格式的首行缩进2字符如何取消?本文就是对此进行介绍,以及记录探索过程。

若不想看过程,可直奔文末看结论。

探索过程

1、缘由

最初的需求是,同事编写帮助文档的Word后,需要将文档(含图片)复制到网站的富文本编辑器中,以供用户查阅。但是一顿繁琐的操作上传图片后,富文本中的图片总是很模糊,不是原图,原因是编写word时,word本身就对大图做了压缩。

后来另一个同事对富文本编辑器编写了一个插件,自动提取word中的图片,解决了繁琐的操作,但仍无法获取原图。然后我用python-docx编写了一个工具,将图片还原为原图大小,结合起来用就可以满足需求。

但问题来了,那位同事写的文档格式很不规范,前面首行缩进的段落换行后直接粘贴图片,于是图片所在行也有了首行缩进,图片的编号也是,而该同事又只对图编号居中。这样在word中还不觉得有什么,但在大显示屏的网页查看,就是图片居左、编号居中。

于是我就想在我写的工具中一并处理:将首行缩进全部取消,然后居中

2、最初方案(不可行)

最开始的思路就是直接赋值,像这样:

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENTdoc = Document(r'D:/test/文本缩进测试.docx')
graph = doc.paragraphs[10]  # 某一段落graph.paragraph_format.first_line_indent = 0  # 首行缩进设置为0
graph.paragraph_format.left_indent = 0  # 左侧缩进设置为0
graph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中doc.save(r'D:/test/[已处理]文本缩进测试.docx')

但是发现,虽然居中了,但缩进没有取消!

3、灵感

没办法,换种方式尝试,但探索了很长时间都不行,甚至换了种方式:复制本行到新的一行,然后删除原行。但新的问题来了:字体如何获取?

word中有些字体是继承前面的,使用python-docx获取出来是空值,在网上找了方法获取,然后,最重要的一步设置字体是这段代码:

run.element.rPr.rFonts.set(qn('w:eastAsia'), ‘宋体’)

完整代码:

from docx import Document
from docx.oxml.ns import qn  doc = Document(r'D:/test/文本缩进测试.docx')
graph = doc.paragraphs[10]  # 某一段落
run = graph.runs[0]  # 某一段落的某一段内容run.font.name = ‘宋体’  # 1、先对字体设置
run.element.rPr.rFonts.set(qn('w:eastAsia'), ‘宋体’)  # 2、再对xml的属性赋值doc.save(r'D:/test/[已处理]文本缩进测试.docx')

其中,还提到docx文档本质是xml,可以解压获得。于是我解压获得了xml。

期间,我还尝试了修改缩进属性:(都不可行)

graph.paragraph_format.element.pPr.first_line_indent = 0  # 都不可行
graph.paragraph_format.element.pPr.ind_left = 0graph.paragraph_format.element.pPr.ind = 0  # 会报错
del graph.paragraph_format.element.pPr.ind  # 会报错

然后又是打印xml,又是查看解压的xml,终于发觉:既然能通过修改xml属性给字体赋值,为何不能给段落赋值?马上尝试!

4、成功解决

先对比原文档,和解压后的document.xml文件。原文档截图:

document.xml文件截图:(建议用浏览器打开xml文件,浏览器会自动解析结构)

好!真相大白!原来就这一行的区别! 既然无法删掉,那么就设置为0就行了!仿照设置字体的方式,于是:

graph.paragraph_format.element.pPr.ind.set(qn("w:firstLineChars"), '0')  # 这里的0是字符串

尝试可行!好,完成!

那么,举一反三,修改xml的其他属性理论上也能通过这种方式实现,妙啊!从此再也不受羁绊了!

结论

将段落的xml中对应属性赋值为0即可。封装成函数,完整代码:

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qndef clear_indent_and_center(paragraph):paragraph.paragraph_format.left_indent = 0  # 预先对缩进赋值,防止对象为空报错paragraph.paragraph_format.element.pPr.ind.set(qn("w:firstLineChars"), '0')  # 去除缩进paragraph.paragraph_format.element.pPr.ind.set(qn("w:firstLine"), '0')paragraph.paragraph_format.element.pPr.ind.set(qn("w:leftChars"), '0')paragraph.paragraph_format.element.pPr.ind.set(qn("w:left"), '0')paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中doc = Document(r'D:/test/文本缩进测试.docx')
graph = doc.paragraphs[10]  # 某一段落
clear_indent_and_center(graph)
doc.save(r'D:/test/[已处理]文本缩进测试.docx')

如果要修改文档其他属性,理论上都能通过此方式实现:解压docx→分析xml→直接修改属性值。但滥改很容易导致文档损坏,最好另存为,并注意检查处理后的文档!

python-docx 取消首行缩进相关推荐

  1. 微信小程序 首行缩进、 去掉/取消首行缩进

    首行缩进 .wxss 代码如下: .str1{text-indent: 20rpx;text-align: left; } //首行缩进20rpx 取消首行缩进 .str1{text-indent: ...

  2. 【微信小程序】首行缩进、 去掉/取消首行缩进

    首行缩进 text-indent:2em; text的意思是文本,indent在计算机英语中意思是缩进,至于后面的2em意思就是2个相对单位: em这个单位的意思就是文字的高度,1em就是1个文字的高 ...

  3. 微信小程序文章怎么首行缩进或取消首行缩进

    很多同学问酱茄小编,微信小程序怎么让文章首行缩进或取消文章首行缩进,代码参考了大神"武当山道士",表示感谢,以下代码大家仅供学习参考. 首行缩进 .wxss 代码如下: .str1 ...

  4. 微信小程序实现首行缩进、取消首行缩进

    首行缩颈wxss代码如下: .tip p:last-child{text-indent: 60rpx; //首行缩进60rpxtext-align: left;} 取消首行缩进wxss代码如下: .t ...

  5. html段落取消首行缩进,HTML段落首行缩进

    段落前面空两个字的距离,不要再使用空格了,用CSS实现段落首缩进两个字符.应该使用首行缩进text-indent.text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字 ...

  6. 正文样式设置必看:你知道最好不要直接在正文样式中设置首行缩进吗

    写这篇文章的初衷是我发现有好几位Office培训专家都强调了一件事--不要直接在正文样式中设置首行缩进,当时我还有些疑虑,直到后来有人问我了一个表格的问题,追根溯源发现竟然是正文样式设置了首行缩进的锅 ...

  7. Latex---局部调大字体--下划线--首行缩进--悬挂缩进

    1 调整字体大小 \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \Huge 2 下划线 \ ...

  8. 换行样式不要首行缩进_正文样式设置必看:你知道最好不要直接在正文样式中设置首行缩进吗...

    这篇文章是我在b站学了很多教程之后决定写的,一开始上课的时候,我发现有好几位Office培训专家都强调了一件事--不要直接在正文样式中设置首行缩进,当时我还有些疑虑,直到后来有人问我了一个表格的问题, ...

  9. Word目录第一行和最后一行格式不对(首行缩进)的解决方案

    [转载请注明出处: http://blog.csdn.net/lzl124631x] 最近又在写word文档,愈发觉得之前对word了解得太皮毛了,word实际上有很多功能自己都没开发过.但是我同时觉 ...

最新文章

  1. ICCV 2021 Workshop 盘点
  2. 向海龙回应“被百度开除”:离开是为了专心做投资
  3. 数据驱动的未来城市八大趋势
  4. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(4月16日-4月22日)
  5. 基于HTML5的WebGL呈现A星算法的3D可视化
  6. CSDN博客官方算法故障-随意删除图片记录
  7. 避免延迟的JPA集合
  8. 这几天惨遭Delphi类型转换折磨,请问怎么把double转成int类型
  9. (11)Verilog HDL变量:wire型
  10. 使用esp8266制作wifi干扰器
  11. Java-压缩指针compressedOops
  12. 微信小程序第三方平台和附近的小程序将开放
  13. bzoj 4237: 稻草人(CDQ分治+单调栈+二分)
  14. Linux-iptables初识
  15. 有关C++11标准的一些粗浅认识
  16. VS2015的下载地址和安装教程
  17. ”在禁用UAC时,无法激活此应用“问题
  18. 复数,实数,幂函数,指数函数
  19. Python 中的 sequence 类型
  20. 更换固态硬盘(不重装系统)(3)

热门文章

  1. 不鸣则已,一鸣惊人:90后周昊欣一天2篇Nature
  2. Visual Studio+oneAPI搭建fortran环境以及部分oneAPI无法集成到Visual Studio中问题
  3. 视频教程-权限管理系统-项目实战-Java
  4. 弘辽科技:淘宝搜索权重上不去怎么办?什么是搜索权重?
  5. mybatis中大于等于,小于等于,like等特殊符号写法
  6. 浏览器 缓存 面试 参数解析 Cache-Control Expires ETag Last-Modified
  7. Android touch bringup
  8. 2022A特种设备相关管理(电梯)考试练习题模拟考试平台操作
  9. MongoDB分布式集群(一)
  10. mysql的启动方式4种