PyPDF2:项目实战源码分享(PDF裁剪)

PyPDF2

目录📑

    • 1. 背景📑
    • 2. 源码模块解析📑
      • 2.1 读取PDF页数
      • 2.2 获取指定页的宽高尺寸
      • 2.3 裁剪单页PDF
      • 2.4 批量裁剪PDF
    • 总结📑

1. 背景📑

接PyPDF2模块推荐博文中提到的实际需求(将银行网站下载来的多页且单页多张回单的PDF裁剪成每张单据独立一个PDF文件),我决定将项目所做操作的模块化源码分享给大家

原PDF
原PDF

裁剪后PDF
原PDF

2. 源码模块解析📑

2.1 读取PDF页数

因为数据范围是动态的,所以每次处理的PDF页数也是不同的,操作一个回单PDF首先需要知道他有多少页

def get_page_num(pdf_path) -> int:"""获取PDF文件页数params:pdf_path: 需要读取页数的PDF文件路径return:_pages_count: PDF文件的页数"""with open(pdf_path, 'rb') as _pdf_file:# 读取PDF文件_pdf_file = PyPDF2.PdfReader(_pdf_file)# 获取总页数_pages_count = len(_pdf_file.pages)return _pages_count

2.2 获取指定页的宽高尺寸

裁剪前肯定需要知道原尺寸,然后根据原尺寸初步三等分,再做微调,最终实现银行回单的等分

def get_page_wh(pdf_path, page_num) -> list:"""获取PDF文件指定页的宽高数据params:pdf_path: 需要读取宽高的PDF文件路径page_num: 需要读取宽高的是哪一页,页码return:_width: PDF文件指定页的宽度_height: PDF文件指定页的高度"""with open(pdf_path, 'rb') as _pdf_file:# 读取PDF文件_pdf_file = PyPDF2.PdfReader(_pdf_file)# 获取PDF指定页信息_pdf_info = _pdf_file.pages[int(page_num) - 1]# 获取PDF指定页宽_width = float(_pdf_info.mediabox.width)# 获取PDF指定页高_height = float(_pdf_info.mediabox.height)return [_width, _height]

2.3 裁剪单页PDF

下面就是需求的核心功能——裁剪了(需要注意的是,我这里是根据需求将裁剪后的每一张回单放在同一个输出PDF文件中,如果需要每一张回单都为一个独立PDF文件,可以自行调整代码)

def split_pdf(input_path, output_path, page_num, upper_left, upper_right, lower_left, lower_right):"""裁剪指定单页PDF的区域,并另存为一个独立的文件到output_path注意:当PDF单页的 宽width < 高height 的时候,即文件是竖向的时候,左下角为坐标原点当PDF单页的 宽width > 高height 的时候,即文件是横向的时候,右下角为坐标原点params:input_path: 需要裁剪的PDF文件路径output_path: 输出路径page_num: 需要裁剪的是哪一页,页码upper_left: 裁剪区域的左上角坐标upper_right: 裁剪区域的右上角坐标lower_left: 裁剪区域的左下角坐标lower_right: 裁剪区域的右下角坐标"""with open(input_path, 'rb') as _input_file:# 读取PDF文件_input_file = PyPDF2.PdfReader(_input_file)# 创建输出PDF对象_that_page = PyPDF2.PdfWriter()# 获取PDF文件指定页对象_this_page = _input_file.pages[int(page_num) - 1]# 划定裁剪区域_this_page.mediabox.upper_left = tuple(upper_left)_this_page.mediabox.upper_right = tuple(upper_right)_this_page.mediabox.lower_left = tuple(lower_left)_this_page.mediabox.lower_right = tuple(lower_right)# 为输出PDF对象添加裁剪页_that_page.add_page(_this_page)with open(output_path, 'wb') as _output_file:# 将输出PDF对象写入输出路径文件_that_page.write(_output_file)

2.4 批量裁剪PDF

因为原需求是一个回单PDF中由格式相同的多页回单组成的,所以我直接写了一个批量裁剪整个多页PDF文件的函数(同样需要注意的是,我这里根据需求写的是将裁剪后的每一张回单放在同一个输出PDF文件中,如果需要每一张回单都为一个独立PDF文件,可以自行调整代码)

def batch_split_pdf(input_path, output_path, crop_area_list):"""循环PDF文件每一页,裁剪出每一页所有裁剪区域列表中指示的区域,并且裁剪后输出到同一个PDF文件内注意:当PDF单页的 宽width < 高height 的时候,即文件是竖向的时候,左下角为坐标原点当PDF单页的 宽width > 高height 的时候,即文件是横向的时候,右下角为坐标原点params:input_path: 需要裁剪的PDF文件路径output_path: 输出路径crop_area_list: 需要裁剪的区域列表(三维列表)"""with open(input_path, 'rb') as _input_file:# 读取PDF文件_input_file = PyPDF2.PdfReader(_input_file)# 获取总页数_pages_count = len(_input_file.pages)# 创建输出PDF对象_that_page = PyPDF2.PdfWriter()# 循环每一页for _page_num in range(_pages_count):# 循环要裁剪的区域列表for _crop_area in crop_area_list:# 获取PDF文件指定页对象_this_page = _input_file.pages[_page_num]# 划定裁剪区域_this_page.mediabox.upper_left = tuple(_crop_area[0])_this_page.mediabox.upper_right = tuple(_crop_area[1])_this_page.mediabox.lower_left = tuple(_crop_area[2])_this_page.mediabox.lower_right = tuple(_crop_area[3])# 为输出PDF对象添加裁剪页_that_page.add_page(_this_page)with open(output_path, 'wb') as _output_file:# 将输出PDF对象写入输出路径文件_that_page.write(_output_file)

总结📑

以上就是关于银行回单PDF裁剪需求涉及到的源代码了,抛砖引玉,大家可以根据自己更强的实力对代码做自己的个性化调整,冲💪!

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

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

相关文章

10s了解 共享动画

1. 目的&#xff1a; 界面切换&#xff0c;两控件变化关联&#xff0c;看起来更丝滑流程 2.怎么配置 为关联两控件加上相同transitionName 3.在Navigation开启共享动画 跳转到的界面 接收共享动画 4.在Activity中开启共享动画 同3 &#xff0c;在共享动画两个View加上相同的t…

政安晨【示例演绎虚拟世界开发】(一):Cocos Creator 的 Hello World

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正。 前言 Cocos Creator是一款非常强大的游戏开发引擎&#xff0c;它有着优秀…

[HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

centos7部署单机项目和自启动

centos7部署单机项目和服务器自启动 1.安装jdk和tomact1.1上传jdk、tomcat安装包1.2解压两个工具包1.3.配置并且测试jdk安装1.4.启动tomcat1.5.防火墙设置1.6配置tomcat自启动 2.安装mysql2.1卸载mariadb&#xff0c;否则安装MySql会出现冲突(先查看后删除再查看)2.2在线下载My…

Linux学习笔记9——adduser,passwd用户创建

Linux是一个多用户的操作系统&#xff0c;允许多用户访问&#xff0c;对系统进行一些操作&#xff0c;其中根用户为root拥有系统一切权限 其中&#xff0c;useradd是新建用户&#xff0c;passwd是给新建用户添加密码&#xff0c;su新建用户名&#xff0c;是切换到该用户对系统进…

雪地奔驰高级版/SnowRunner【带修改器】(全DLCs)

包含DLC • SnowRunner – Sabertooth Livery • SnowRunner – Navistar 5000-MV Tractor • SnowRunner – High Roller Pack • SnowRunner – Loaded Dice Vinyl Wrap • SnowRunner – Scorched Vinyl Wrap • SnowRunner – True Colors Vinyl Wrap • SnowRunner…

企业网站建设需要多少钱?定制开发费用报价在3000-4000元

建立一个网站需要多少钱&#xff1f; 网站建设的价格划分也有很多。 这里首先要提的是市面上常见的一种低成本建站方式——模板网站&#xff0c;就是那种直接制作网站原型就可以无限复制的网站。 或者可以在几分钟内建立一个由软件生成的网站。 成本低得惊人&#xff0c;从500元…

【Java程序设计】【C00300】基于Springboot的足球社区管理系统(有论文)

基于Springboot的足球社区管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的足球社区管理系统&#xff0c;本系统有管理员以及教练角色权限&#xff1b; 管理员设置的功能有&#xff1a;添加并管理各种类型…

nacos注册中心之服务注册

微服务是一种经过良好架构设计的分布式架构方案&#xff0c;特征&#xff1a; 1、单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业务开发。 2、面向服务&#xff1a;微服务对外暴露业务接口…

常用芯片学习——YC688语音芯片

YC688 广州语创公司语音芯片 使用说明 YC688是一款工业级的MP3语音芯片 &#xff0c;完美的集成了MP3、WAV的硬解码。支持SPI-Flash、TF卡、U盘三种存储设备。可通过电脑直接更新SPI-Flash的内容&#xff0c;无需上位机软件。通过简单的串口指令即可完成三种存储设备的音频插…

Linux配置jdk、tomcat、mysql离线安装与启动

目录 1.jdk安装 2.tomcat的安装&#xff08;开机自启动&#xff09; 3.MySQL的安装 4.连接项目 1.jdk安装 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里我新建一个文件夹…

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

21.scala泛型结合隐式转换使用

目录 概述实践代码执行 结束 概述 scala泛型结合隐式转换使用 实践 代码 package com.fun.scala/*** 视图界定*/ object Genericity04 {def main(args: Array[String]): Unit {val s1 new Stu("test", 33)val s2 new Stu("test2", 32)println(new M…

Apache Doris 发展历程、技术特性及云原生时代的未来规划

文章目录 每日一句正能量前言作者介绍Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源基于云原生向量数据库Milvus 的…

云尚办公-0.0.1

1. 核心技术 基础框架&#xff1a;SpringBoot数据缓存&#xff1a;Redis数据库&#xff1a;MySQL权限控制&#xff1a;SpringSecurity工作流引擎&#xff1a;Activiti前端技术&#xff1a;vue-admin-template Node.js Npm Vue ElementUI Axios微信公众号&#xff1a;公众…

Mac OS 下载安装与破解Typora

文章目录 下载Typora破解Typora1. 进入安装目录2. 找到并打开Lincense文件3. 修改激活状态4. 重新打开Typora 下载Typora 官网地址&#xff1a;typora官网 下载最新Mac版&#xff0c;正常安装即可 破解Typora 打开typora,可以看到由于未激活&#xff0c;提示使用期限还剩下15…

【Linux】--- 详解Linux软件包管理器yum和编辑器vim

目录 一、Linux软件包管理器 - yum1.1 yum和软件包是什么1.2 Linux系统(Centos)的生态1.3 yum相关操作1.4 yum本地配置 二、Linux编辑器 - vim使用2.1 vim的基本概念2.2 vim命令模式命令集2.3 vim末行模式命令集2.4 关于vim的几个相关问题 一、Linux软件包管理器 - yum 1.1 yu…

hbuilder 发布为微信小程序

发布为微信小程序&#xff1a; 申请微信小程序AppID&#xff0c;参考&#xff1a;微信教程。在HBuilderX中顶部菜单依次点击 "发行" > "小程序-微信"&#xff0c;输入小程序名称和appid点击发行即可在 unpackage/dist/build/mp-weixin 生成微信小程序项…

Debezium发布历史149

原文地址&#xff1a; https://debezium.io/blog/2023/06/21/debezium-2-3-final-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 2.3.0.Final Released June 21, 2023 by Chris Cranford re…

计网 - 深入理解HTTPS:加密技术的背后

文章目录 Pre发展历史Http VS HttpsHTTPS 解决了 HTTP 的哪些问题HTTPS是如何解决上述三个风险的混合加密摘要算法 数字签名数字证书 Pre PKI - 数字签名与数字证书 PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 发展历史 HTTP&#xff08;超文本传输协…