python操作word和pdf

  • 一、python操作word
    • 1、python新建word文档及常规操作
    • 2、python对word的字体设置
    • 3、python向word插入图片和表格
    • 4、python设置word页眉页脚
    • 5、python操作word实战
  • 二、python操作pdf
    • 1、python读取pdf内容
      • 1.1、python读取pdf文字内容
      • 1.2、python读取pdf表格内容
      • 1.3、python读取pdf图片内容
      • 1.4、python将pdf内容转为图片
    • 2、python操作pdf批量拆分与合并
    • 3、python操作pdf加密与解密
    • 4、python操作pdf添加水印
    • 5、python操作pdf转word

一、python操作word

1、python新建word文档及常规操作

# python操作word
# 导入库
from docx import Document# 新建空白文档
doc_1 = Document()# 添加标题(0相当于文章的题目,默认级别是1,级别范围为0-9)
doc_1.add_heading('新建空白文档标题,级别为0',level = 0)
doc_1.add_heading('新建空白文档标题,级别为1',level = 1)
doc_1.add_heading('新建空白文档标题,级别为2',level = 2)# 新增段落
paragraph_1 = doc_1.add_paragraph('这是第一段文字的开始\n请多多关照!')
# 加粗
paragraph_1.add_run('加粗字体').bold = True
paragraph_1.add_run('普通字体')
# 斜体
paragraph_1.add_run('斜体字体').italic =True# 新段落(当前段落的下方)
paragraph_2 = doc_1.add_paragraph('新起的第二段文字。')# 新段落(指定端的上方)
prior_paragraph = paragraph_1.insert_paragraph_before('在第一段文字前插入的段落')# 添加分页符(可以进行灵活的排版)
doc_1.add_page_break()
# 新段落(指定端的上方)
paragraph_3 = doc_1.add_paragraph('这是第二页第一段文字!')# 保存文件(当前目录下)
doc_1.save('doc_1.docx')

2、python对word的字体设置

'''字体设置1.py'''
#导入库
from docx import Document
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPEdocument = Document() # 新建docx文档# 设置宋体字样式
style_font = document.styles.add_style('宋体', WD_STYLE_TYPE.CHARACTER)
style_font.font.name = '宋体'
document.styles['宋体']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')# 设置楷体字样式
style_font = document.styles.add_style('楷体', WD_STYLE_TYPE.CHARACTER)
style_font.font.name = '楷体'
document.styles['楷体']._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体')# 设置华文中宋字样式
style_font = document.styles.add_style('华文中宋', WD_STYLE_TYPE.CHARACTER)
style_font.font.name = '华文中宋'
document.styles['华文中宋']._element.rPr.rFonts.set(qn('w:eastAsia'), u'华文中宋')paragraph1 = document.add_paragraph() # 添加段落
run = paragraph1.add_run(u'aBCDefg这是中文', style='宋体') # 设置宋体样式font = run.font #设置字体
font.name = 'Cambira' # 设置西文字体
paragraph1.add_run(u'aBCDefg这是中文', style='楷体').font.name = 'Cambira'
paragraph1.add_run(u'aBCDefg这是中文', style='华文中宋').font.name = 'Cambira'document.save('字体设置1.docx')'''字体设置2.py'''
#导入库
from docx import Document
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE#定义字体设置函数
def font_setting(doc,text,font_cn):style_add = doc.styles.add_style(font_cn, WD_STYLE_TYPE.CHARACTER)style_add.font.name = font_cndoc.styles[font_cn]._element.rPr.rFonts.set(qn('w:eastAsia'), font_cn)par = doc.add_paragraph()text = par.add_run(text, style=font_cn)doc = Document()
a = '小朋友 你是否有很多问号'
b = '为什么 别人在那看漫画'
c = '我却在学画画 对着钢琴说话'font_setting(doc,a,'宋体')
font_setting(doc,b,'华文中宋')
font_setting(doc,c,'黑体')doc.save('字体设置2.docx')

3、python向word插入图片和表格

#导入库
import docx
from docx import Document
from docx.shared import Inches#打开文档
doc_1 = Document('周杰伦.docx')   #上面脚本存储的文档
#新增图片
doc_1.add_picture('python.png',width=Inches(1.0), height=Inches(1.0))# 创建3行1列表格
table1 = doc_1.add_table(rows=2, cols=1)
table1.style='Medium Grid 1 Accent 1'  #表格样式很多种,如,Light Shading Accent 1等# 修改第2行第3列单元格的内容为营口
table1.cell(0, 0).text = '营口'
# 修改第3行第4列单元格的内容为人民
table1.rows[1].cells[0].text = '人民'# 在表格底部新增一行
row_cells = table1.add_row().cells
# 新增行的第一列添加内容
row_cells[0].text = '加油'doc_1.save('周杰伦为营口加油.docx')

4、python设置word页眉页脚

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENTdocument = Document() # 新建文档header = document.sections[0].header # 获取第一个节的页眉
print('页眉中默认段落数:', len(header.paragraphs))
paragraph = header.paragraphs[0] # 获取页眉的第一个段落
paragraph.add_run('这是第一节的页眉') # 添加页面内容
footer = document.sections[0].footer # 获取第一个节的页脚
paragraph = footer.paragraphs[0] # 获取页脚的第一个段落
paragraph.add_run('这是第一节的页脚') # 添加页脚内容'''在docx文档中又添加了2个节,共计3个节,页面和页脚会显示了“与上一节相同”。
如果不使用上一节的内容和样式要将header.is_linked_to_previous的属性或footer.is_linked_to_previous的属性设置为False,
用于解除“链接上一节页眉”或者“链接上一节页脚”。'''
document.add_section() # 添加一个新的节
document.add_section() # 添加第3个节
header = document.sections[1].header # 获取第2个节的页眉
header.is_linked_to_previous = False # 不使用上节内容和样式#对齐设置
header = document.sections[1].header # 获取第2个节的页眉
header.is_linked_to_previous = False # 不使用上节内容和样式
paragraph = header.paragraphs[0]
paragraph.add_run('这是第二节的页眉')
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置页眉居中对齐
document.sections[1].footer.is_linked_to_previous = False
footer.paragraphs[0].add_run('这是第二节的页脚') # 添加第2节页脚内容
footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置第2节页脚居中对齐
header = document.sections[2].header # 获取第3个节的页眉
header.is_linked_to_previous = False # 不使用上节的内容和样式
paragraph = header.paragraphs[0] # 获取页眉中的段落
paragraph.add_run('这是第三节的页眉')
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置页眉右对齐
document.sections[2].footer.is_linked_to_previous = False
footer.paragraphs[0].add_run('这是第三节的页脚') # 添加第3节页脚内容
footer.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置第3节页脚右对齐
document.save('页眉页脚1.docx') # 保存文档

5、python操作word实战

(待补充)

二、python操作pdf

1、python读取pdf内容

1.1、python读取pdf文字内容

#  提取文字内容
# python操作pdf
import os
import pdfplumber# 切换工作目录
third_path = r"D:\jupyternotebook\office-automation-main\Task03-Python与Word和PDF"
os.chdir(third_path)
os.getcwd()def extract_text_info(filepath,i):"""提取PDF中的文字@param filepath:文件路径@return:"""with pdfplumber.open(filepath) as pdf:page = pdf.pages[i]print(page.extract_text())filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
filepath = os.path.join(os.getcwd(), filename)
# 提取文字内容
extract_text_info(filepath,0)
extract_text_info(filepath,1)
extract_text_info(filepath,3)



1.2、python读取pdf表格内容

import os
import pandas as pd
import pdfplumberdef extract_table_info(filepath):"""提取PDF中的图表数据@param filepath:@return:"""with pdfplumber.open(filepath) as pdf:# 获取第7页数据page = pdf.pages[6]# 如果一页有多个表格,对应的数据是一个三维数组tables_info = page.extract_tables()for index in range(len(tables_info)):# 设置表格的第一行为表头,其余为数据df_table = pd.DataFrame(tables_info[index][1:], columns=tables_info[index][0])df_table.to_csv('dmeo1.csv', index=False, encoding='gbk')filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
filepath = os.path.join(os.getcwd(), filename)
# 提取表格内容
extract_table_info(filepath)

1.3、python读取pdf图片内容

# 提取pdf中的图片
import os
import re
import fitzdef extract_pic_info(filepath, pic_dirpath):"""提取PDF中的图片filepath:pdf文件路径pic_dirpath:要保存的图片目录路径"""if not os.path.exists(pic_dirpath):os.makedirs(pic_dirpath)# 使用正则表达式来查找图片check_XObject = r"/Type(?= */XObject)"check_Image = r"/Subtype(?= */Image)"img_count = 0"""1. 打开pdf,打印相关信息"""pdf_info = fitz.open(filepath)# 1.16.8版本用法 xref_len = doc._getXrefLength()# 最新版本xref_len = pdf_info.xref_length()# 打印PDF的信息print("文件名:{}, 页数: {}, 对象: {}".format(filepath, len(pdf_info), xref_len-1))"""2. 遍历PDF中的对象,遇到是图像才进行下一步,不然就continue"""for index in range(1, xref_len):# 1.16.8版本用法 text = doc._getXrefString(index)# 最新版本text = pdf_info.xref_object(index)is_XObject = re.search(check_XObject, text)is_Image = re.search(check_Image, text)# 如果不是对象也不是图片,则不操作if is_XObject or is_Image:img_count += 1# 根据索引生成图像pix = fitz.Pixmap(pdf_info, index)pic_filepath = os.path.join(pic_dirpath, 'img_' + str(img_count) + '.png')"""pix.size 可以反映像素多少,简单的色素块该值较低,可以通过设置一个阈值过滤。以阈值 10000 为例过滤"""# if pix.size < 10000:#     continue"""三、 将图像存为png格式"""if pix.n >= 5:# 先转换CMYKpix = fitz.Pixmap(fitz.csRGB, pix)# 存为PNGpix.save(pic_filepath)filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
filepath = os.path.join(os.getcwd(), filename)
pic_dirpath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告【文中图片】')
# 提取图片内容
extract_pic_info(filepath, pic_dirpath)

1.4、python将pdf内容转为图片

2、python操作pdf批量拆分与合并

在日常工作中,有的时候由于邮件附件大小限制、保密等原因需要将一个较大的pdf文件拆分为多个

import os
from PyPDF2 import PdfFileWriter, PdfFileReaderdef split_pdf(filename, filepath, save_dirpath, step=10):"""拆分PDF为多个小的PDF文件,filename:文件名filepath:文件路径save_dirpath:保存小的PDF的文件路径step: 每step间隔的页面生成一个文件"""if not os.path.exists(save_dirpath):os.mkdir(save_dirpath)pdf_reader = PdfFileReader(filepath)# 读取每一页的数据pages = pdf_reader.getNumPages()for page in range(0, pages, step):pdf_writer = PdfFileWriter()# 拆分pdf,每 step 页的拆分为一个文件for index in range(page, page+step):if index < pages:pdf_writer.addPage(pdf_reader.getPage(index))# 保存拆分后的小文件save_path = os.path.join(save_dirpath, filename+str(int(page/step)+1)+'.pdf')print(save_path)with open(save_path, "wb") as out:pdf_writer.write(out)print("文件已成功拆分,保存路径为:"+save_dirpath)filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
filepath = os.path.join(os.getcwd(), filename)
save_dirpath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告【拆分】')
split_pdf(filename, filepath, save_dirpath, step=10)


当需要查阅原文件时又需要对pdf文件进行批量合并

import os
from PyPDF2 import PdfFileReader, PdfFileWriterdef concat_pdf(filename, read_dirpath, save_filepath):"""合并多个PDF文件filename:文件名read_dirpath:要合并的PDF目录save_filepath:合并后的PDF文件路径"""pdf_writer = PdfFileWriter()# 对文件名进行排序list_filename = os.listdir(read_dirpath)list_filename.sort(key=lambda x: int(x[:-4].replace(filename, "")))for filename in list_filename:print(filename)filepath = os.path.join(read_dirpath, filename)# 读取文件并获取文件的页数pdf_reader = PdfFileReader(filepath)pages = pdf_reader.getNumPages()# 逐页添加for page in range(pages):pdf_writer.addPage(pdf_reader.getPage(page))# 保存合并后的文件with open(save_filepath, "wb") as out:pdf_writer.write(out)print("文件已成功合并,保存路径为:"+save_filepath)filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
read_dirpath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告【拆分】')
save_filepath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告-合并后.pdf')
concat_pdf(filename, read_dirpath, save_filepath)

3、python操作pdf加密与解密

pdf加密

import os
from PyPDF2 import PdfFileReader, PdfFileWriterdef encrypt_pdf(filepath, save_filepath, passwd):"""PDF文档加密filepath:PDF文件路径save_filepath:加密后的文件保存路径passwd:密码"""pdf_reader = PdfFileReader(filepath)pdf_writer = PdfFileWriter()for page_index in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page_index))# 添加密码pdf_writer.encrypt(passwd)with open(save_filepath, "wb") as out:pdf_writer.write(out)filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
filepath = os.path.join(os.getcwd(), filename)
save_filepath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告-加密后.pdf')
# 文档加密
encrypt_pdf(filepath, save_filepath, passwd='XXX')

pdf解密

def decrypt_pdf(filepath, save_filepath, passwd):"""解密 PDF 文档并且保存为未加密的 PDF@param filepath:PDF文件路径@param save_filepath:解密后的文件保存路径@param passwd:密码@return:"""pdf_reader = PdfFileReader(filepath)# PDF文档解密pdf_reader.decrypt(passwd)pdf_writer = PdfFileWriter()for page_index in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page_index))with open(save_filepath, "wb") as out:pdf_writer.write(out)filename = '易方达中小盘混合型证券投资基金2020年中期报告-加密后.pdf'
filepath = os.path.join(os.getcwd(), filename)
save_filepath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告-解密后.pdf')
# 文档解密
decrypt_pdf(filepath, save_filepath, passwd='xxx')

4、python操作pdf添加水印

出于数据保密、知识产权保护等需要,经常还会用到的一个功能是添加水印
首先通过word创建一个水印文档、并另存为pdf文件(believe448.pdf)

# 添加水印
import os
from copy import copy
from PyPDF2 import PdfFileReader, PdfFileWriterdef add_watermark(filepath, save_filepath, watermark_filepath):"""添加水印filepath:PDF文件路径save_filepath:最终的文件保存路径watermark_filepath:水印PDF文件路径""""""读取PDF水印文件"""watermark = PdfFileReader(watermark_filepath)watermark_page = watermark.getPage(0)pdf_reader = PdfFileReader(filepath)pdf_writer = PdfFileWriter()for page_index in range(pdf_reader.getNumPages()):current_page = pdf_reader.getPage(page_index)# 封面页不添加水印if page_index == 0:new_page = current_pageelse:new_page = copy(watermark_page)new_page.mergePage(current_page)pdf_writer.addPage(new_page)# 保存水印后的文件with open(save_filepath, "wb") as out:pdf_writer.write(out)filename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
filepath = os.path.join(os.getcwd(), filename)
save_filepath = os.path.join(os.getcwd(), '易方达中小盘混合型证券投资基金2020年中期报告-水印.pdf')
watermark_filepath = os.path.join(os.getcwd(), 'believe448.pdf')
# 添加水印
add_watermark(filepath, save_filepath, watermark_filepath)

5、python操作pdf转word

在日常工作中经常遇到的一类需求就是pdf文档转word了。虽然网上有些免费的转换工具,一方面不安全,有文件泄露风险,另一方面有免费转换的次数限制。

from pdf2docx import Converterfilename = '易方达中小盘混合型证券投资基金2020年中期报告.pdf'
pdf_filepath = os.path.join(os.getcwd(), filename)
docx_file = os.getcwd()
cv = Converter(pdf_filepath)
cv.convert(docx_file, start=0, end=None)
cv.close()

参考文档:https://github.com/datawhalechina/office-automation

【python操作word和pdf】相关推荐

  1. python操作word、pdf问题汇总

    问题1. pyPdf2操作pdf出现: 'latin-1' codec can't encode characters in position 8-9: ordinal not in range(25 ...

  2. python操作word、ppt、pdf

    1.python操作word 相关概念:目前使用的Word文件后缀名一般为.docx 可以实现的功能:官方文档 需要导入的库: lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还 ...

  3. python操作word文档(python-docx)

    python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...

  4. Python从Word/PPT/PDF中抽取图片

    Python从Word/PPT/PDF中抽取图片 PS 1:也是从网上各个帖子中学习的代码,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 2:本次设计意在用pyinstaller ...

  5. PyPDF2--如何使用python操作你的PDF文档

    PyPDF2–如何使用python操作你的PDF文档 前言 大家好!最近想操作一下PDF文档,总是收费,于是浅尝辄止地了解了一下python当中的PyPDF2这个库.借助本篇博客总结了一下个人所学到的 ...

  6. Python操作word基础

    在办公自动化的操作,往往可能会存在Word的操作.因为在办公 时,对文档的操作是必不可少的.而在Python操作Word时,可以 使用一个三方的模块库 Python-docx 安装 pip insta ...

  7. python入门教程2word-使用python操作word

    前言 最近工作中,需要将查询的一段时间的数据可视化,并导出为word格式.由于对word操作不熟悉,查阅了一下相关文档,这里简要记录一下如何使用python操作word. 说明 该代码记录了对word ...

  8. python入门教程2word-入门干货:Python操作Word文件经验分享

    原标题:入门干货:Python操作Word文件经验分享 导读:Microsoft Word在当前使用中是占有巨大优势的文字处理器,这使得Word专用的档案格式Word 文件(.docx)成为事实上最通 ...

  9. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

最新文章

  1. uestc 250 数位dp(水)
  2. 求职Python开发,面试官最喜欢问的几个问题
  3. c# 第六课 linq
  4. slack 国内 android,使用Slack Api登录,Android
  5. Java多线程-线程通信
  6. c++ 箭头符号怎么打_焊接图纸符号标注图解示例,焊接符号标注实例及方法
  7. NSURLSessionDownloadTask实现大文件下载
  8. Spring4.x学习(1)
  9. 子元素应该margin-top为何会影响父元素【转】
  10. MVC文件上传07-使用客户端jQuery-File-Upload插件和服务端Backload组件裁剪上传图片...
  11. MySQL中的“<=>”操作符
  12. 算法设计与分析第六章习题解答与学习指导(第2版)屈婉婷 刘田 张立昂 王捍贫编著 清华大学出版社
  13. 下载速度15MB/s,度盘新版本?
  14. android浏览器!6年菜鸟开发面试字节跳动安卓研发岗,大厂面经合集
  15. 2022年度总结:除旧迎新,继往开来!
  16. (原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut)
  17. Python错误日志
  18. matlab 经典pid,经典-先进PID控制及其MATLAB仿真(刘金锟)-315页.pdf
  19. 微信安卓最新 7.0.22 版本来了,赶紧抢先内测体验吧!美颜,连麦,刷礼物统统来了...
  20. ros::spin() 和 ros::spinOnce() 区别及用法

热门文章

  1. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
  2. 健康档案管理系统-毕业设计-SSM框架-SpringBoot2.X-VUE-Antd-MyBatis-Shiro
  3. 熟男,好男,傻男,超男?-------…
  4. v-show和v-if有什么区别?使用场景分别是什么?
  5. qt中制作添加 .ts 翻译文件
  6. rk3399 rv1126上使用wk2124
  7. SDWAN:直接互联网接入 (DIA)
  8. 沈南鹏对话郎平:我靠什么熬过两次至暗时刻-1
  9. 微信小程序播放音频,ios静音状态下无声音、音频播放创建多个等问题
  10. win10系统dnf安装不上服务器失败,win10 1903系统dnf图表系统组建失败的修复方法