Python办公自动化(2)对wordpdf的操作

news2025/4/6 3:45:39

一、操作word文档

终端下载操作word文件的工具库:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx

1.遍历文档中内容

paragraphs:段落属性,返回列表类型的段落地址,遍历每一个段落地址,通过text获得文本

# 操作docx文档的工具
from docx import Document
# 加载文档
doc = Document('需求规约v1.0.docx')
# print(doc.paragraphs)
for p in doc.paragraphs:
    print(p.text)

2.遍历文档中所有表格

from docx import Document
doc = Document('需求规约v1.0.docx')
for t in doc.tables:# 遍历文档中所有表格
    for row in t.rows:# 遍历表格中的每一行
        #_row_str = ' ' 👈优化视图
        for cell in row.cells:# 遍历每一行中的每一个格子
            #_row_str = cell.text + '|' 👈视图优化
            print(_row_str)# 输出格子中所包含的内容

3.检索文档中的关键字

批量查找word文档,检索哪些文档中含有关键字。

1.引库

无需多言

import glob
from docx import Document

2.创建ReadDoc类

用于读取 Word 文档中的段落和表格内容,并将它们分别存储到类的属性中。

class ReadDoc(object): # 创建类,继承object父类
    def __init__(self,path):# 类的初始化方法,self可以调用类成员,path初始化时传递的参数
        self.doc = Document(path)# 获得word文件
        self.p_text = ''# 定义存放段落的引用
        self.table_text = ''# 定义存放表格的引用
        self.get_para()
        self.get_table()

    def get_para(self):
        for p in self.doc.paragraphs:
            self.p_text += p.text + '\n'

    def get_table(self):
        for table in self.doc.tables:
            for row in table.rows:
                _cell_str = ''
                for cell in row.cells:
                    _cell_str += cell.text + ','
                self.table_text += _cell_str +'\n'

3.创建search_word函数

用于在指定路径下的 Word 文档中查找是否包含所有指定的关键字。

def search_word(path,targets):
    result = glob.glob(path)
    final_result = []
    for i in result:
        isuse = True
        if glob.os.path.isfile(i):
            if i.endswith('.docx'):#判断是否是word文件,是返回true,不是返回false
                doc = ReadDoc(i)# 创建对象,参数值会自动给初始化方法赋值
                p_text = doc.p_text # 获得ReadDoc类中p_text值,该属性包含word文档中的段落内容
                t_text = doc.table_text # 获得ReadDoc类中table_text值,该属性包含word文档中的表格内容
                all_text = p_text + t_text
                for target in targets: #循环遍历每一个要查找的关键字
                    if target not in all_text:# 判断文档中不包含关键字
                        isuse = False
                        break
                if not isuse:
                    continue
                final_result.append(i)
    return final_result

4.主程序

用于在当前目录下的所有文件中查找包含指定关键字的 Word 文档。

if __name__ == '__main__':
    path = glob.os.path.join(glob.os.getcwd(),'*')
    res = search_word(path,['python','golang','最佳'])
    print(res)

4.生成word文件

1.创建一个docx文件

from docx import Document
doc = Document()
#👉....👈添加内容
doc.save('text.docx') # 保存word

2.添加/追加标题

添加标题
参数1:标题内容;参数2:标题字号0-9

title = doc.add_heading('My Title',0)

追加标题
即在大标题下写一个小标题

title.add_run('\n123456')

3.添加段落

p = doc.add_paragraph('今天下雨辣')
p.add_run('\n其实也可能不下雨')

 4.添加图片

参数1:图片的名称;参数2:图片的宽度,Inches:英寸单位

from docx.shared import Inches

doc.add_picture('tupian.jpg',width=Inches(2))

5.添加表格

#添加表格样式
table_title = ['name','age','sex'] # 构建表头信息
table = doc.add_table(rows=1,cols=3) # 初始化表格,默认1行3列
title_cells = table.rows[0].cells # 获得第一行的格子列表
title_cells[0].text = table_title[0]
title_cells[1].text = table_title[1]
title_cells[2].text = table_title[2]
#构建表体数据
data = [
    ('Adela','18','woman'),
    ('Hecate','15','woman'),
    ('Hela','14','woman'),
]
# 将表体数据赋值给表格
for d in data:
    row_cells = table.add_row().cells # 添加行并且获得行中的格子
    row_cells[0].text = d[0] #name
    row_cells[1].text = d[1] #age
    row_cells[2].text = d[2] #sex

6.添加分页

doc.add_page_break()
# title1 = doc.add_heading('My Title2',0) 👈随便加点内容

5.设置word样式

1.创建一个docx文件

from docx import Document
# ......👈添加功能库
doc = Document()
# ......👈添加功能
doc.save('test.docx')

2. 定义全局样式

from docx.shared import RGBColor, Pt
style = doc.styles['Normal']
style.font.name='微软雅黑'
style.font.color.rgb = RGBColor(255,0,0)
style.font.size = Pt(16)
doc.add_paragraph('Java语言和Python已经成为开发者的必备语言')

3.定义全局样式 

from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt
title = doc.add_heading('My Title',0)
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
title.style.font.size = Pt(20)

4.添加表格样式 

from docx.enum.style import WD_STYLE_TYPE
#工具中内置哪些表格样式👈在终端中输出,单纯为了查找可用样式
for i in doc.styles:
    if i.type == WD_STYLE_TYPE.TABLE:
        print(i.name)
#添加表格样式
table_title = ['name','age','sex'] # 构建表头信息
table = doc.add_table(rows=1,cols=3,👉style='Colorful Grid Accent 3'👈) # 初始化表格,默认1行3列
title_cells = table.rows[0].cells # 获得第一行的格子列表
title_cells[0].text = table_title[0]
title_cells[1].text = table_title[1]
title_cells[2].text = table_title[2]
#构建表体数据
data = [
    ('Adela','18','woman'),
    ('Hecate','15','woman'),
    ('Hela','14','woman'),
]
# 将表体数据赋值给表格
for d in data:
    row_cells = table.add_row().cells # 添加行并且获得行中的格子
    row_cells[0].text = d[0] #name
    row_cells[1].text = d[1] #age
    row_cells[2].text = d[2] #sex

二、操作PDF文档

1.安装工具

1.wkhtmltopdf

将 HTML 页面或网页转换为 PDF 文件工具:

下载网址:wkhtmltopdf

配置环境变量后可在pycharm终端中查询版本:

wkhtmltopdf -V

2.pdfkit

将 HTML、CSS 和 JavaScript 转换为 PDF 格式的工具:

在pycharm终端下载工具库即可:

pip3 install pdfkit

3.pywin32

在 Python 环境中直接使用 Windows 的各种功能:

包括操作系统的文件系统、注册表、图形用户界面等

pip3 install pywin32 

4.pypdf2 

用于处理 PDF 文件的 Python 库:

它提供了丰富的功能,包括读取、合并、拆分、加密、解密 PDF 文件等。

pip3 install pypdf2 

5.pdfplumber

也是用于处理 PDF 文件的 Python 库:

主要功能是从 PDF 文件中提取文本、表格、图像等数据。

pip3 install pdfplumber

2.生成PDF文件

1.html转换成pdf

参数1:html文件;参数2:转换pdf文件的名字

import pdfkit
pdfkit.from_file('htmldemo.html','test0.pdf')

2.网址的html转换成pdf

#我没成功,估计是网页信息量太大了👇
pdfkit.from_url(['https://www.baidu.com','https://www/jd.com'],'test1.pdf')

3.字符串转pdf

import pdfkit
html = '''
<html>
    <head>
        <meta charset="utf-8"/>
    </head>
    <body>
        <p>你好</p>
    </body>
</html>
'''
pdfkit.from_string(html,'test2.pdf')

3.生成通知书

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor, Inches

def create_doc(car_no,year,month,day,hour,minute,money,type_info):
    doc = Document()
    title = doc.add_paragraph()
    p1 = title.add_run('车辆违章处罚通知单')
    p1.font.size = Pt(30)
    p1.font.color.rgb = RGBColor(255,0,0)
    p1.font.name = ''
    p1._element.rPr.rFonts.set(qn('w:eastAsia'),'黑体')
    title.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
    info = f'''辽A{car_no}车于{year}年{month}月{day}日{hour}时{minute}分在营过程中出现{type_info}(违章)现象。公可按票安企法规和公司相关制度发定决定对该车驾驶员处以{money}元款,要求你在今后的营运过程中严格按照相关法律法规运行。(注,罚款金请在返程后立即到公司缴纳)
                                                                
                                                                        驾驶员签字:                  年       月       日     '''
    content = doc.add_paragraph()
    p2 = content.add_run(info)
    content.paragraph_format.first_line_indent = Inches(0.25)

    doc.save('通知书.docx')

if __name__ == '__main__':
    car_no = '123456'
    year = 2030
    month = 8
    day = 8
    hour = 16
    minute = 25
    money = 200
    type_info = '违停'
    create_doc(car_no,year,month,day,hour,minute,money,type_info)

4.通过模板生成文档

from docx import Document
import os
infos = [
    ['辽A00001',2030,12,12,12,12,'违停',200],
    ['辽A00002',2030,11,11,11,11,'闯红灯',500],
    ['辽A00003',2030,10,10,10,10,'压线',200],
]
for info in infos:
    doc = Document('word_模板.docx')
    for p in doc.paragraphs:
        for run in p.runs:
            run.text = run.text.replace('{0}',info[0])
            run.text = run.text.replace('{1}', str(info[1]))
            run.text = run.text.replace('{2}', str(info[2]))
            run.text = run.text.replace('{3}', str(info[3]))
            run.text = run.text.replace('{4}', str(info[4]))
            run.text = run.text.replace('{5}', str(info[5]))
            run.text = run.text.replace('{6}', info[6])
            run.text = run.text.replace('{7}', str(info[7]))

    if not os.path.exists('./通知'):
        os.makedirs('./通知')
    doc.save(f'./通知/{info[0]}.docx')

5.word转换pdf文件

from win32com.client import constants,gencache

def createPdf(wordPath,pdfPath):
    # 声明操作的是word文件
    word = gencache.EnsureDispatch('Word.Application')
    # 打开word文件
    doc = word.Documents.Open(wordPath,ReadOnly=1)
    # 转换pdf文件,并进行格式设置
    doc.ExportAsFixedFormat(pdfPath,constants.wdExportFormatPDF,Item=constants.wdExportDocumentWithMarkup,CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
    word.Quit(constants.wdDoNotSaveChanges)

if __name__ == '__main__':
    path = 'D:/workspace/demo/PythonOfficeAutomation/example2/'
    createPdf(path+'简历1.docx',path+'简历1copy.pdf')

6.读取pdf文件

def read_pdf2(path):
    import pdfplumber
    with pdfplumber.open(path) as pdf:
        for i in range(len(pdf.pages)):
            page = pdf.pages[i]
            print(page.extract_text())# 输出当前页中的文本
if __name__ == '__main__':
    read_pdf2('简历1copy.pdf')

7.合并pdf文件

def merger_pdf(path1,path2):
    from PyPDF2 import PdfWriter,PdfReader
    write = PdfWriter()

    for path in [path1,path2]:
        tmp_pdf = PdfReader(open(path,'rb'))

        for page in tmp_pdf.pages:
            write.add_page(page)

        with open('./合并pdf.pdf','wb') as out:
            write.write(out)
if __name__ == '__main__':
    merger_pdf('简历1copy.pdf','test0.pdf')

8.拆分pdf文件

def chaifen_pdf(path):
    from PyPDF2 import PdfWriter,PdfReader
    pdf = PdfReader(open(path,'rb'))
    for i,page in enumerate(pdf.pages):
        writer = PdfWriter()
        writer.add_page(page)
        with open(f'./拆分_{i+1}.pdf','wb') as out:
            writer.write(out)
if __name__ == '__main__':
    chaifen_pdf('./合并pdf.pdf')

9.加密解密pdf文件

def jiami(path):
    from PyPDF2 import PdfWriter,PdfReader
    pdf = PdfReader(open(path,'rb'))
    writer = PdfWriter()
    # pdf.decrypt('123456') # 读取pdf的文件有密码时,填写对应的密码
    writer.encrypt('123456')#设置密码
    for page in pdf.pages:
        writer.add_page(page)
    with open('加密pdf.pdf','wb') as target:
        writer.write(target)

if __name__ == '__main__':
    jiami('拆分_1.pdf')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pip安装第三方库,但PyCharm中却无法识别

点击菜单栏File&#xff0c;选择Settings 系统默认的是PyCharm安装目录下的python.exe 解释器&#xff0c;不要用。 选择你的PYTHON的安装目录下的python.exe 解释器。如果不存在的话&#xff0c;增加进去 如果文件》设置打不开&#xff0c;需移除法化包。 打开 pycharm 安装目…

Linux C++编译及g++使用操作

编译的步骤 编译选项参数 编译生成库文件 静态库 动态库 运行可执行文件 静态库由于已经包含了链接的文件所以可以直接执行&#xff1b;动态库方式由于是运行时链接&#xff0c;所以需要指定链接的路径&#xff1b;

【Android】界面布局-线性布局LinearLayout-例子

线性布局&#xff08;LinearLayout&#xff09;是一种重要的界面布局中&#xff0c;也是经常使用到的一种界面布局 • 在线性布局中&#xff0c;所有的子元素都按照垂直或水平的顺序在界面上排列 ➢如果垂直排列&#xff0c;则每行仅包含一个界面元素 ➢如果水平排列&…

windows技术基础知识

NT架构 NT 就是new techonology 的英文单词缩写&#xff0c;是微软1993年推出操作系统的重大升级&#xff0c;如内存管理&#xff0c;安全机制&#xff0c;多任务&#xff0c;多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面&#xff0c;只有有限的内存管理和多任…

在 Windows 环境下使用 VSCode 和 TinyGo 开发 ESP8266(NodeMcu) or STM32

支持的型号 https://tinygo.org/docs/reference/microcontrollers/ 1. 安装Go 2. 安装TinyGo&#xff0c;并添加环境变量 https://github.com/tinygo-org/tinygo/releases 3. VSCode配置&#xff0c;安装插件&#xff0c;选择设备 package mainimport ("machine"&q…

计算机视觉算法实战——基于YOLOv8的汽车试验场积水路段识别系统

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 引言&#xff1a;汽车试验场智能化管理的迫切需求 在现代汽车研发流程中&#xff0c;试验场作为验证车辆性…

One API:LLM API 管理 分发系统,github 24.2K Star!

随着人工智能领域的不断发展&#xff0c;国内外各大厂商纷纷推出了自己的 AI 大模型。面对 DeepSeek、OpenAI、Claude、腾讯元宝等众多平台的 API 接口差异&#xff0c;开发者常常需要花费大量时间调整代码、处理密钥管理与流量调控。One API 正是在这种背景下诞生&#xff0c;…

Android Settings 有线网设置界面优化

Android Settings 有线网设置界面优化 文章目录 Android Settings 有线网设置界面优化一、前言二、简单修改1、修改的EthernetSettings代码&#xff1a;2、有线网ip获取代码&#xff1a;3、AndroidManifest.xml定义有线网的Activity4、修改后界面&#xff1a; 三、其他1、有线网…

正则入门到精通

​ 一、正则表达式入门​ 正则表达式本质上是一串字符序列&#xff0c;用于定义一个文本模式。通过这个模式&#xff0c;我们可以指定要匹配的文本特征。例如&#xff0c;如果你想匹配一个以 “abc” 开头的字符串&#xff0c;正则表达式可以写作 “^abc”&#xff0c;其中 …

微信小程序基于Canvas实现头像图片裁剪(上)

序言 嘿&#xff0c;打工人混迹职场这么久&#xff0c;图片处理肯定都没少碰。不过咱说实话&#xff0c;大部分时候都是直接 “抄近道”&#xff0c;用现成的三方组件&#x1f60f;。就像我&#xff0c;主打一个会用工具&#xff0c;毕竟善用工具可是咱人类的 “超能力”&…

基于VMware的Cent OS Stream 8安装与配置及远程连接软件的介绍

1.VMware Workstation 简介&#xff1a; VMware Workstation&#xff08;中文名“威睿工作站”&#xff09;是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的操作系统&#xff0c;和进行开发、测试 、部署新的应用程序的最佳解决方案。…

Ubuntu环境基于Ollama部署DeepSeek+Open-Webui实现本地部署大模型-无脑部署

Ollama介绍 Ollama是一款简单好用的模型部署工具,不仅可以部署DeepSeek,市面上开源模型大部分都可以一键部署,这里以DeepSeek为例 官网 DeepSeek 版本硬件要求 安装Ollama 环境 sudo apt update sudo apt install curl sudo apt install lsof1.命令一键安装 在官网点击…

goto在Java中的用法

说明&#xff1a;goto 在一些编程语言&#xff08;如C语言&#xff09;中&#xff0c;是用来表示跳转的&#xff0c;即代码执行到此处跳转到对应位置继续执行。 举例 举个例子&#xff0c;如下&#xff0c;是一个双层嵌套循环。现在我需要代码在内层循环符合某条件时跳出双层…

Vue3+Vite+TypeScript+Element Plus开发-03.主页设计与router配置

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 文章目录 目录 系列文档目录 文章目录 前言 一、主页设计 二、配置代替别名 三、配置router 四、运行效果 五、参考文献 前言 本文将重点介绍如何使用…

无限滚动(Infinite Scroll)页面谷歌不收录!必须改回分页吗?

近三年&#xff0c;全球超过58%的网站采用无限滚动设计&#xff08;数据来源&#xff1a;PageTraffic 2023&#xff09; 谷歌官方数据显示&#xff0c;动态加载内容的索引失败率高达73%&#xff08;Google Webmaster Report 2022&#xff09;&#xff0c;而采用纯无限滚动的页…

Git相关笔记1 - 本地文件上传远程仓库

Git相关笔记 目录 Git相关笔记Git上传相关文件第一步创建一个仓库&#xff1a;第二步本地创建空文件夹&#xff1a;第三步开始在gitbush上传文件&#xff1a;解决外网网络连接的问题&#xff1a;中文文件的编码问题&#xff1a;参考资料 Git上传相关文件 第一步创建一个仓库&a…

如何计算财富自由所需要的价格?

写在前面&#xff1a;​【财富自由计算器】已上线&#xff0c;快算算财富自由要多少​ 多少钱&#xff0c;才能实现你的财富梦想&#xff1f; 需要多少&#xff0c;才能实现财务安全、财务独立&#xff0c;甚至财务自由&#xff1f; 看到结尾&#xff0c;你会很清楚地看到&…

thinkphp每条一级栏目中可自定义添加多条二级栏目,每条二级栏目包含多个字段信息

小程序客户端需要展示团购详情这种结构的内容,后台会新增多条套餐,每条套餐可以新增多条菜品信息,每条菜品信息包含菜品名称,价格,份数等字段信息,类似于购物网的商品多规格属性,数据表中以json类型存储,手写了一个后台添加和编辑的demo 添加页面 编辑页面(json数据…

深入解析ARM与RISC-V架构的Bring-up核心流程

深入解析ARM与RISC-V架构的Bring-up核心流程 作者&#xff1a;嵌入式架构探索者 | 2023年10月 引言 在嵌入式开发中&#xff0c;处理器的Bring-up&#xff08;启动初始化&#xff09;是系统运行的第一道门槛。ARM和RISC-V作为两大主流架构&#xff0c;其Bring-up流程既有共性…

Lettuce与Springboot集成使用

一、Lettuce核心优势与Spring Boot集成背景 Lettuce特性 基于Netty的非阻塞I/O模型&#xff0c;支持同步/异步/响应式编程线程安全&#xff1a;共享单连接实现多线程并发操作&#xff0c;性能衰减低原生支持Redis集群、哨兵、主从架构&#xff0c;自动重连机制保障高可用Spring…