python 基于 docx 文件模板生成 docx 或 PDF 文件

需求背景

提供一个Word文档模板,使用python程序替换里边的占位符,替换内容包括文本和图片,然后输出docx或者PDF文件。

功能演示

输入示例

在这里插入图片描述

输出示例

在这里插入图片描述

实现程序

import os
import shutil
import subprocess
import timefrom docx import Document
from docx.shared import Ptclass DocFiller:def __init__(self, doc_file_path, libreoffice_path=None):self.doc = Document(doc_file_path)self.libreoffice_path = libreoffice_pathdef _process_paragraphs(self, paragraphs, placeholders):# 遍历处理每个段落for paragraph in paragraphs:# 遍历处理每个段落中的每个runfor run in paragraph.runs:self._process_run(run, placeholders)@staticmethoddef _process_run(run, placeholders):for placeholder, replacement in placeholders.items():# 文本替换if isinstance(replacement, str):run.text = run.text.replace(placeholder, replacement)# 图片替换elif isinstance(replacement, tuple) and len(replacement) == 3:image_path, width, height = replacementif placeholder in run.text:# 保留占位符前后文本,只替换占位符部分texts = run.text.split(placeholder, 1)run.clear()run.add_text(texts[0])run.add_picture(image_path, width=Pt(width), height=Pt(height))run.add_text(texts[1])def _process_tables(self, doc_tables, placeholders):for table in doc_tables:for row in table.rows:for cell in row.cells:self._process_paragraphs(cell.paragraphs, placeholders)def fill(self, placeholders):self._process_paragraphs(self.doc.paragraphs, placeholders)self._process_tables(self.doc.tables, placeholders)def convert_to_pdf(self, docx_path, pdf_path):output_dir = os.path.dirname(pdf_path)temp_pdf_path = os.path.join(output_dir, os.path.basename(docx_path).rsplit('.', 1)[0] + '.pdf')try:subprocess.run([self.libreoffice_path, '--headless', '--convert-to', 'pdf:writer_pdf_Export','--outdir', output_dir, docx_path], check=True)shutil.move(temp_pdf_path, pdf_path)print(f"conversion successful: {pdf_path}")except subprocess.CalledProcessError as e:print(f"convert the document error: {e}")def to_docx(self, outputfile):self.doc.save(path_or_stream=outputfile)print('to docx complete')def to_pdf(self, outputfile):temp_file = f'{int(time.time() * 1e6)}.docx'self.to_docx(temp_file)try:self.convert_to_pdf(temp_file, outputfile)finally:os.remove(temp_file)print('to pdf complete')if __name__ == '__main__':liberoffice = 'D:/LibreOffice/program/soffice.exe'd = DocFiller('template.docx', liberoffice)data = {'{{meeting_time}}': '2024年12月12日 下午3点半','{{meeting_address}}': '中央会议室','{{host}}': '小白','{{photo}}': ('./0.png', 80, 80),'{{image1}}': ('./1.jpg', 8, 8),'{{image2}}': ('./2.jpg', 300, 200)}d.fill(data)# 生成docx文件# d.to_docx('data/output.docx')# 生成pdf文件d.to_pdf('data/output.pdf')

说明

  1. 本程序依赖python-docx库和liberoffice,可以实现docx文件模板内容替换。
  2. 如果替换后只需生成Word文档,则无需安装liberoffice,也不用指定liberoffice可执行文件路径。
  3. 如果需要生成PDF文件,则需要安装liberoffice,并将程序中的liberoffice可执行文件路径修改为自己的路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Ansys Fluent 对气体泄漏检测进行建模

了解使用 Ansys Fluent 仿真气体泄漏和确保安全的前沿技术。 挑战 气体泄漏对人类安全和环境构成重大风险。及早检测气体泄漏可以防止潜在的灾难,包括爆炸、火灾和有毒物质暴露。有效的气体泄漏检测系统对于石油和天然气、化学加工和住宅基础设施等行业至关重要。…

Mac软件推荐

Mac软件推荐 截图SnipasteXnipBob 快捷启动Raycast 系统检测Stats 解压缩The UnarchiverKeka(付费) 视频播放IINA 视频下载Downie(付费) 屏幕刘海TopNotchMediaMate(付费)NotchDrop(付费&#x…

在 Kibana 中为 Vega Sankey 可视化添加过滤功能

作者:来自 Elastic Tim Bosman 及 Miloš Mandić 有兴趣在 Kibana 中为 Vega 可视化添加交互式过滤器吗?了解如何利用 “kibanaAddFilter” 函数轻松创建动态且响应迅速的 Sankey 可视化。 在这篇博客中,我们将了解如何启用 Vega Sankey 可视…

阿里云数据库MongoDB版助力极致游戏高效开发

客户简介 成立于2010年的厦门极致互动网络技术股份有限公司(以下简称“公司”或“极致游戏”),是一家集网络游戏产品研发与运营为一体的重点软件企业,公司专注于面向全球用户的网络游戏研发与运营。在整个产业链中,公…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天,企业迎来了前所未有的发展机遇,规模迅速扩张,市场版图不断延伸。然而,伴随着这种快速的发展,一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…

MongoDB存储照片和文件存储照片的区别在那里?

一、维度对比 比较维度MongoDB存储照片文件系统存储照片数据模型使用文档存储数据,可以存储不同结构的照片。以文件的形式存储照片,每个文件独立存在。性能高效的数据检索,适用于大规模应用程序中的高效检索和访问。但在处理大量高分辨率图片…

爬虫基础知识点

最近看了看爬虫相关知识点,做了记录,具体代码放到了仓库,本文仅学习使用,如有违规请联系博主删除。 这个流程图是我使用在线AI工具infography生成的,这个网站可以根据url或者文本等数据自动生成流程图,挺…

PCL点云库入门——PCL库可视化之CloudViewer类简单点云信息显示

1、前言 可视化(visualization)涉及运用计算机图形学和图像处理技术,将数据转换成图像并在屏幕上展示,同时支持交互式处理。在PCL库中,一系列强大的可视化工具可供使用,其中较为流行的包括CloudViewer和PCL…

GUNS搭建

一、准备工作 源码下载: 链接: https://pan.baidu.com/s/1bJZzAzGJRt-NxtIQ82KlBw 提取码: criq 官方文档 二、导入代码 1、导入后端IDE 导入完成需要,需要修改yml文件中的数据库配置,改成自己的。 2、导入前端IDE 我是用npm安装的yarn npm…

Keil5添加stc的库到keil5中

1打开STC-ISP软件 在上图中找到keil仿真设置 再点击 点击之后会弹出选择文件 必须找到c51选中确定即可 之后在keil5中可以看到创建项目选择芯片是可以看到图中的选项

Vue基础记录

Vue 整体要学的 vue基础 vue-cli vue-router vuex element-ui vue3 简介 特点: 组件化声明式编码使用虚拟dom 优秀Diff算法 在生成真实dom的时候,会先有一部虚拟dom,且新的虚拟dom会和旧的虚拟dom进行diff算法比较 如果有些dom没改,那么就可以不用再重新渲染了,提高性能 …

【和春笋一起学C++】for语句和递增操作符

目录 1. for语句简介 2. for语句实例 3. 顺序点和副作用 4. 递增递减操作符应用于指针 1. for语句简介 for语句包含控制体和循环体,循环体跟在控制体的后面。 如下所示,控制体为for括号中的几个表达式,循环体为花括号中的几条语句。 fo…

有哪些方法可以快速批量的去查询手机号码归属地和运营商,快速的按归属地和运营商进行号码的分类 ?

下面为大家总结了一些快速查询手机号码归属地的工具和方法 工具仅供参考: 如何大批量的进行手机号码归属地查询 ,按省份分类,按城市分类,按运营商(移动、电信、联通)快速分类,高效办公工具批量…

Elasticsearch+Kibana分布式存储引擎

1.ElaticSearch介绍 ElaticSearch ,简称为 ES , ES 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检 索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。 ES 也使用 …

The Past, Present and Future of Apache Flink

摘要:本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024上海站主论坛开场的分享,今年正值Flink开源项目诞生的第10周年,借此时机,王峰回顾了Flink在过去10年的发展历程以及 Flink社区…

OpenAI 正式赋予 ChatGPT 通过视频实时与用户互动的能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

java jar包加密 jar-protect

介绍 java 本身是开放性极强的语言,代码也容易被反编译,没有语言层面的一些常规保护机制,jar包很容易被反编译和破解。 受classfinal(已停止维护)设计启发,针对springboot日常项目开发,重新编写安全可靠的jar包加壳加密技术,用于保护软件版权。 使用说…

arm CPS指令解释

arm CPS指令解释 1 The Current Program Status Register, CPSR1.1 N, Z, C, V, bits [31:28]1.2 Q, bit [27]1.3 SSBS, bit [23]1.4 PAN, bit [22]1.4.1 About the PAN bit 1.5 DIT, bit [21]1.6 GE[3:0], bits [19:16]1.7 E, bit [9]1.8 A, I, F, bits [8:6]1.9 M[4:0], bits…

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…

GFPS扩展技术原理(一)消息流

消息流作用 Google fast pair service要求Provider提供一个额外得通道以便seeker寻求建立连接,连接建立后,Seeker就可以向Provider发送一串数据流,这样做的目的是为了支持GFPS Extension,也就是扩展的GFPS,主要涉及一…