python实现给pdf文件加骑缝章效果

news2025/1/16 4:49:04

骑缝章是在合同上经常看到的一种盖章方式,如下图所示。现在电子合同的应用已经越来越广泛,合同上如何实现骑缝章的效果 ,也是有必要研究一下的。本文几乎Python的方式,讲述了如果对印章图片进行处理,然后,实现给Pdf文件加上骑缝章的效果。
骑缝章

运行环境

  • Python3.0+

实现思路

实现思路如下:

印章PNG文件
印章图片分割
PDF合同文件
读取页数
创建空白同页数PDF文件
图片绘制PDF制定位置
临时PDF
融合
最终结果

一定要避免一个误区,尽量不要在word上操作,然后再转PDF。python实现Word转PDF基本都要依赖于windows上安装的Word程序,这就限制了只能在Windows上运行。

实现效果

注意,必须是A4纸大小的PDF文件
实现效果

核心代码

图片分割

def xz(image_path, count):
    """
    将图片水平分割
    :param image_path:PNG图片路径
    :param count: 页数
    :return:
    """

    img_path = image_path
    # 判断是否有效
    if img_path != '':
        print(img_path)  # 图片路径
        # 分割成1行
        img_split_row = 1  # 行数
        # 分割成几列
        sp = count  # 输入拆分列数量
        img_split_col = int(sp)
        # 要保存的图片路径(保存为png图片格式)
        if os.path.dirname(img_path) == "":
            img_path = os.getcwd() + os.sep + img_path
        img_save = os.path.dirname(img_path) + os.sep + "images" + os.sep
        if not os.path.exists(img_save):
            os.makedirs(img_save)
        # 分割图片
        img_ext_name = os.path.splitext(os.path.basename(img_path))[1]
        img_now = imim.open(img_path)
        split_size_w = int(img_now.size[0] / img_split_col)
        split_size_h = int(img_now.size[1] / img_split_row)
        result_path = []
        for r in range(img_split_row):
            for c in range(img_split_col):
                split_area = (split_size_w * c, r * split_size_h, split_size_w * (c + 1), split_size_h * (r + 1))
                # print( (r*img_split_col+c+1) );
                img_now.crop(split_area).save(img_save + str(r * img_split_col + c + 1) + img_ext_name)
                result_path.append(img_save + str(r * img_split_col + c + 1) + img_ext_name)
                time.sleep(0.5)  # 等待
        # 结束
        print("图片分割结束,一共" + str(img_split_row * img_split_col) + "张图片(保存在" + img_save)
        return (result_path, split_size_w, split_size_h)

PDF合成

from PyPDF2 import PdfReader,PdfWriter
import os


def merge_pdf(water_pdf, target_pdf, result_path):
    """
    两个pdf融合
    :param water_pdf: 水印PDF文件
    :param target_pdf: 合同PDF文件
    :param result_path: 结果输出录路径
    :return: 
    """
    # 获取页数
    pages_count = get_num_pages(target_pdf)
    watermark_reader = PdfReader(target_pdf)
    # 读取需要被添加水印的PDF
    reader = PdfReader(water_pdf)
    writer = PdfWriter()
    # 遍历所有页面
    for page_index in range(0, pages_count):
        # 合并水印页面
        page = watermark_reader.pages[page_index]
        page.merge_page(reader.pages[page_index])
        writer.add_page(page)

    with open(result_path, "wb") as f:
        writer.write(f)

源代码下载

如果还有疑问,可以前往下载源代码https://download.csdn.net/download/GISuuser/87387763

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

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

相关文章

JAVA校园闲置物品交易系统源码+数据库,为在校师生提供闲置物品发布、物品查询、物品交易等功能

校园闲置平台 校园闲置物品交易系统,为在校师生提供闲置物品发布、物品查询、物品交易等功能。 使用JAVA编写的(javaweb和ssm) Summary 项目的技术栈项目功能介绍项目运行环境部署项目 项目的技术栈 IoC容器:Spring web框架:SpringMVC (PHP版为ThinkPHP) orm…

不会数学的程序员,只能走到初级开发工程师!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 在我还是初级程序员时,每天也都粘贴着代码和包装着接口。那个阶段并没有意识到数学能在编程中起到什么作用&#xff…

【Java基础】-【集合类】

目录Java中的容器(集合类)Java中的容器,线程安全和线程不安全的分别有哪些?Map接口的实现类Map put的过程如何得到一个线程安全的Map?HashMap的特点JDK7和JDK8中的HashMap有什么区别?HashMap底层的实现原理…

【年度总结】2022回首瞻望 | 2023大展宏“兔“

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读,阿里云社区专家博主,华为云社区云享专家,CSDN SAP应用技术领域新兴创作者。   在学习工…

GO语言配置和基础语法应用(三)

C语言是直接影响Go语言设计的语言之一。 Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译)。 package mainimport "fmt"func main() {fmt.Println("Hello, 世界")…

一行代码加速Pytorch推理速度6倍

一行代码加速Pytorch推理速度6倍 Torch-TensorRT 是 PyTorch 的集成,它利用 NVIDIA GPU 上的 TensorRT 推理优化。 只需一行代码,它就提供了一个简单的 API,可在 NVIDIA GPU 上提供高达 6 倍的性能加速。 话不多说, 线上代码, 再解释原理!!…

【论文精读】Scaling distributed machine learning with the parameter server

Scaling distributed machine learning with the parameter server前言Abstract1. Introduction1.1 Contributions1.2 Engineering Challenges1.3 Related Work2. Machine Learning2.1 Goals2.2 Risk Minimization2.3 Generative Models3. Architecture3.1 (Key,Value) Vectors…

设计模式简要汇总

一、面向对象设计原则 开闭原则:一个软件实体(类、模块、函数)应该对扩展开放,对修改关闭。依赖倒置原则:高层模块不应该依赖底层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依…

语义分割——FCN模型pytorch实现

FCN网络简介 全卷积网络(Fully Convolutional Networks,FCN)是Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图像语义分割的一种框架,是首个端对端的针对像素级预测的全卷…

BIGEMAP APP离线卫星地图数据应用

离线包(高清卫星图): 1、一次下载永久可用,访问更快,下载更快 2、离线包数据可自动更新,无需重新下载,更新3到6个月一次 3、离线包可在无网络离线环境下使用,不受网络限制 4、离线包…

Springboot打成JAR包后读取配置文件

Springboot的默认配置文件为:application.properties或者是application.yml 如果这两个配置文件都存在,不冲突的话,就互相补充。冲突的话,则properties优先级高。 当我们使用IDEA创建出一个Springboot项目上时,配置文…

Git从入门到精通

目录 Git 配置 1. 在安装完成 Git 后,开始正式使用前,是需要有一些全局设置的,如用户名、邮箱。 2. 除了用户名、邮箱之外,还有很多的配置可以用来自定义 Git,如: 3. 查看所有的已经做出的配置&#xff…

Python3 常用内置函数解析(共28个函数)

文章目录一:Python3 操作符(大全)二:函数带括号与不带括号的区别三:不可变数据类型与可变数据类型四:Python3 内置函数(大全)1、input():用于获取控制台的输入。2、print…

Django REST framework--渲染器

Django REST framework--渲染器Django REST framework--渲染器自定义接口规范渲染器基本原理Django 项目debug调试技巧异常信息处理配置异常处理模块自定义异常处理Django REST framework–渲染器 自定义接口规范 目前使用的是REST框架默认的返回格式,类似这种 […

【redis6】第十章(事务和锁机制)

Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、discard 从输入Mu…

2023年面试题之Dubbo基础架构

一. Dubbo 的整体架构设计有哪些分层?接口服务层(Service):该层与业务逻辑相关,根据 provider 和 consumer 的业务设计对应的接口和实现配置层(Config):对外配置接口,以 ServiceCon…

Docker 应用实践-镜像篇

一个 Docker 镜像往往是由多个镜像层(可读层)叠加而成,每个层仅包含了前一层的差异部分,单个镜像层也往往可以看作镜像使用,当我们启动一个容器的时候,Docker 会加载镜像层并在其上添加一个可写层。容器上所…

C语言学习——字符函数和字符串函数

🌇个人主页:平凡的小苏 📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情 🛸C语言专栏:https://blog.csdn.net/vhhhbb/category_12174730.html 小苏希望大家能从这篇文章中收获到许…

实战Kaggle比赛:预测房价

实战Kaggle比赛:预测房价 目录 下载和缓存数据集访问和读取数据集数据预处理训练K折交叉验证模型选择提交Kaggle预测 本节我们将通过Kaggle比赛,将所学知识付诸实践。 Kaggle的房价预测比赛是一个很好的起点。 此数据集由Bart de Cock于2011年收集 (D…

Linux--线程互斥与同步--0112 13

线程互斥 1.背景概念 临界资源:多线程执行流共享的资源就叫做临界资源。 临界区:每个线程内部,访问临界资源的代码就叫做临界区。 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区 ,对临界资源起保…