PDF分页处理:技术与实践

引言

在数字化办公和学习中,PDF文件因其便携性和格式稳定性而广受欢迎。然而,处理大型PDF文件时,我们经常需要将其拆分成单独的页面,以便于管理和分享。本文将探讨如何使用Python编程语言和一些流行的库来实现PDF文件的分页处理。

PDF分页的技术背景

PDF(Portable Document Format,便携式文档格式)是一种由Adobe系统公司开发的文件格式,用于表示文档的布局、文本、图形和其他元素。PDF文件广泛用于电子文档交换,因为它们可以在不同的操作系统和设备上保持一致的显示效果。

使用Python进行PDF分页

Python是一种灵活且功能强大的编程语言,拥有丰富的库支持,非常适合进行PDF文件的处理。以下是一些用于处理PDF的流行Python库:

PyPDF2

PyPDF2是一个强大的库,可以用于读取PDF文件、拆分页面、合并页面等。但是,从版本3.0.0开始,PyPDF2不再维护,推荐使用PdfReader替代PdfFileReader。

fitz (PyMuPDF)

fitz是另一个流行的库,它是MuPDF的Python绑定,提供了丰富的PDF处理功能。使用fitz,我们可以轻松地打开、解析和修改PDF文件。

实战:使用Python分页PDF

PDF上下分页

csharp 复制代码
import os
import pandas as pd
from PyPDF2 import PdfFileReader, PdfFileWriter

def split_pdf(infile):
    split_pdf_file = []
    split_pdf_file_name = []
    if '/' in infile:
        in_File = infile.split('/')[2][:-4]
    else:
        in_File = infile[:-4]
    new_filepath = os.path.join('%s/%s') % ('./resluts', in_File)
    if not os.path.exists(new_filepath):
        os.makedirs(new_filepath)
    with open(infile, 'rb') as infile:
        reader = PdfFileReader(infile, strict=False)
        number_of_pages = reader.getNumPages()
        print("共{}页".format(number_of_pages))
        for i in range(number_of_pages):
            writer = PdfFileWriter()
            writer.addPage(reader.getPage(i))
            out_new_file = new_filepath + '/' + str(i + 1)
            if not os.path.exists(out_new_file):
                os.makedirs(out_new_file)
            out_file_name = out_new_file + '/' + str(i + 1) + '.pdf'
            with open(out_file_name, 'wb') as outfile:
                writer.write(outfile)
            split_pdf_file.append(out_file_name)
            split_pdf_file_name.append(out_new_file)
        return split_pdf_file, split_pdf_file_name

结果如下:

PDF左右分页

csharp 复制代码
import pdfplumber
from PyPDF2 import PdfFileReader, PdfFileWriter
import os
def split_pdf(infile, out_path):
    if not os.path.exists(out_path):
        os.makedirs(out_path)
    with open(infile, 'rb') as infile:
        reader = PdfFileReader(infile)
        number_of_pages = reader.getNumPages()
        print("共{}页".format(number_of_pages))
        for i in range(number_of_pages):
            writer = PdfFileWriter()
            writer.addPage(reader.getPage(i))
            out_file_name = out_path + str(i + 1) + '.pdf'
            with open(out_file_name, 'wb', ) as outfile:
                writer.write(outfile)

def PdfSplitpath(new_filepath):
    isExists = os.path.exists(new_filepath)
    if not isExists:
        os.makedirs(new_filepath)
        print("----------目录创建成功--------")
    else:
        print("---------目录已经存在----------")

def SplitPDFLeft(inpath, outpath):
    inpath_new = os.listdir(inpath)
    for j in inpath_new:
        inpath1 = inpath + j
        with open(inpath1, "rb") as in_f:
            input1 = PdfFileReader(in_f)
            output = PdfFileWriter()

            numPages = input1.getNumPages()

            for i in range(numPages):
                page = input1.getPage(i)
                page.cropBox.lowerLeft = (10, 45) 
                page.cropBox.upperRight = (600, 841.89)
                output.addPage(page)

            with open(('%s/%s.pdf' % (outpath, j[:len(j) - 4] + '_lift')), "wb") as out_f:
                print("已写入第{}个pdf_lift".format(j[:len(j) - 4]))
                output.write(out_f)


def SplitPDFRight(inpath, outpath):
    inpath_new = os.listdir(inpath)
    for j in inpath_new:
        inpath1 = inpath + j
        with open(inpath1, "rb") as in_f:
            input1 = PdfFileReader(in_f)
            output = PdfFileWriter()

            numPages = input1.getNumPages()

            for i in range(numPages):
                page = input1.getPage(i)
                page.height = (791.89)
                page.width = (562.2)
                page.cropBox.upperRight = (600, 841.89) 
                page.cropBox.lowerLeft = (1162.2, 50) 
                output.addPage(page)

            with open(('%s/%s.pdf' % (outpath, j[:len(j) - 4] + '_right')), "wb") as out_f:
                print("已写入第{}个pdf_right".format(j[:len(j) - 4]))
                output.write(out_f)


if __name__ == '__main__':
    in_File = './data/越南协会组织与NGO组织目录.pdf'
    out_Path = './data/单页/'  # 生成输出文件夹
    split_pdf(in_File, out_Path)
    new_filepath = './data/分页'
    PdfSplitpath(new_filepath)
    inpath_new = os.listdir(out_Path)
    print(inpath_new)
    print(out_Path + inpath_new[3])
    print((inpath_new[3])[:len(inpath_new[3]) - 4])
    SplitPDFRight(out_Path, new_filepath)
    SplitPDFLeft(out_Path, new_filepath)

结果如下

单页PDF
左单页PDF
右单页PDF
相关推荐
小咖自动剪辑11 小时前
Base64与图片互转工具增强版:一键编码/解码,支持多格式
人工智能·pdf·word·媒体
开开心心_Every19 小时前
家常菜谱软件推荐:分类齐全无广告步骤详细
linux·运维·服务器·华为od·edge·pdf·华为云
开开心心就好19 小时前
键盘映射工具改键位,绿色版设置后重启生效
网络·windows·tcp/ip·pdf·计算机外设·电脑·excel
cuber膜拜20 小时前
Marp CLI快速入门
pdf·npm·markdown·ppt·marp
reasonsummer20 小时前
【办公类-53-09】20260131Python模仿制作2025学年第二学期校历(excel+pdf)
python·pdf
心语星光21 小时前
用python语言的pyautogui库实现伪批量将xdf文件打印为pdf文件
开发语言·python·pdf·自动化
iReachers21 小时前
PDF一机一码加密大师1.1.0更新至2026最新版, 强力加密PDF, 无需额外安装阅读器, 附CSDN下载地址
pdf
web打印社区2 天前
前端开发实现PDF打印需求:从基础方案到专业解决方案
前端·vue.js·react.js·electron·pdf
Kratzdisteln2 天前
【MCM】(x= (N_A),y=(N_G),z=(p))RGB=T*
pdf
Kratzdisteln2 天前
【1902】process_assignment_pdf()
大数据·人工智能·pdf