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://www.mzph.cn/news/701659.shtml

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

相关文章

LeetCode 热题 100 | 二叉树(一)

目录 1 基础知识 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 2 94. 二叉树的中序遍历 3 104. 二叉树的最大深度 4 226. 翻转二叉树 5 101. 对称二叉树 菜鸟做题&#xff0c;语言是 C 1 基础知识 二叉树常见的遍历方式有&#xff1a; 先序遍历中序遍历后序遍历…

基于YOLOv5+PySide6的火灾火情火焰检测系统设计深度学习

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225火灾 获取完整源码源文件已标注的数据集&#xff08;1553张&#xff09;配置跑起来说明 可有偿49yuan一对一远程操作&#xff0c;在你电脑跑起来 效果展示&#xff1a; ​数据集在下载的文件夹&#xff1a;yolov5-5.0\…

CRF算法(Conditional Random Fields)揭秘

CRF基本介绍 在机器学习中&#xff0c;建模线性序列结构的方法&#xff0c;除了HMM算法&#xff0c;另一个重要的模型就是CRF。HMM为了降低模型复杂性&#xff0c;对观测变量做了独立假设(即隐状态之间有相关性&#xff0c;而观测变量之间没有相关性)&#xff0c;这在某种程度…

单机取证-信息安全管理与评估-2022年国赛真题-环境+wp

🍬 博主介绍 博主介绍:大家好,我是 Mikey ,很高兴认识大家~ 主攻:【应急响应】 【python】 【数字取证】【单机取证】【流量分析】【MISC】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步 作者水平有限,欢迎各…

HuggingFists系统功能介绍(2)--数据源账号

数据源 再次&#xff0c;我们进入“数据源”管理模块。该模块用于管理我们在进行数据处理或分析时所需要的所有数据源。在定义任何的数据流程读写工作之前&#xff0c;必须先通过数据源管理模块创建出对应的数据源。数据源可以是我们需要进行数据处理时&#xff0c;原始数据所在…

uniapp上传文件到腾讯云

官方API地址 javaScript_SDK 下载cos npm i cos-js-sdk-v5 --save 生成签名 获取secretId和secretKey let cos new COS({SecretId: *******************************,SecretKey: ******************************,}) 参考文章&#xff1a;腾讯云如何获取secretId和secret…

C++中的左值和右值

目录 一. 左值和右值的概念 1. 左值 1.1 可修改的的左值 1.2 不可修改的左值 右值 二. 左值引用和右值引用 1. 左值引用 2. 右值引用 主要用途 1. 移动语义 2. 完美转发 2.1 引用折叠 2.2 std::forward 一. 左值和右值的概念 什么是左值和右值 1. 左值 左值是一个表示…

Linux内核源码安装

文章目录 前言查看内核源码包安装内核源码编译内核源码最后 前言 我是醉墨居士&#xff0c;我们安装一下Linux内核源码&#xff0c;方便我们学习Linux内核 也方便我们进行eBPF开发时查看Linux内核的一些信息 查看内核源码包 apt-cache search linux-source安装内核源码 因为…

【vue3语法】开发使用创建项目等

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、vue3创建vue3v2函数式、v3组合式api响应式方法ref、reactive计算属性conputed监听属性wacthvue3 选项式生命周期父子通信父传子defineProps编译宏 子传父de…

互联网加竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…

并查集例题(食物链)C++(Acwing)

代码&#xff1a; #include <iostream>using namespace std;const int N 50010;int n, m; int p[N], d[N];int find(int x) {if(p[x] ! x){int t find(p[x]);d[x] d[p[x]];p[x] t;}return p[x]; }int main() {scanf("%d%d", &n, &m);for(int i 1…

linux前端部署

安装jdk 配置环境变量 刷新配置文件 source profile source /etc/profile tomcat 解压文件 进去文件启动tomcat 开放tomcat的端口号 访问 curl localhsot:8080 改配置文件 改IP,改数据库名字&#xff0c;密码&#xff0c; 安装数据库 将war包拖进去 访问http:…

【Python笔记-设计模式】代理模式

一、说明 代理模式是一种结构型设计模式&#xff0c;提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在将请求提交给对象前后进行一些处理。 (一) 解决问题 控制对对象的访问&#xff0c;或在访问对象前增加额外的功能或控制访问 (二) 使用场景…

apidoc接口文档的自动更新与发布

文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五&#xff0c;配置定时运行六&#xff0c;docker运行七&#xff0c;不足与优化分析 一、概述 最近忙于某开源项目的接口文档整理&#xff0c;采用了apidoc来整理生成接口文档。 apidoc…

深度学习系列59:文字识别

1. 简单文本&#xff1a; 使用google加的tesseract&#xff0c;效果不错。 首先安装tesseract&#xff0c;在mac直接brew install即可。 python调用代码&#xff1a; import pytesseract from PIL import Image img Image.open(1.png) pytesseract.image_to_string(img, lan…

MES管理系统生产过程控制的核心要素

MES&#xff08;制造执行系统&#xff09;是为优化制造业生产过程和管理而设计的软件系统&#xff0c;其核心要素包括&#xff1a; 工单管理&#xff1a;工单管理是MES系统最基本的功能之一&#xff0c;它可以跟踪和管理各种类型的工单&#xff0c;如生产工单、维修工单和质量…

Spring篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、spring 支持集中 bean scope?二、spring bean 容器的生命周期是什么样的?三、什么是 spring 的内部 bean?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

Java EE改名Jakarta EE,jakarta对程序开发的影响

一、前言 很多Java程序员在使用新版本的Spring6或者springboot3版本的时候&#xff0c;发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候&#xff0c;也发展了大量jakarta的工程包。 比如&#xff1a;camunda的webapps编译工程就提供了2种方式javax和jaka…

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的多特征分类预测

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测 目录 SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍…

论文阅读:Ground-Fusion: A Low-cost Ground SLAM System Robust to Corner Cases

前言 最近看到一篇ICRA2024上的新文章&#xff0c;是关于多传感器融合SLAM的&#xff0c;好像使用了最近几年文章中较火的轮式里程计。感觉这篇文章成果不错&#xff0c;代码和数据集都是开源的&#xff0c;今天仔细读并且翻译一下&#xff0c;理解创新点、感悟研究方向、指导…