Python 是一种全能性编程语言,拥有许多工具和库,经常被用于数据处理、网络爬虫、人工智能等领域。其中,关于 PDF 的操作也是 Python 中一个被广泛关注和应用的方向。这篇文章将从多个方面介绍如何使用 Python 进行 PDF 的裁剪,帮助读者更好地实现自身需求。

一、PDF 裁剪介绍

PDF(Portable Document Format)文件是一种广泛应用于文档交流和存储的文件格式。在日常工作和学习中,我们经常需要对 PDF 文件进行裁剪,以便筛选出自己所需的部分,或者分割成不同的文件等。Python 提供了许多库,使得 PDF 文件的裁剪变得容易。下面是使用 PyPDF2 和 PyMuPDF 两个库对 PDF 进行裁剪的示例。


# 使用 PyPDF2 
from PyPDF2 import PdfFileReader, PdfFileWriter 

def crop_pdf(file_path):
    # 打开 PDF 文档
    input_pdf = PdfFileReader(open(file_path, "rb"))

    # 新建一个 PDF 文档,用来存储裁剪后的内容
    output_pdf = PdfFileWriter()

    # 获取第一页 
    page = input_pdf.getPage(0)

    # 裁剪出指定矩形区域 
    page.cropBox.setLowerLeft((72, 72))
    page.cropBox.setUpperRight((500, 500))

    # 将裁剪后的页添加到输出文档中
    output_pdf.addPage(page)

    # 将输出文档保存
    output_pdf_stream = open("output.pdf", "wb")
    output_pdf.write(output_pdf_stream)
    output_pdf_stream.close()

# 使用 PyMuPDF
import fitz 

def crop_pdf_mupdf(file_path):
    # 打开 PDF 文档
    pdf_doc = fitz.open(file_path)

    # 获取第一页 
    first_page = pdf_doc.loadPage(0)

    # 设置裁剪区域,并裁剪出指定矩形区域 
    rect = fitz.Rect(72, 72, 500, 500)
    cropped_page = first_page.crop(rect)

    # 将裁剪后的页保存到输出文档
    output_pdf = fitz.open()
    output_pdf.insertPDF(pdf_doc)

    # 写入新的 PDF 文档 
    output_pdf.save("cropped.pdf")

二、裁剪特定页面

有时候,我们并不需要对整个 PDF 文档进行裁剪,而是只需要裁剪其中的某几页。为此,我们可以使用 PyPDF2 和 PyMuPDF 两个库提供的函数,实现对特定页面的裁剪。


# 使用 PyPDF2 进行特定页面裁剪 
def crop_specific_pages(input_file, output_file, page_numbers, lower_left, upper_right):
    with open(input_file, 'rb') as infile:
        reader = PdfFileReader(infile)
        writer = PdfFileWriter()
        for i in range(page_numbers):
            page = reader.getPage(i)
            page.mediaBox.lowerLeft = lower_left
            page.mediaBox.upperRight = upper_right
            writer.addPage(page)
        with open(output_file, 'wb') as outfile:
            writer.write(outfile)

# 使用 PyMuPDF 进行特定页面裁剪 
def crop_specific_pages_mupdf(input_file, output_file, page_numbers, rect):
    pdf_doc = fitz.open(input_file)
    output_pdf = fitz.open()

    for i in range(page_numbers):
        page = pdf_doc[i]
        cropped_page = page.crop(rect)
        output_pdf.insertPDF(cropped_page)

    output_pdf.save(output_file)

三、裁剪指定区域

除了裁剪指定页面,有时候我们还需要进一步裁剪出页面的指定区域。也就是说,我们需要获取到一个页面上的子区域,并将其留下放弃其余部分。为了实现此功能,我们可以使用 PyPDF2 和 PyMuPDF 提供的函数。


# 使用 PyPDF2 进行指定矩形区域裁剪 
def crop_rectange_on_page(input_file, output_file, page_number, rectange):
    with open(input_file, 'rb') as infile:
        reader = PdfFileReader(infile)
        writer = PdfFileWriter()
        page = reader.getPage(page_number)
        page.mediaBox.lowerLeft = rectange[0]
        page.mediaBox.upperRight = rectange[1]
        writer.addPage(page)
        with open(output_file, 'wb') as outfile:
            writer.write(outfile)

# 使用 PyMuPDF 进行指定矩形区域裁剪 
def crop_rectange_on_page_mupdf(in_file, out_file, page_number, rect):
    pdf_doc = fitz.open(in_file)
    output_pdf = fitz.open()

    page = pdf_doc[page_number]
    cropped_page = page.crop(rect)

    output_pdf.insertPDF(cropped_page)
    output_pdf.save(out_file)

四、使用示例

下面的示例代码实现了 PDF 文件内第一页裁剪成指定大小的操作,代码中用到了 PyPDF2 实现裁剪,读取和写新 PDF 文档文件,实现了具体流程。实际中,我们可以根据需要选择所需库,实现对应的 PDF 文件裁剪操作


from PyPDF2 import PdfFileReader, PdfFileWriter 

def crop_and_save_pdf(input_path, output_path):
    # 打开 PDF 文档
    input_pdf = PdfFileReader(open(input_path, "rb"))

    # 新建一个 PDF 文档,用来存储裁剪后的内容
    output_pdf = PdfFileWriter()

    # 获取第一页 
    page = input_pdf.getPage(0)

    # 裁剪出指定矩形区域 
    page.cropBox.setLowerLeft((72, 72))
    page.cropBox.setUpperRight((500, 500))

    # 将裁剪后的页添加到输出文档中
    output_pdf.addPage(page)

    # 将输出文档保存
    output_pdf_stream = open(output_path, "wb")
    output_pdf.write(output_pdf_stream)
    output_pdf_stream.close()

if __name__ == '__main__':
    crop_and_save_pdf('test.pdf', 'test_crop.pdf')

总结

本文介绍了 Python 对 PDF 文件进行裁剪的操作,使用了 PyPDF2 和 PyMuPDF 两个库,并示范了如何裁剪指定页面和指定区域,以及实现了具体的示例。通过本文的学习,读者可以更好地了解 Python 中 PDF 文件的裁剪操作,满足自己的实际需求。