点击上方“”,选择加""或“”
重磅干货,第一时间送达
输
可以叫我黄同学(博客名:Huang Supreme),应用统计硕士,爱写一些技术博客,旨在用通俗易懂的写作风格,帮助大家学好知识!
本文针对一些粉丝的工作需求,有时需要处理这些文件。所以我写了一篇文章集供大家参考。整篇文章包括三章:Python使用openpyxl操作excel、python使用PyPDF2和pdfplumber操作pdf、python使用python-docx操作word。这篇文章是第二章。
全文已整理为pdf,可按文末指引获得。
???
???
???
1)利用pdfplumber提取文字 ???
2)利用pdfplumber提取表格并写入excel ???
???
1)分割合并pdf ???
① 合并pdf ???
② 拆分pdf ???
2)旋转和排序pdf ???
① 旋转pdf ???
② 排序pdf ???
???
1)批量加水印 ???
2)批量加密解密 ???
① 加密pdf ???
② 解密pdf并保存为未加密的pdf
上下滚动查看更多
1、PyPDF2和pdfplumber库介绍
PyPDF2官网:PyPDF2官网(https://pythonhosted.org/PyPDF2/),可以更好的读、写、分、合并PDF文件;
pdfplumber官网:pdfplumber官网(https://github.com/jsvine/pdfplumber),能读得更好PDF文件内容及提取PDF中的表格;
这两个库不属于python需要单独安装标准库;
2、python提取PDF文字内容
1)利用pdfplumber提取文字
importPyPDF2 importpdfplumber withpdfplumber.open("综合分析餐饮企业.pdf")asp: page=p.pages[2] print(page.extract_text())
结果如下:
2)利用pdfplumber提取表格并写入excel
extract_table():如果一页有表格;
extract_tables():如果一页有多个表格;
importPyPDF2 importpdfplumber fromopenpyxlimportWorkbook withpdfplumber.open("综合分析餐饮企业.pdf")asp: page=p.pages[4] table=page.extract_table() print(table) workbook=Workbook() sheet=workbook.active forrowintable: ifnot"".join()=="" sheet.append(row) workbook.save(filename="新pdf.xlsx")
结果如下:缺陷:可见这里提取的表格有很多空行。如何去除这些空行?判断:将列表中的每个元素连接成一个字符串。如果还是空字符串,那一定是空行。
importPyPDF2 importpdfplumber fromopenpyxlimportWorkbook withpdfplumber.open("综合分析餐饮企业.pdf")asp: page=p.pages[4] table=page.extract_table() print(table) workbook=Workbook() sheet=workbook.active forrowintable: ifnot"".join([str(i)foriinrow])=="": sheet.append(row) workbook.save(filename="新pdf.xlsx")
结果如下:
3、PDF合并页面的排序和旋转
1)分割合并df
① 合并pdf
首先,我们有如下几个文件,可以发现这里共有三个PDF文件需要我们合并。同时可以发现他们的文件名都是有规律的(如果文件名,没有先后顺序,我们合并起来就没有意义了。)代码如下:
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_writer = PdfFileWriter()
for i in range(1,len(os.listdir(r"G:\6Tipdm\7python办公自动化\concat_pdf"))+1):
print(i*50+1,(i+1)*50)
pdf_reader = PdfFileReader("G:\\6Tipdm\\7python办公自动化\\concat_pdf\{}-{}.pdf".format(i*50+1,(i+1)*50))
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
with open("G:\\6Tipdm\\7python办公自动化\\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:\6Tipdm\7python办公自动化\concat_pdf\时间序列.pdf")
for page in range(pdf_reader.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(f"G:\\6Tipdm\\7python办公自动化\\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:\6Tipdm\7python办公自动化\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:\\6Tipdm\\7python办公自动化\\concat_pdf\\旋转.pdf", "wb") as out:
pdf_writer.write(out)
"""
上述代码中,我们循环遍历了这个pdf,对于偶数页我们逆时针旋转90°,对于奇数页我们顺时针旋转90°;
注意:旋转的角度只能是90的倍数;
"""
其中一页效果展示如下:
② 排序pdf
需求:我们有一个PDF文件,我们需要倒序排列,应该怎么做呢?首先,我们来看python中,怎么倒叙打印一串数字,如下图所示。那么倒序排列一个pdf,思路同上,代码如下:
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"G:\6Tipdm\7python办公自动化\concat_pdf\时间序列.pdf")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()-1, -1, -1):
pdf_writer.addPage(pdf_reader.getPage(page))
with open("G:\\6Tipdm\\7python办公自动化\\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:\6Tipdm\7python办公自动化\concat_pdf\水印.pdf")
water_page = water.getPage(0)
pdf_reader = PdfFileReader(r"G:\6Tipdm\7python办公自动化\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:\\6Tipdm\\7python办公自动化\\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:\6Tipdm\7python办公自动化\concat_pdf\时间序列.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:\\6Tipdm\\7python办公自动化\\concat_pdf\\时间序列.pdf", "wb") as out:
pdf_writer.write(out)
结果如下:
② 解密pdf并保存为未加密的pdf
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"G:\6Tipdm\7python办公自动化\concat_pdf\时间序列.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:\\6Tipdm\\7python办公自动化\\concat_pdf\\未加密的时间序列.pdf", "wb") as out:
pdf_writer.write(out)
结果如下:
在「」公众号后台回复:即可下载全网第一份OpenCV扩展模块教程中文版,涵盖等二十多章内容。
在「」公众号后台回复:即可下载包括等31个视觉实战项目,助力快速学校计算机视觉。
在「」公众号后台回复:即可下载含有个基于实现20个,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。在群内发送广告,否则会请出群,谢谢理解~