首先python根据文本内容生成doc,使用的是python-docx库,使用示例如下:

from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT #设置对象居中、对齐等 document = Document()
document.styles['Normal'].font.name = u'微软雅黑'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
# 标题:20号字体,居中,加粗,黑色,微软雅黑,段落间距20
title = document.add_paragraph()
# 设置段落间距
title.paragraph_format.line_spacing = 1.3 # 行距
# 设置居中
title.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 加入文字
run = title.add_run('测试文档')
# 设置字体大小20
run.font.size = Pt(16)
# 设置字体颜色
run.font.color.rgb = RGBColor(0, 0, 0)
# 加粗
run.font.bold = True
document.save('./a.docx')

  下面进入重点python doc怎么转png,调研并测试过这几个方法:

  • 使用unoconv和libreoffice,doc转pdf,pdf转png【环境centos 7】
# 安装 libreoffice  可将doc转pdf
yum install libreoffice-writer
yum install unoconv
# 安装imagemagick
yum install ImageMagick 1.安装字体库
yum -y install fontconfig 2.添加中文字体,建立存储中文字体的文件夹
mkdir /usr/share/fonts/chinese 3.在windows上打开c盘下的Windows/Fonts目录,一般选择宋体和黑体,可以看到2个后缀名ttf和ttc的文件,将中文字体复制到Linux中那个chinese文件夹 4.添加权限
chmod -R 755 /usr/share/fonts/chinese 5.安装ttmkfdir来搜索目录中所有的字体信息,并汇总生成fonts.scale文件
yum -y install ttmkfdir 6.接下来生成
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir 7.修改字体配置文件
vi /etc/fonts/fonts.conf 8.可以看到一个Font list,即字体列表,添加中文字体文件夹位置,生成缓存
fc-cache 查看中文字体是否被添加进去
fc-list # 执行转换
$ unoconv -f pdf -o ./11.pdf 11.docx
$ sz 11.pdf $ unoconv -f png -o ./11.png 11.pdf # 只能转换1张,使用:convert -density 300 12.pdf -alpha off -background white -quality 100 image_transparent.png #会生成多张 image_transparent-0.png image_transparent-1.png
$ sz 11.png

总结:可行,速度不行

  • spire.doc,pip安装库spire-doc,总结如下:
  1. 一个收费库即有水印,小贵,花不了一点儿(官网价格:https://www.e-iceblue.com/Buy/Spire.Doc.html)。
  2. 经测试水印位置,上中下都有,尝试去水印,去除的不彻底边缘能看到红色,或者导致原始文档内容不连续。
  3. 尝试doc直接转svg,修改svg水印字颜色和字号,结果转出的png英文显示,中文显示的是框框,还出现字重叠的情况。
  4. 速度还是挺快的。
  • aspose words,pip安装库aspose-words,总结如下:
  1. 与spire.doc一样收费,价格没去看,就看这个水印就放弃了,如图:
  • 使用unoconv和libreoffice,doc转pdf,再使用fitz库pdf转png,总结如下:
  1. 可行,此方案仅仅想在第一种方案上进行速度优化。
  2. 实际验证速度还是不行。
  • 创建带样式的模版html,读doc转html,替换掉模版正文,DrissionPage读取本地html文件,截屏存储为png。
  1. 最后这种思路虽然有点绕,不过速度是最快的。
  2. 无任何收费,DP最优解。

  以下是测试代码:

import os
import platform from PIL import Image
# import cairosvg
from spire.doc import *
from spire.doc.common import *
# import xml.etree.ElementTree as ET
from lxml import etree as ET def remove_red_watermark(image_path, output_path, red_threshold=100):
# 打开图片并转换为RGBA格式
image = Image.open(image_path).convert("RGBA")
pixels = image.load() # 遍历每个像素
for x in range(image.width):
for y in range(image.height):
r, g, b, a = pixels[x, y] # 判断是否为红色(可以根据需要调整red_threshold的值)
if r > red_threshold and g < red_threshold + 20 and b < red_threshold + 20:
# # 将红色像素的透明度设置为完全透明
# pixels[x, y] = (r, g, b, 0)
# 将红色像素的颜色改为白色,并保留其不透明度
pixels[x, y] = (255, 255, 255, a) # 保存修改后的图片
image.save(output_path, format="PNG") # 读取SVG文件
def read_svg(file_path):
tree = ET.parse(file_path)
root = tree.getroot()
return root, tree # 修改SVG中的<tspan>标签
def modify_tspan_tags(root, target_fill, new_fill, new_font_size):
# 遍历所有<tspan>标签
for tspan in root.findall('.//{http://www.w3.org/2000/svg}tspan'):
# 备份原始的transform属性值
original_transform = tspan.attrib.get('transform', '')
# 检查fill属性是否匹配目标值
if 'fill' in tspan.attrib and tspan.attrib['fill'] == target_fill:
# 修改fill属性和font-size
tspan.attrib['fill'] = new_fill
tspan.set('font-size', new_font_size)
# 恢复原始的transform属性值
tspan.attrib['transform'] = original_transform # 保存修改后的SVG文件
def save_svg(tree, output_path):
tree.write(output_path, encoding="utf-8", xml_declaration=True, standalone="yes")
# tree.write(output_path) # 将SVG文件转换为PNG格式
# def convert_svg_to_png(svg_path, png_path):
# try:
# # cairosvg.svg2png(url=svg_path, write_to=png_path)
# # 使用cairosvg生成PNG的字节流
# with open(svg_path, "r", encoding="utf-8") as f:
# svg_content = f.read()
# cairosvg.svg2png(bytestring=svg_content.encode('GBK'), write_to=png_path)
#
# except Exception as e:
# print(f'svg convert png err:{svg_path}') # 主函数
def main(input_svg_path):
# 输入SVG文件路径 # 读取SVG文件
root, tree = read_svg(input_svg_path) # 修改<tspan>标签
modify_tspan_tags(root, '#ff0000', 'white', '0') # 输出修改后的SVG文件路径 output_svg_path = 'modified_input.svg'
new_svg = input_svg_path.replace('.svg', output_svg_path) # 保存修改后的SVG文件
save_svg(tree, new_svg)
print(f"修改后的SVG文件已保存为:{new_svg}")
# 输出PNG文件路径
output_png_path = new_svg.replace(output_svg_path, '.png') # 将修改后的SVG文件转换为PNG格式
# convert_svg_to_png(new_svg, output_png_path)
print(f"修改后的SVG文件已转换为PNG格式:{output_png_path}") def gen_png(file_path):
# 加载Word文档
document = Document()
document.LoadFromFile(file_path) # 保存为.png图片(也可以保存为jpg或bmp等图片格式)
new_p = file_path.replace('.docx', '')
document.SaveToFile(f"{new_p}-.svg")
# 关闭文档
document.Close() file_dir = file_path.rsplit('/', 1)[0]
file_dir = file_dir if platform.system() == 'Linux' else file_path.rsplit('\\', 1)[0]
print(f'file_dir==={file_dir}')
for _, _, fs in os.walk(file_dir):
for ff in fs:
if ff.endswith('.svg'):
ff_abs = os.path.join(file_dir, ff)
main(ff_abs) def gen_png1(file_path):
# 加载Word文档
document = Document()
document.LoadFromFile(file_path) new_p = file_path.replace('.docx', '')
# 遍历所有页面
for i in range(document.GetPageCount()):
# 转换指定页面为图片流
imageStream = document.SaveImageToStreams(i, ImageType.Bitmap)
# 保存为.png图片(也可以保存为jpg或bmp等图片格式)
with open(f"{new_p}-{str(i)}_output.png", 'wb') as imageFile:
imageFile.write(imageStream.ToArray())
remove_red_watermark(f"{new_p}-{str(i)}_output.png", f"{new_p}-{str(i)}.png")
# 关闭文档
document.Close() if __name__ == '__main__':
f_p = r'C:\Users\user\Desktop\test\11.docx'
f_p = f_p if platform.system() == 'Windows' else '/jjyy/11.docx'
print(f'f_p==={f_p}')
# gen_png(f_p)
gen_png1(f_p)

  若报以下错,参考下面文章:

  sqlite:No module named _sqlite3
  ImportError: lxml.html.clean module is now a separate project lxml_html_clean

  DrissionPage.errors.WrongURLError 无效的url,也许要加上"http://"?

python doc转png踩坑历程分享的更多相关文章

  1. ASP.NET Web 应用 Docker踩坑历程——续

    ASP.NET Web 应用 Docker踩坑历程发表后,也开始使用Docker了,然而发布的过程比较痛苦,经常发生下图的事情: 据说是nuget包还原时发生错误 百度了半天也找不到解决的方法,而发生 ...

  2. openjtag 的硬件连接踩坑历程

    这个事情踩了不少坑,这个要记录一下: 1 代码的下载和编译按照下面的来:https://github.com/pulp-platform/pulp-debug-bridge 注意点: A 要最好使用p ...

  3. python学习过程中的踩坑记录<若干,随时更新>

    问题1:python中print的连串输出与java不一样? 输入print(code +"+++"); --在代码中写入,界面未报错,但是告诉你不行 会报错,如图: 解决办法: ...

  4. Yii 2 的安装 之 踩坑历程

    由于刚接触yii2 ,决定先装个试试:可是这一路安装差点整吐血,可能还是水平有限吧,  但还是想把这个过程分享出来,让遇到同样问题的同学有个小小的参考,好了言归正传!! <(~.~)> 下 ...

  5. ASP.NET Web 应用 Docker踩坑历程

    听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...

  6. Python:strip 函数踩坑

    S.strip(chars=None) strip 函数用于去除字符串首尾的空格,当 chars 不为 None 时,则删除字符串首尾的 chars 中的字符. 当 chars=None 时,去除首尾 ...

  7. Python读取大文件的"坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

  8. centos 7( linux )下搭建elasticsearch踩坑记

    原文:https://blog.csdn.net/an88411980/article/details/83150380 概述    公司最近在做全文检索的项目,发现elasticsearch踩了不少 ...

  9. 记一次Docker中部署Asp.Net Core 3.0的踩坑过程

    最近公司打算重构目前直销报单系统到微信小程序中,目前的系统只能在PC上面使用,这两年也搞过App端,但是由于人员流动和公司架构调整最后都不了了之,只留下一堆写了一半的接口.以前的接口依然是使用Asp. ...

  10. html2canvas以及domtoimage的使用踩坑总结

    前言 首先做个自我介绍,我是成都某企业的一名刚刚入行约一年的前端,在之前的开发过程中,遇到了问题,也解决了问题,但是在下一次解决相同问题的时候,只对这个问题有一丝丝的印象,还需要从新去查找,于是,我注 ...

随机推荐

  1. 基于近红外与可见光双目摄像头的人脸识别与活体检测,文末附Demo

    基于近红外与可见光双目摄像头的活体人脸检测原理 人脸活体检测(Face Anti-Spoofing)是人脸识别系统中的重要一环,它负责验证捕捉到的人脸是否为真实活体,以抵御各种伪造攻击,如彩色纸张打印 ...

  2. 【P6】Verilog搭建流水线MIPS-C3-CPU(50条指令)

    我开P6是过P5了吗?笑死,P5又挂了,还是经典的blezalc指令,天知道原来我是不会写的,前近一个月每次branch类指令全都加错,而且是错得离谱.但都把重心放在课下debug上了,自以为不就是b ...

  3. Java 设计模式:装饰者模式(Decorator Pattern)

    一.模式定义 装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式.该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭). 二.核心角色 Co ...

  4. Centos下安装php mysql pdo以及gd扩展

    pdo扩展安装: yum install php-pdo pdomysql扩展安装: yum install php-pdo_mysql gd库扩展安装: yum install php-gd 安装后 ...

  5. JDK 24 发布,新特性解读!

    真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和 Java 22.Java 23一样. 下一个长期支持版是 Java 25,预计今年 9 月份发布. ...

  6. bug|Git Hooks pre-commit|git 提交代码报错|error: 'describe' 'it' 'expect' is not defined (no-undef)|pre-commit hook failed (add --no-verify to bypass)|

    前言 今天学习 jest 的 vue-test-utils 的配置及使用. 报错原因为 jest 全局变量 git 提交代码报错,使用除了参考链接里的解决方案,正好复习一下之前学习的 Git Hook ...

  7. BUUCTF---rsa2

    题目 N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241 ...

  8. ISODate时间转换

    private function formatISODate($dateTime) { $date = date("Y-m-d", strtotime($dateTime)); $ ...

  9. 【HTML】步骤进度条组件

    HTML步骤进度条 效果图 思路 分份: 有多少个步骤就可以分成多少分,每份宽度应该为100%除以步骤数,故以上效果图中的每份宽度应该为25%,每份用一个div. 每份: 每份中可以看成是三个元素,一 ...

  10. Gin CORS

    Go 语言手搓一个简单的跨域还是比较容易的, 但自己手搓一批通用代码总归还是麻烦了点. 如果使用 Gin 的话, 有现成的跨域中间件可以用. github.com/gin-contrib/cors 注 ...