python 使用 PyPDF2 和 pdfplumber 操 作 pdf

1. PyPDF2 和 pdfplumber 库安装

  • PyPDF2 官网:https://pythonhosted.org/PyPDF2/
  • PyPDF2 可以更好的读取、写入、分割、合并 PDF 文件;
  • pdfplumber 官网:https://github.com/jsvine/pdfplumber
  • pdfplumber 可以更好地读取 PDF 文件内容和提取 PDF 中的表格;
  • 这两个库不属于 python 标准库,都需要单独安装;

2. python 提取 PDF 文字内容

2 .1 利用 pdfplumber 提取文字

import PyPDF2
import pdfplumber
with pdfplumber.open("test.pdf") as p:
 page = p.pages[2]
 print(page.extract_text())

2 .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[24]
   table = page.extract_table()
   print(table)
   workbook = Workbook()
   sheet = workbook.active
   for row in table:
      sheet.append(row)
   workbook.save(filename="新 pdf.xlsx")

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

import PyPDF2
import pdfplumber
from openpyxl import Workbook
with pdfplumber.open("test.pdf") as p:
   page = p.pages[24]
   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 合并及页面的排序和旋转

3.1 分割及合并 pdf

① 拆分 pdf
一个“test.pdf”的文件,将其每一页存为一个 PDF 文件。

from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\test.pdf")
for page in range(pdf_reader.getNumPages()):
   pdf_writer = PdfFileWriter()
   pdf_writer.addPage(pdf_reader.getPage(page))
   with open(f"D:\\PythonCode\\{page}.pdf", "wb") as out:
      pdf_writer.write(out)

② 合并 pdf
将被拆分的“test.pdf”文件重新合并为一个“merge.pdf”文件。

import os
from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_writer = PdfFileWriter()
for i in range(0,len(os.listdir(r"D:\PythonCode\test"))):
   print(i,i+1)
   pdf_reader = PdfFileReader("D:\\PythonCode\\test\{}.pdf".format(i,i+1))
   for page in range(pdf_reader.getNumPages()):
      pdf_writer.addPage(pdf_reader.getPage(page))
with open("D:\\PythonCode\\test\merge.pdf", "wb") as out:
   pdf_writer.write(out)

3.2 旋转及排序 pdf

① 旋转 pdf

  • .rotateClockwise(90 的倍数):顺时针旋转 90 度
  • .rotateCounterClockwise(90 的倍数):逆时针旋转 90 度
from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"D:\PythonCode\49.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("D:\\PythonCode\\旋转.pdf", "wb") as out:
      pdf_writer.write(out)
""" 
上述代码中,我们循环遍历了这个 pdf,对于偶数页我们逆时针旋转 90°,对于奇数页我
们顺时针旋转 90°; 注意:旋转的角度只能是 90 的倍数;
"""

② 排序 pdf

from PyPDF2 import PdfFileReader, PdfFileWriter 
pdf_reader = PdfFileReader(r"D:\PythonCode\merge.pdf")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()-1, -1, -1):
   pdf_writer.addPage(pdf_reader.getPage(page))
with open("D:\\PythonCode\\倒序.pdf", "wb") as out:
   pdf_writer.write(out)

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

4.1 批量加水印

from PyPDF2 import PdfFileReader, PdfFileWriter 
from copy import copy
water = PdfFileReader(r"D:\PythonCode\水印.pdf")
water_page = water.getPage(0)
pdf_reader = PdfFileReader(r"D:\PythonCode\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("D:\\PythonCode\\添加水印后的 aa.pdf", "wb") as out: pdf_writer.write(out)
""" 
这里有一点需要注意:进行 pdf 合并的时候,我们希望“水印”在下面,文字在上面,因
此 是“水印”.mergePage(“图片页”)
"""

4.2 批量加密、解密

① 加密 pdf

from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\test.pdf")
pdf_writer = PdfFileWriter() 
for page in range(pdf_reader.getNumPages()): 
   pdf_writer.addPage(pdf_reader.getPage(page))
   # 添加密码
pdf_writer.encrypt("hy123456")
with open("D:\\PythonCode\\test.pdf", "wb") as out:
   pdf_writer.write(out)

在这里插入图片描述
② 解密 pdf 并保存为未加密的 pdf

from PyPDF2 import PdfFileReader, PdfFileWriter
pdf_reader = PdfFileReader(r"D:\PythonCode\test.pdf")
pdf_reader.decrypt("hy123456")
pdf_writer = PdfFileWriter()
for page in range(pdf_reader.getNumPages()):
   pdf_writer.addPage(pdf_reader.getPage(page))
with open("D:\\PythonCode\\未加密.pdf", "wb") as out:pdf_writer.write(out)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值