python+PyPDF2实现PDF的文本内容读取、多文件合并、旋转、裁剪、缩放、加解密、添加水印

目录

读取内容

合并文件

旋转 

缩放

裁剪

加密和解密

添加水印


安装:pip install PyPDF2 -i https://pypi.tuna.tsinghua.edu.cn/simple

读取内容

from PyPDF2 import PdfReader, PdfMerger, PdfWriter

def read_pdf(pdf_path):
    pdf_reader = PdfReader(pdf_path)

    # print(len(pdf_reader.pages))  # 获取页数
    # one_page = pdf_reader.pages[0]  # 获取第一页对象

    for page in pdf_reader.pages:
        print(page.extract_text())  # 读取内容

合并文件

def merger_pdf(pdf_path: str, pdf_names: list):
    pdf_mg = PdfMerger()  # 创建合并对象
    for pdf_name in pdf_names:
        pdf_mg.append(rf'{pdf_path}\{pdf_name}')
    # position(或page_number,position与page_number使用效果一样,不能同时使用)将目标pdf中的目标页内容合并到指定页,fileobj 要被合并的pdf文件,pages(n,m) 要合并文件的第{n+1}页到第{m}页
    pdf_mg.merge(page_number=1, fileobj=rf'{pdf_path}\9.pdf', pages=(3, 6))
    pdf_mg.write(rf'{pdf_path}\合并后的pdf.pdf')
    pdf_mg.close()

旋转 

def rotate_pdf(pdf_path: str, pdf_names: list):
    reader = PdfReader(rf'{pdf_path}\{pdf_names[1]}')
    writer = PdfWriter()

    # 将读取的页对象旋转90,旋转参数必须是90的倍数(顺时针旋转)
    page = reader.pages[0].rotate(90)
    writer.add_page(page)

    # 将写入的内容旋转-90度(逆时针旋转)
    writer.add_page(reader.pages[0])
    writer.pages[1].rotate(-90)

    writer.append(rf'{pdf_path}\{pdf_names[2]}')  # 追加其他pdf到文件中
    writer.append(rf'{pdf_path}\{pdf_names[-1]}', pages=(2, 7))  # pages参数可指定要追加的页对象(实例为第3页到第6页)

    with open(rf'{pdf_path}\旋转测试.pdf', 'wb') as f:
        writer.write(f)
    writer.close()

缩放

def scale_pdf(pdf_path: str, pdf_names: list):
    writer = PdfWriter()

    writer.append(rf'{pdf_path}\{pdf_names[-1]}', pages=(2, 7))  # pages参数可指定要追加的页对象(实例为第3页到第6页)

    page_last = writer.pages[-1]
    print(page_last.mediabox.width)  # 打印页面尺寸
    print(page_last.mediabox.height)  # 打印页面尺寸
    
    # page_last.scale_to(200,255)  # 修改宽高为指定的大小
    # page_last.scale(2,2)  # 按照原来页面大小成倍缩放,可分别指定要缩放的宽高比例倍数
    page_last.scale_by(3)  # 成倍缩放,不能指定宽高
    
    with open(rf'{pdf_path}\缩放测试.pdf', 'wb') as f:
        writer.write(f)
    writer.close()

裁剪

def tailor_pdf(pdf_path: str, pdf_names: list):
    writer = PdfWriter()
    writer.append(rf'{pdf_path}\{pdf_names[-1]}', pages=(2, 7))  # pages参数可指定要追加的页对象(实例为第3页到第6页)
    page_last = writer.pages[-1]

    # 裁剪(单位为磅)
    # 1磅 = 1 / 72英寸
    # 1英寸 = 25.4毫米
    page_two = writer.pages[1]
    page_two.mediabox.upper_left = (0, 0)
    page_two.mediabox.upper_right = (page_last.mediabox.width / 2, 0)
    page_two.mediabox.lower_left = (0, page_last.mediabox.height / 2)
    page_two.mediabox.lower_right = (page_last.mediabox.width / 2, page_last.mediabox.height / 2)

    with open(rf'{pdf_path}\裁剪测试.pdf', 'wb') as f:
        writer.write(f)
    writer.close()

加密和解密

def crypt_pdf(pdf_path: str, pdf_names: list):
    writer = PdfWriter()
    writer.append(rf'{pdf_path}\{pdf_names[-1]}', pages=(2, 7))  # pages参数可指定要追加的页对象(实例为第3页到第6页)
    writer.encrypt('adc123')  # 加密
    with open(rf'{pdf_path}\加密文件.pdf', 'wb') as f:
        writer.write(f)
    writer.close()

    encrypt_file = PdfReader(rf'{pdf_path}\加密文件.pdf')
    if encrypt_file.is_encrypted:  # 判断是否加密
        encrypt_file.decrypt('adc123')  # 解密
    for page in encrypt_file.pages:
        print(page.extract_text())  # 读取内容

添加水印

merge_page的功能用来合并页面,可找一个只有水印的空白页,作为合并对象

def watermark_pdf(pdf_path: str, pdf_names: list):
    writer = PdfWriter()
    reader = PdfReader(rf'{pdf_path}\9.pdf')
    watermark_page = PdfReader(rf'{pdf_path}\{pdf_names[2]}').pages[0]  # 获取一个水印页面对象
    for p in reader.pages:  # 循环将水印页面增加到每一页
        p.merge_page(watermark_page)
        writer.add_page(p)
    with open(rf'{pdf_path}\水印测试.pdf', 'wb') as f:
        writer.write(f)
    writer.close()

其他方法

    writer.remove_text()  # 清空文本
    writer.remove_images()  # 清空图片
    writer.remove_links()  # 清空链接
    writer.add_blank_page(100,500)  # 新增空白页,可指定空白页的宽高

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)

文章目录 前言一、QLineEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:用户登录界面5.示例二:验证两次输入的密码是否一致显示密码 二、TextEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:获取多行输入框的内容5.示例二&#x…

Vue3:uv-upload图片上传

效果图&#xff1a; 参考文档&#xff1a; Upload 上传 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 (uvui.cn) 代码&#xff1a; <view class"greenBtn_zw2" click"handleAddGroup">添加班级群</vie…

通过Docker Compose来实现项目可以指定读取不同环境的yml包

通过Docker Compose来实现项目可以指定读取不同环境的yml包 1. 配置文件2. 启动命令 切换不同环境注意挂载的文件权限要777 1. 配置文件 version: 3.8 services:docker-test:image: openjdk:8-jdk-alpineports:- "${APP_PORT}:${CONTAINER_PORT}"volumes:- "${J…

华为实训课笔记 2024 1223-1224

华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…

EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台&#xff0c;作为基于国标GB28181协议的视频流媒体平台&#xff0c;为用户提供了强大的视频监控直播功能。然而&#xff0c;在实际应用中&#xff0c;P2P远程访问可…

Vnlhun靶场Log4j2漏洞

相关概念 log4j2是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞 漏洞原理 简单说就是当你使⽤log4j2中提供的⽅法去输出⽇志信息时&#xff0c;⽐如说最常⻅…

千兆网中的gmii与rgmii

物理链路上是千兆网。1 Gbps1000 Mb/s1000/8 MB/s125 MB/s&#xff0c;这是和你的测试设备相连的1 Gbps物理带宽下的极速。关键点是1 B&#xff08;byte&#xff09;8 b&#xff08;bit&#xff09;。实际下载速度还取决于下载源的限制、出口的物理链路和运营商的限制。

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

重温设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…

【恶意软件检测】一种基于API语义提取的Android恶意软件检测方法(期刊等级:CCF-B、Q2)

一种基于API语义提取的Android恶意软件检测方法 A novel Android malware detection method with API semantics extraction 摘要 由于Android框架和恶意软件的持续演变&#xff0c;使用过时应用程序训练的传统恶意软件检测方法在有效识别复杂演化的恶意软件方面已显不足。为…

【微信小程序】2|轮播图 | 我的咖啡店-综合实训

轮播图 引言 在微信小程序中&#xff0c;轮播图是一种常见的用户界面元素&#xff0c;用于展示广告、产品图片等。本文将通过“我的咖啡店”小程序的轮播图实现&#xff0c;详细介绍如何在微信小程序中创建和管理轮播图。 轮播图数据准备 首先&#xff0c;在home.js文件中&a…

RT-DETR学习笔记(2)

七、IOU-aware query selection 下图是原始DETR。content query 是初始化为0的label embedding, position query 是通过nn.Embedding初始化的一个嵌入矩阵&#xff0c;这两部分没有任何的先验信息&#xff0c;导致DETR的收敛慢。 RT-DETR则提出要给这两部分&#xff08;conten…

fpgafor循环语句使用

genvar i;//循环变量名称 generate for(i0;i<4;ii1)begin:tx//自己定义名称 //循环内容 end endgenerate12位的16进制乘以4就是48位位宽的2进制 因为 222*2(2^4)16

62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)

项目介绍 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进…

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

路由器转发数据报的封装过程

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器转发数据的封装过程 路由器转发数据的封…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module)&#xff0c;它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode&#xff0c;它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API&#xff0c;比如最常…

虚拟机桥接模式

主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单&#xff1a;编辑>虚拟机网络编辑&#xff0c;点击“更改设置”&#xff0c;可以看到三个网卡&#xff0c;这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0&#xff0c;如果没看到这个网卡&…

重温设计模式--享元模式

文章目录 享元模式&#xff08;Flyweight Pattern&#xff09;概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式&#xff08;Flyweight Pattern&#xff09;概述 定义&#xff1a; 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…