python办公自动化:pdf和word
2021-08-26 本文已影响0人
弦好想断
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