pdf基本操作

  |  

摘要: pdf 常见操作,例如采集和处理 pdf 数据。主要工具是 PyPDF4、qpdf

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


PyPDF4

PyPDF4 是一个纯 Python 的 PDF 工具包。

1
pip install PyPDF4

1. 提取文档信息(Meta)

获得 pdf 的元信息和页数信息。

  • 作者
  • 创建者
  • 生产商
  • 主题
  • 题目
  • 页数
1
2
3
4
5
6
from PyPDF4 import PdfFileReader

with open(pdf_path, "rb") as f:
pdf = PdfFileReader(f)
infomation = pdf.getDocumentInfo() # Meta 信息
number_of_pages = pdf.getNumPages() # 页数

infomation 对象中有一些属性,例如作者,标题等。

2. 旋转页面

取某些页面,旋转后加入输出文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
def rotate_pages(pdf_path):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
# 顺时针旋转 90 度
page_1 = pdf_reader.getPage(0).rotateClockwise(90)
pdf_writer.addPage(page_1)
# 逆时针旋转 90 度
page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90)
pdf_writer.addPage(page_2)
# 不旋转的页
pdf_writer.addPage(pdf_reader.getPage(2))
with open("rotate_pages.pdf", "wb") as f:
pdf_writer.write(f)

每次调用Rotation旋转方法后,都会调用.addPage(),这将向writer对象添加页面的旋转版本。

3. 合并 PDF

将两个或多个PDF合并到一个PDF中。

1
2
3
4
5
6
7
8
def merge_pdfs(paths, output):
pdf_writer = PdfFileWriter()
for path in paths:
pdf_reader = PdfFileReader(path)
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
with open(output, "wb") as f:
pdf_writer.write(f)

首先遍历输入的paths,并为每个输入创建一个PDF阅读对象。然后遍历PDF文件中的所有页面,并使用.addpage()将这些页面写入writer对象。当完成对列表中所有PDF的所有页面的写入后,将在末尾写入新的结果中。

4. 拆分 PDF

将 PDF 拆分为多个 PDF,对于包含大量扫描内容的 PDF 来说很重要

1
2
3
4
5
6
7
8
9
10
def split(path, name_of_split):
pdf = PdfFileReader(path)
num_pages = pdf.getNumPages()
for page in range(num_pages):
pdf = PdfFileReader(path)
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page))
output = "{}{}.pdf".format(name_of_split, page)
with open(output, "wb") as g:
pdf_writer.write(g)

对于PDF中的每个页面,创建一个新的PDF的writer实例并向其添加单个页面。然后,将该页面写入一个唯一命名的文件。

5. 添加水印

水印来源:仅包含水印图像或文本的PDF。

1
2
3
4
5
6
7
8
9
10
11
12
def create_watermark(input_pdf, output, watermark):
watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)
pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()
# 给页面添加水印
for page in range(pdf_reader.getNumPages()):
page = pdf_reader.getPage(page)
page.mergePage(watermark_page)
pdf_writer.addPage(page)
with open(output, "wb") as f:
pdf_writer.write(f)

6. 加密

1
2
3
4
5
6
7
8
def add_encryption(input_pdf, output_pdf, password):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(input_pdf)
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
pdf_writer.encrypt(user_pwd=password, owner_pwd=None, use_128bit=True)
with open(output_pdf, 'wb') as f:
pdf_writer.write(f)

qpdf

处理 pdf 文件的命令行工具

1
sudo apt install qpdf

(1) 分割pdf

从原文件中取出n-m页,保留原文件的目录格式:

1
qpdf infile.pdf --pages . n-m -- outfile.pdf

从原文件中取出n-m页,不保留原文件的目录格式:

1
qpdf --empty --pages infile.pdf n-m -- outfile.pdf

将原文件的每一页单独保存为一个文件:

1
qpdf --split-pages infile.pdf outfile.pdf

将原文件的每N页单独保存为一个文件:

1
qpdf --split-pages=N infile.pdf outfile.pdf

(2) 合并

将A.pdf和B.pdf合并C.pdf,A在前,B在后:

1
qpdf  B.pdf --pages A.pdf . -- C.pdf

将A.pdf、B.pdf、C.pdf合并成D.pdf:

1
qpdf  C.pdf --pages A.pdf B.pdf . -- D.pdf

将A.pdf的1-5页和B.pdf的2-3页合并成C.pdf:

1
qpdf  B.pdf --pages A.pdf 1-5 . 2-3 -- C.pdf

(3) 已知密码的前提下移除PDF文件密码,输出没有密码的文件

已知秘密为 123456

1
qpdf --password='123456' --decrypt infile.pdf outfile.pdf

pdfminer

以上工具只是做一些 PDF 的基本操作,以及抽取元信息。不涉及解析内容。

如果有解析 pdf 内容的需求,不如数据清洗这种工作,可以研究 pdfminer 这个包。

1
pip install pdfminer3k

Share