您的位置:

Python PyPDF2:PDF 文件处理的利器

一、简介

Python PyPDF2 是一个强大的 Python PDF 库,它可以用于处理 PDF 文件,例如合并、拆分、旋转、剪切、添加文字水印和图片水印、加密、解密、统计页面数量等等。 PyPDF2 可以灵活的操作 PDF 文件,而且可以与其他 Python 库结合起来实现更多功能。 这里将介绍 PyPDF2 的常用功能。

二、合并 PDF 文件

合并多个 PDF 文件成一个单独的 PDF 文件,通过 PyPDF2 很容易实现。使用 PyPDF2.PdfFileMerger() 创建一个 PDF 合并器,并添加要合并的 PDF 文件,最后输出到目标文件。

from PyPDF2 import PdfFileMerger

pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf']   # 要合并的 PDF 文件列表

merger = PdfFileMerger()

for pdf in pdfs:
    merger.append(open(pdf, 'rb'))

with open('merged_file.pdf', 'wb') as output:
    merger.write(output)

三、PDF 文件页数统计

通过 PyPDF2 可以方便地获得 PDF 文件中页面的数量。使用 PdfFileReader 类读取 PDF 文件,获取页面数量。

from PyPDF2 import PdfFileReader

pdf_file = 'file.pdf'   # 文件路径

with open(pdf_file, 'rb') as f:
    pdf = PdfFileReader(f)
    pages = pdf.getNumPages()
    print(f'Total pages: {pages}')

四、PDF 文件内容提取

提取 PDF 页面中的文本内容通常需要用到第三方 OCR(Optical Character Recognition)工具,但是 PyPDF2 可以直接提取已经能够被识别的文本。使用 PdfFileReader 类读取 PDF 文件,获取页面对象,然后通过 extractText() 方法提取页面文本内容。

from PyPDF2 import PdfFileReader

pdf_file = 'file.pdf'   # 文件路径

with open(pdf_file, 'rb') as f:
    pdf = PdfFileReader(f)
    page = pdf.getPage(0)   # 获取第一页
    text = page.extractText()
    print(text)

五、PDF 文件页面剪切

剪切 PDF 文件中的某一页,通过 PyPDF2 可以方便的实现。使用 PdfFileReader 类读取 PDF 文件,获取页面对象,然后使用 PdfFileWriter 类创建一个新的 PDF 文件,并添加页面对象,最后输出到目标文件。

from PyPDF2 import PdfFileReader, PdfFileWriter

pdf_file = 'file.pdf'   # 文件路径

with open(pdf_file, 'rb') as f:
    pdf = PdfFileReader(f)
    page = pdf.getPage(0)   # 获取第一页

    writer = PdfFileWriter()
    writer.addPage(page)   # 添加页面对象

    with open('new_file.pdf', 'wb') as output:
        writer.write(output)

六、PDF 文件加密

通过 PyPDF2 可以对 PDF 文件进行加密保护。使用 PdfFileWriter 类创建一个新的 PDF 文件,并设置加密选项,最后输出到目标文件。

from PyPDF2 import PdfFileReader, PdfFileWriter

pdf_file = 'file.pdf'   # 文件路径

with open(pdf_file, 'rb') as f:
    pdf = PdfFileReader(f)

    writer = PdfFileWriter()

    for i in range(pdf.getNumPages()):
        writer.addPage(pdf.getPage(i))

    writer.encrypt('password', use_128bit=True)

    with open('enc_file.pdf', 'wb') as output:
        writer.write(output)

七、PDF 文件添加文字水印

通过 PyPDF2 可以在 PDF 文件页面上添加文字水印。使用 PdfFileWriter 类创建一个新的 PDF 文件,通过 PdfFileReader 类读取 PDF 文件中的页面对象,并在页面上添加水印,添加到新的 PDF 文件中,并输出到目标文件。

from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.pdf import ContentStream
from PyPDF2.pdf import TextStringObject
from PyPDF2.pdf import PageObject

pdf_file = 'file.pdf'   # 文件路径
text_font = 'Arial'   # 水印文字字体
text_size = 24   # 水印文字大小
text_color = '#ff0000'   # 水印颜色
position_x = 100   # 水印横坐标位置
position_y = 100   # 水印纵坐标位置
rotate = False   # 是否旋转水印

with open(pdf_file, 'rb') as f:
    pdf = PdfFileReader(f)

    writer = PdfFileWriter()

    for i in range(pdf.getNumPages()):
        page = pdf.getPage(i)

        # 创建水印
        text = TextStringObject('WATERMARK', fontName=text_font, fontSize=text_size, fillColor=text_color)

        # 创建水印对象
        text_obj = ContentStream([text], page.pdf)
        watermark = PageObject.createBlankPage(None)
        watermark.mergeContentStreams(text_obj)

        # 设置水印位置和旋转角度
        watermark.mediaBox.upperRight = page.mediaBox.upperRight
        watermark.translate(position_x, position_y)

        if rotate:
            watermark.rotateClockwise(45)

        # 合并水印和页面内容
        page.mergePage(watermark)

        writer.addPage(page)

    with open('watermark_file.pdf', 'wb') as output:
        writer.write(output)

八、PDF 文件添加图片水印

通过 PyPDF2 可以在 PDF 文件页面上添加图片水印。使用 PdfFileWriter 类创建一个新的 PDF 文件,通过 PdfFileReader 类读取 PDF 文件中的页面对象,并在页面上添加水印,添加到新的 PDF 文件中,并输出到目标文件。

from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.pdf import ContentStream
from PyPDF2.pdf import ImageObject
from PyPDF2.pdf import PageObject

pdf_file = 'file.pdf'   # 文件路径
image_file = 'watermark.png'   # 水印图片路径
position_x = 100   # 水印横坐标位置
position_y = 100   # 水印纵坐标位置
scale = 0.5   # 水印大小比例
rotate = False   # 是否旋转水印

with open(pdf_file, 'rb') as f:
    pdf = PdfFileReader(f)

    writer = PdfFileWriter()

    for i in range(pdf.getNumPages()):
        page = pdf.getPage(i)

        # 创建水印
        watermark = ImageObject(image_file)

        # 缩放水印
        watermark.scale(scale)

        # 设置水印位置和旋转角度
        watermark_width = watermark.width
        watermark_height = watermark.height
        watermark_x = position_x - watermark_width / 2
        watermark_y = position_y - watermark_height / 2
        if rotate:
            watermark.rotate(45)
            watermark_x += watermark_height * scale / 2
            watermark_y -= watermark_width * scale / 2

        # 创建水印对象
        image_obj = ContentStream([watermark], page.pdf)
        watermark_page = PageObject.createBlankPage(None)
        watermark_page.mergeContentStreams(image_obj)

        # 合并水印和页面内容
        page.mergePage(watermark_page)

        writer.addPage(page)

    with open('watermark_file.pdf', 'wb') as output:
        writer.write(output)