python办公自动化:pdf和word

python 使用 PyPDF2 和 pdfplumber 操作pdf

  • PyPDF2 官网:https://pythonhosted.org/PyPDF2/
  • PyPDF2 可以更好的读取、写入、分割、合并 PDF 文件;
  • pdfplumber 官网:https://github.com/jsvine/pdfplumber
  • pdfplumber 可以更好地读取 PDF 文件内容和提取 PDF 中的表格;
  • 查找某个包 anaconda search -t conda pdfplumber
    下载某个包 anaconda show package

python 提取 PDF 文字内容

1)利用 pdfplumber 提取文字

import PyPDF2 
import pdfplumber 
with pdfplumber.open("test.pdf") as p: 
page = p.pages[2] 
print(page.extract_text())#打印第3页所有文字

2)利用 pdfplumber 提取表格并写入 excel

  • extract_table():如果一页有一个表格;
  • extract_tables():如果一页有多个表格;
import PyPDF2 
import pdfplumber 
from openpyxl import Workbook 
with pdfplumber.open("test.pdf") as p: 
page = p.pages[4] 
table = page.extract_table() 
print(table) 
workbook = Workbook()
sheet = workbook.active 
for row in table: 
  if not "".join([str(i) for i in row]) == "":
  #将列表中每个元素都连接成一个字符串,如果还是一个空字符串那么肯定就是空行。
    sheet.append(row)
  #sheet.append(row) #直接append这里提取出来的表格有很多空行
workbook.save(filename = "新pdf.xlsx")

3、PDF 合并及页面的排序和旋转

1)分割及合并 pdf

① 合并 pdf
首先,我们有如下几个文件,可以发现这里共有三个 PDF 文件需要我们合并。同时可以发现他们的文件名都是有规律的(如果文件名,没有先后顺序,我们合并起来就没有意义了。)

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_writer = PdfFileWriter() 
for i in range(1,len(os.listdir(r"G:\concat_pdf"))+1):
  print(i*50+1,(i+1)*50) 
  pdf_reader = PdfFileReader("G:\concat_pdf\{}-{}.pdf".format(i*50+1,(i+1)*50))  
  #这里是指文件名的格式为51-100,101-150、151-200
  for page in range(pdf_reader.getNumPages()):
    pdf_writer.addPage(pdf_reader.getPage(page)) 
with open("G:\concat_pdf\merge.pdf", "wb") as out: 
  pdf_writer.write(out)

② 拆分 pdf
这里有一个“时间序列.pdf”的文件,共 3 页,我们将其每一页存为一个 PDF 文件。

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\时间序列.pdf") 
for page in range(pdf_reader.getNumPages()): 
  pdf_writer = PdfFileWriter() 
  pdf_writer.addPage(pdf_reader.getPage(page)) 
  with open(f"G:\concat_pdf\\{page}.pdf", "wb") as out: 
    pdf_writer.write(out)

2)旋转及排序 pdf

① 旋转 pdf

  • .rotateClockwise(90 的倍数):顺时针旋转 90 度
  • .rotateCounterClockwise(90 的倍数):逆时针旋转 90 度
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"G:\concat_pdf\时间序列.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
  if page % 2 == 0: 
    rotation_page = pdf_reader.getPage(page).rotateCounterClockwise(90) 
  else: 
    rotation_page = pdf_reader.getPage(page).rotateClockwise(90) 
  pdf_writer.addPage(rotation_page) 
  with open("G:\concat_pdf\旋转.pdf", "wb") as out: 
    pdf_writer.write(out)
""" 
上述代码中,我们循环遍历了这个 pdf,对于偶数页我们逆时针旋转 90°,对于奇数页我
们顺时针旋转 90°; 注意:旋转的角度只能是 90 的倍数;
"""

② 排序 pdf
PDF 文件需要倒序排列,应该怎么做呢?

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\时间序列.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()-1, -1, -1): 
#这里用到range,很巧妙
  pdf_writer.addPage(pdf_reader.getPage(page)) 
  with open("G:\concat_pdf\倒序.pdf", "wb") as out:
    pdf_writer.write(out)

4、pdf 批量加水印及加密、解密

1)批量加水印

from PyPDF2 import PdfFileReader, PdfFileWriter 
from copy import copy 
water = PdfFileReader(r"G:\concat_pdf\水印.pdf") 
water_page = water.getPage(0) 
pdf_reader = PdfFileReader(r"G:\concat_pdf\aa.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
  my_page = pdf_reader.getPage(page) 
  new_page = copy(water_page) 
  new_page.mergePage(my_page) 
  pdf_writer.addPage(new_page) 
  with open("G:\concat_pdf\\添加水印后的 aa.pdf", "wb") as out: 
    pdf_writer.write(out) 
""" 
这里有一点需要注意:进行 pdf 合并的时候,我们希望“水印”在下面,
文字在上面,因此 是“水印”.mergePage(“图片页”)
"""

2)批量加密、解密

  • 这里的“解密”,是在知道 pdf 的密码下,去打开 pdf,而不是暴力破解;
    ① 加密 pdf
from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\test.pdf") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
pdf_writer.addPage(pdf_reader.getPage(page)) 
# 添加密码
pdf_writer.encrypt("a123456")
with open("G:\concat_pdf\\test.pdf", "wb") as out: 
pdf_writer.write(out)

② 解密 pdf 并保存为未加密的 pdf

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"G:\concat_pdf\test.pdf") 
# 解密
pdf pdf_reader.decrypt("a123456") 
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
  pdf_writer.addPage(pdf_reader.getPage(page))
  with open("G:\concat_pdf\未加密.pdf", "wb") as out: 
    pdf_writer.write(out)

python 使用 python-docx 操作 word

1、python-docx 库介绍

  • 该模块儿可以创建、修改 Word(.docx)文件;
  • 此模块儿不属于 python 标准库,需要单独安装;
  • python-docx 使用官网: https://python-docx.readthedocs.io/en/latest/
  • 我们在安装此模块儿使用的是 pip install python-docx,但是在导入的时候是 import
    docx;

2、Python 读取 Word 文档内容

  • 注意:每进行一个操作,必须保存一下,否则等于白做;
    1)word 文档结构介绍

2)python-docx 提取文字和文字块儿
① python-docx 提取文字
有一个这样的 docx 文件,提取其中的文字

from docx import Document 
doc = Document(r"G:\concat_word\test1.docx") 
print(doc.paragraphs) 
for paragraph in doc.paragraphs: 
  print(paragraph.text)

② python-docx 提取文字块儿

from docx import Document 
doc = Document(r"G:\concat_word\test1.docx") 
print(doc.paragraphs) 
for i range(len((doc.paragraphs)):
#这里按段落进行循环
  paragraph = doc.paragraphs[i] 
  runs = paragraph.runs 
  print(runs) 
  for run in paragraph.runs: 
    print(run.text)

3)利用 Python 向 Word 文档写入内容

from docx import Document 
doc = Document(r"G:\concat_word\test1.docx") 
# print(doc.add_heading("一级标题", level=1)) 添加一级标题的时候出错,还没有解决!
paragraph1 = doc.add_paragraph("这是一个段落") 
paragraph2 = doc.add_paragraph("这是第二个段落") 
doc.save(r"G:\concat_word\test1.docx") 
""" 
添加段落的时候,赋值给一个变量,方便我们后面进行格式调整;
"""
  • 读取word文档中的表格内容
import docx

fn = r'D:\长恨歌.docx'
doc = docx.Document(fn)

# 按段落读取全部数据
for paragraph in doc.paragraphs:
    print(paragraph.text)

# 按表格读取全部数据
for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            print(cell.text)

table_num = len(doc.tables)
# 获取文档的表格个数
print(table_num)

table_0 = doc.tables[0]
# 选取第一个表
table_rows = len(table_0.rows)
# 获取第一个表的行数
print(table_rows)

tab = doc.tables[0].rows[0].cells[0]
# 获取第一张表第一行第一列数据
print(tab.text)

par = doc.paragraphs[2]
# 读取第三段数据
print(par.text)
  • 批量提取word中表格内容
import docx
import pandas as pd
from docx import Document #导入库
path = "word2.docx" #文件路径
document = Document(path) #读入文件
tables = document.tables #获取文件中的表格集
table = tables[0]#获取文件中的第一个表格

for table in tables:
    columns = [table.cell(0,c).text for c in range(len(table.columns))]#获取表头 
#     print(columns)
    values = []
    for i in range(1,len(table.rows)):#从表格第二行开始循环读取表格数据
        result = [table.cell(i,c).text for c in range(len(table.columns))]# 自动获取每一行的数据
        #cell(i,0)表示第(i+1)行第1列数据,以此类推
#         print(result)
        values.append(result)
    print(values)
    print(columns)
    print(pd.DataFrame(data = values,columns=columns))

在操作word这块感觉并不怎么实用,等遇到问题了再加,也可以参考
https://juejin.cn/post/6868073137263607821

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容