PDF分页处理:技术与实践

news2024/11/28 8:51:22

引言

在数字化办公和学习中,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上下分页

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左右分页


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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Langchain 新玩法:LangGraph 赋能 RAG Agent,自适应、自校正、Self-RAG

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

【讯为Linux驱动开发】5.并发与竞争

并发:一个CPU在一个时间片只能执行一个任务,切换速度很快。 并行:双核CPU,真正的同时执行两个任务 并行就是并发的理想情况,统称并发。 【问】Linux在什么情况下产生并发? 1.中断中修改公共资源 2.抢占…

【UML用户指南】-11-对高级结构建模-高级关系

目录 1、依赖(dependency) 1.1.1、绑定(bind) 1.1.2、导出(derive) 1.1.3、允许(permit) 1.1.4、实例(instanceOf) 1.1.5、实例化(instanti…

【PL理论】(11) F#:标准库之 Set | 标准库之 Map

💭 写在前面:本章我们将简要的介绍一下 Set 和 Map (非常简要,简要至极) 目录 0x00 标准库之集合(Set) 0x01 标准库之 Map 0x00 标准库之集合(Set) 集合中的元素具有…

【调整堆】(C++ 代码实现 注释详解)

自定义结构体: #define sz 105 typedef struct node{int length;int l[sz]; }SqList; 调整堆的函数: HeapAdjust函数思路说明: //目标:将以s为根的子树调整为大根堆 //具体操作:将路径上比s大的都往上移动,s往下移…

屏幕空间反射技术在AI绘画中的作用

在数字艺术和游戏开发的世界中,真实感渲染一直是追求的圣杯。屏幕空间反射(Screen Space Reflection,SSR)技术作为一种先进的图形处理手段,它通过在屏幕空间内模拟光线的反射来增强场景的真实感和视觉冲击力。随着人工…

selenium-java自动化教程

文章目录 Selenium支持语言WebDriver 开始使用chromedriver模拟用户浏览访问模拟点击事件关闭弹窗,选中元素并点击 获取页面文本结语 Selenium Selenium是一个自动化测试工具,可以模拟用户操作web端浏览器的行为,包括点击、输入、选择等。也可…

第十一届蓝桥杯C++青少年组中/高级组省赛2020年真题解析

一、单选题 第1题 表达式 ‘6’ - ‘1’ 的值是( ) A:整数 5 B:字符 5 C:表达式不合法 D:字符 6 答案:A 在 C 中,字符字面量用单引号括起来,例如 ‘6’ 和 ‘1’。这些字符字面量实际上是表示字符的 ASCII 值。在 ASCII 编码中&#xff0…

【机器学习】消息传递神经网络(MPNN)在分子预测领域的医学应用

1. 引言 1.1. 分子性质预测概述 分子性质预测是计算机辅助药物发现流程中至关重要的任务之一,它在许多下游应用如药物筛选和药物设计中发挥着核心作用: 1.1.1. 目的与重要性: 分子性质预测旨在通过分子内部信息(如原子坐标、原…

2.数人数

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/431 题目描述 在一个班级里,男生比女生多…

MySQL—多表查询—子查询(介绍)

一、引言 上一篇博客学习完联合查询。 这篇开始,就来到多表查询的最后一种形式语法块——子查询。 (1)概念 SQL 语句中嵌套 SELECT 语句,那么内部的 select 称为嵌套查询,又称子查询。 表现形式 注意: …

达梦8 开启物理逻辑日志对系统的影响

物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 DBMS_LOGMNR 包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内 容会被存储在重做日志文件中。 要开启物理逻辑日志的功能,需要…

11.Spring AOP

文章目录 1.什么是 Spring AOP?2.为什要用 AOP?3.Spring AOP 应该怎么学习呢?3.1 AOP 组成3.1.1 切⾯(Aspect) 切点 通知3.1.2 连接点(Join Point)3.1.3 切点(Pointcut)…

《Brave New Words 》1.1 抛弃瓶子

Part I: Rise of the AI Tutor 第一部分:AI 导师的崛起 A great teacher can teach calculus with a paper clip and literature in an empty field. Technology is just another tool, not a destination. —Unknown 一位伟大的教师可以用回形针教微积分&#xff0…

Coze入门指南:创建Bot时,如何写好人设与回复逻辑(Persona Prompt)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Coze Bot 📒📝 Persona & Prompt🌟 # Character🌟 ## Skills🌟 # Overall Rules to follow🌟 ## Workflow🌟 ## Constraints📝 通用写法与模板📝 示例🌟技巧和注意事项⚓️ 相关链接 ⚓️📖 介绍 📖…

11.闰年的判定

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/615 题目描述 给定一个正整数 𝑦y 表示…

二进制中1的个数-java

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、二进制中1的个数 二、算法思路 1.将一个整数转化成二进制形式 2.查询一个数的二进制数中的第k位是多少 3.lowbit(x)操作 三、代码如下 1.代码如下&…

Jmeter 压力测测试的简单入门

下载安装 官方网站:Apache JMeter - Download Apache JMeter 下载完成解压即可。 配置 1. 找到 bin 目录下的 ApacheJMeter.jar 包,直接打开 如果向图片这样不能直接打开,就在此路径运行 CMD,然后输入下面的命令即可启动。 ja…

React实现在线预览word报告/本地选择报告预览

标题使用的核心技术点是docx-preview,读取到文件的File对象,用File去做文件展示,这里是才用将文件转base64字符串存储到localStorage中 在线预览word报告且包含word样式 下载需要使用的min.js文件进项目的public目录中(上zip已包…

彼长技以助己(4)边界思维

彼长技以助己(4)边界思维 边界思维 接下来是工程思维中的第二个思维:边界思维。它是适用于所有工程领域,事半功倍的方法,很值得大家去学习掌握。 我们做任何事情都是有边界的,技术有边界、人工智能有边界…