社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python自动化办公系列之Python操作PDF

小白学视觉 • 3 年前 • 206 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达




作者介绍:

大家可以叫我黄同学(博客名:Huang Supreme),一个应用统计硕士,爱好写一些技术博客,志在用通俗易懂的写作风格,帮助大家学到知识,学好知识!


【作者导语】本文是鉴于有些粉丝的工作需求,有时候需要遇到这些文件的处理。因此,我写了一个文章集合,供大家参考。全篇包括三个章节,分别为:Python使用openpyxl操作excelpython使用PyPDF2和pdfplumber操作pdfpython使用python-docx操作word。本篇为第二章节。



全文已整理为pdf,可按文末指引获取。



本章目录


章节二

  python使用PyPDF2和pdfplumber操作pdf     

   

1、PyPDF2和pdfplumber库介绍     


2、python提取PDF文字内容        

   1)利用pdfplumber提取文字        

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


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

   1)分割及合并pdf          

       ① 合并pdf          

        ② 拆分pdf        

   2)旋转及排序pdf          

       ① 旋转pdf          

        ② 排序pdf     


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

   1)批量加水印        

   2)批量加密、解密          

       ① 加密pdf          

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

上下滚动查看更多


章节二:python使用PyPDF2和pdfplumber操作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提取文字
import PyPDF2
import pdfplumber

with pdfplumber.open("餐饮企业综合分析.pdf"as p:
    page = p.pages[2]
    print(page.extract_text())

结果如下:

2)利用pdfplumber提取表格并写入excel
  • extract_table():如果一页有一个表格;
  • extract_tables():如果一页有多个表格;
import PyPDF2
import pdfplumber
from openpyxl import Workbook

with pdfplumber.open("餐饮企业综合分析.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() == ""
            sheet.append(row)
    workbook.save(filename = "新pdf.xlsx")

结果如下:缺陷:可以看到,这里提取出来的表格有很多空行,怎么去掉这些空行呢?判断:将列表中每个元素都连接成一个字符串,如果还是一个空字符串那么肯定就是空行。

import PyPDF2
import pdfplumber
from openpyxl import Workbook

with pdfplumber.open("餐饮企业综合分析.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)
    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:\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)  

结果如下:

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129664
 
206 次点击