【笔记】Python3操作pdf

前言

Python3操作pdf实现办公自动化

pdfplumber

下载依赖

1
pip3 install pdfplumber

引入依赖

1
import pdfplumber

读取pdf文件

<filename>:指定已存在的文件名

1
2
with pdfplumber.open("<filename>.pdf") as f:
pass

获取页对象

获取所有页对象

1
page_list = f.pages

获取页对象总数

1
len(page_list)

遍历所有页对象

1
2
for page in page_list:
pass

获取页面文本

1
text = page.extract_text()

PyPDF2

下载依赖

1
pip3 install PyPDF2

引入依赖

1
from PyPDF2 import PdfFileReader, PdfFileWriter

获取页对象

获取所有页对象

1
page_list = PdfReader("<filename>.pdf").pages

获取页对象总数

1
len(page_list)

遍历所有页对象

1
2
for page in page_list:
pass

缩放页对象

<x>:横坐标缩放比例,浮点数
<y>:纵坐标缩放比例,浮点数

1
page.scale(<x>, <y>)

旋转页对象

  • 正数是顺时针旋转,负数是逆时针旋转
  • 旋转的角度只能是90的倍数

<deg>:旋转的角度

1
page.rotate(<deg>)

裁剪页对象

  • 裁剪时的框选范围
1
2
3
4
page.mediabox.upper_left = (1, 1)
page.mediabox.upper_right = (1, 1)
page.mediabox.lower_left = (1, 1)
page.mediabox.lower_right = (1, 1)

合并页对象

  • 将两页合并为一页
    • 通常可以将水印页对象与原页对象合并,结果为加了水印的页对象

page_1:原页对象
page_2:水印页对象

1
page_1.merge_page(page_2)
配合reportlab实现水印
下载依赖
1
pip3 install reportlab
生成水印文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from reportlab.pdfgen import canvas
from reportlab.lib import pagesizes
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

def create_watermark(watermark_file, keyword):
canvas_obj = canvas.Canvas(watermark_file, pagesizes.A4)
canvas_obj.setFont("楷体_GB2312", 24)
canvas_obj.setFillColorRGB(0, 0, 0)
canvas_obj.setFillAlpha(0.1)
canvas_obj.rotate(15)
for x in range(3, 24, 10):
for y in range(-5, 30, 5):
canvas_obj.drawString(x * cm, y * cm, keyword)
canvas_obj.save()
return watermark_file
添加水印
1
2
3
create_watermark("./水印.pdf", "水印内容")
pdf_watermark = PdfReader("./水印.pdf").pages[0]
page.merge_page(pdf_watermark)

拆分PDF

  • 将得到的页对象单独作为一个文件写入
1
2
3
4
pdf_writer = PdfWriter()
pdf_writer.add_page(page)
with open("<filename>.pdf", "wb") as f:
pdf_writer.write(f)

合并PDF

  • 读取多个页对象,将所有的页对象作为一个文件写入

page_1page_2:多个页对象,可以通过PdfFileReader获取

1
2
3
4
5
pdf_writer = PdfWriter()
pdf_writer.add_page(page_1)
pdf_writer.add_page(page_2)
with open("<filename>.pdf", "wb") as f:
pdf_writer.write(f)

加密PDF

  • 将页对象添加到writer后,对writer进行加密

<password>:用于加密的密码

1
2
3
4
5
pdf_writer = PdfWriter()
pdf_writer.add_page(page)
pdf_writer.encrypt("<password>")
with open("<filename>.pdf", "wb") as f:
pdf_writer.write(f)

解密PDF

  • 在打开PDF文件后如果发现已经被加密,可以先进行解密,再获取页对象

<password>:用于解密的密码

1
2
3
4
pdf_reader = PdfReader("<filename>.pdf")
if pdf_reader.is_encrypted:
pdf_reader.decrypt("<password>")
page_list = pdf_reader.pages

完成

参考文献

哔哩哔哩——千锋教育
CSDN——冰冷的希望