【python】在Python中读取和加解密PDF文件的详细教程与应用实战

news2024/11/13 11:34:30

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • 读取和加解密PDF文件
    • 准备工作
      • 安装必要的库
    • 读取PDF文件
      • 代码读取示例
    • 加密PDF文件
      • 使用PyPDF2加密PDF
        • 示例代码
      • 使用Spire.PDF for Python加密PDF
        • 示例代码
      • 使用Python设置PDF的安全权限
        • 什么是所有者密码(权限密码)?
        • 使用Python设置PDF安全权限的主要步骤如下:
    • 注意事项
    • 使用Python解密PDF
    • 高阶用法处理
      • 1. 错误处理
      • 2. 批量处理
      • 3. 加密选项的深入理解
      • 4. 性能优化
      • 5. 安全性考虑
      • 6. 学习和探索
    • 总结

读取和加解密PDF文件

在Python中读取和加密PDF文件是一项常见且实用的任务,尤其对于需要处理大量文档自动化处理的场景。本文将详细介绍如何使用Python读取PDF文件内容以及如何使用不同的库来给PDF文件加密。

准备工作

在开始之前,确保你的Python环境已经安装好,并安装了处理PDF文件所需的库。这里我们将使用两个主要的库:PyPDF2用于读取PDF内容,PyPDF2Spire.PDF for Python用于加密PDF文件。

安装必要的库

  1. 安装pdfplumber

    使用pip安装pdfplumber,这是读取PDF文件内容的一个常用库。

    pip install pdfplumber
    
  2. 安装PyPDF2

    PyPDF2是另一个用于处理PDF文件的库,支持读取、写入和加密等操作。

    pip install PyPDF2
    
  3. 安装Spire.PDF for Python

    Spire.PDF for Python是一个功能强大的库,支持多种PDF操作,包括创建、读取、修改和加密。不过,需要注意的是,Spire.PDF for Python并非开源库,通常需要从其官方网站或授权渠道获取。

    # 注意:这里只是示例,实际安装可能需要从官网下载或使用其他方式
    pip install Spire.Pdf
    

    如果无法从pip直接安装,可以访问Spire.PDF for Python的官方网站下载并安装。

读取PDF文件

在Python中,使用pdfplumber库都可以很方便地读取PDF文件的内容。以下是一个使用PyPDF2读取PDF文件内容的基本示例。

我们先查看下PDF文件
在这里插入图片描述

代码读取示例

def read_pdf(path):
    #pip install pdfplumber
    import pdfplumber
    with pdfplumber.open(path) as pdf:
    #    for i in range(len(pdf.pages)):
    #        page = pdf.pages[i]
    #        print(page.extract_text())
        for page in pdf.pages:
            print(page.extract_text())
if __name__ == "__main__":
    read_pdf('基于Python编写的FTP程序.pdf')

在这里插入图片描述

上述代码通过extract_text函数读取了指定路径的PDF文件内容,并打印出来。extract_text函数会自动处理PDF中的文本内容,包括文本布局、字体和编码等。

加密PDF文件

加密PDF文件是为了保护文件内容不被未授权访问。在Python中,可以使用PyPDF2Spire.PDF for Python库来实现PDF文件的加密。

使用PyPDF2加密PDF

PyPDF2是一个强大的库,用于处理PDF文件的各种操作,包括加密。以下是一个使用PyPDF2加密PDF文件的基本示例。

示例代码
import PyPDF2

def encrypt_pdf_with_pypdf2(input_pdf, output_pdf, password):
    # 创建PdfFileReader和PdfFileWriter对象
    pdf_reader = PyPDF2.PdfReader(input_pdf)
    pdf_writer = PyPDF2.PdfWriter()

    # 逐页添加内容到写入器
    for page_num in pdf_reader.pages:
        pdf_writer.add_page(page_num)

    # 加密PDF文件
    pdf_writer.encrypt(password)

    # 写入加密后的PDF文件
    with open(output_pdf, 'wb') as output_file:
        pdf_writer.write(output_file)

    print(f"PDF文件 {input_pdf} 已加密, 并保存为 {output_pdf}")

# 使用示例
encrypt_pdf_with_pypdf2('基于Python编写的FTP程序.pdf', 'encrypted_example.pdf', 'mysecretpassword')

在上述代码中,我们首先读取了一个PDF文件,然后逐页将其内容添加到PdfFileWriter对象中。最后,我们使用encrypt方法设置了一个密码,并将加密后的PDF文件保存到新的文件中。

在这里插入图片描述

打开pdf文件,已被加密
在这里插入图片描述

使用Spire.PDF for Python加密PDF

虽然PyPDF2是一个很好的库,但Spire.PDF for Python提供了更多高级功能,包括更强大的加密选项。以下是一个使用Spire.PDF for Python加密PDF文件的示例。

要加密PDF,你需要设置用户密码(文档打开密码),该密码将用于打开和查看文件。

什么是用户密码(文档打开密码)?

用户必须输入该密码才能打开和查看PDF文档。
它限制对PDF内容的访问,确保只有授权个人才能访问该文件。
用户密码不提供除打开PDF之外的任何其他权限或限制。
除了设置用户或打开密码外,你还需要设置用于保护PDF内容的加密级别或算法。Spire.PDF for Python支持以下加密级别或算法:

40-bit RC4
128-bit RC4
128-bit AES
256-bit AES
使用Python加密PDF文件的主要步骤如下:

创建PdfDocument实例,并使用PdfDocument.LoadFromFile()方法加载PDF文件。
创建一个PdfSecurityPolicy,并设置打开文档所需的用户密码。
通过PdfSecurityPolicy类中的EncryptionAlgorithm属性设置用于保护PDF的加密算法。
使用PdfDocument.Encrypt(securityPolicy:PdfSecurityPolicy)方法应用安全策略以加密PDF文档。
将加密的PDF文档保存为新文件。

示例代码

首先,请确保你已经正确安装了Spire.PDF for Python库。由于这个库不是通过pip直接安装的,你可能需要从其官方网站下载相应的Python包,并按照提供的说明进行安装。

from spire.pdf import *


# 创建document对象
doc = PdfDocument()
# 加载需要加密的现有PDF文件
doc.LoadFromFile("基于Python编写的FTP程序.pdf")

# 创建一个安全策略,并设置打开文档所需的用户密码
securityPolicy = PdfPasswordSecurityPolicy("userpassword", str())

# 指定用于保护PDF的加密算法
securityPolicy.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES_256



# 应用安全策略以加密PDF文档
doc.Encrypt(securityPolicy)

# 保存加密后的PDF文档
doc.SaveToFile("加密.pdf")

print("PDF文件 基于Python编写的FTP程序.pdf 已加密, 并保存为 加密.pdf ")

打开加密文件,已被加密
在这里插入图片描述

在上述代码中,我们首先使用doc.LoadFromFile方法加载了一个PDF文件。然后,我们创建了一个securityPolicy加密策略,并设置了用户密码、所有者密码、权限和加密级别。这里我们选择了AES 256位加密,并允许打印、修改内容和复制内容。最后,我们通过调用doc.Encrypt方法应用加密,并使用doc.SaveToFile方法保存加密后的PDF文件。

使用Python设置PDF的安全权限

要为PDF文档设置安全权限,除了用户密码外,你还需要设置所有者密码(权限密码)。

什么是所有者密码(权限密码)?

用于控制可在PDF文档上执行的权限和操作。
允许文档所有者限制某些操作,例如打印、复制、修改或从PDF中提取内容。
所有者密码通常比用户密码更强大,因为它赋予所有者对PDF安全设置的完全控制。

使用Python设置PDF安全权限的主要步骤如下:

创建PdfDocument实例,并使用PdfDocument.LoadFromFile()方法加载一个PDF文件。
创建一个PdfSecurityPolicy,并设置打开文档所需的用户密码和用于限制权限的所有者密码。
通过PdfSecurityPolicy类中的EncryptionAlgorithm属性设置用于保护PDF的加密算法。
禁止所有权限,然后通过PdfSecurityPolicy类中的DocumentPrivilege属性赋予特定权限。
使用PdfDocument.Encrypt(securityPolicy:PdfSecurityPolicy)方法应用安全策略以加密PDF文档。
将加密的PDF文档保存为新文件。

以下代码示例展示了如何使用Python设置PDF的安全权限:


from spire.pdf import *

# 创建PdfDocument对象
pdf = PdfDocument()
# 加载需要加密的现有PDF文件
pdf.LoadFromFile("基于Python编写的FTP程序.pdf")

# 创建一个安全策略,并设置打开文档所需的用户密码和用于限制权限的所有者密码
securityPolicy = PdfPasswordSecurityPolicy("userpassword", "ownerpassword")

# 设置加密算法
securityPolicy.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES_256

# 禁止所有权限
securityPolicy.DocumentPrivilege = PdfDocumentPrivilege.ForbidAll()
# 仅允许打印文档
securityPolicy.DocumentPrivilege.AllowPrint = True

# 加密所有文档内容,除了元数据(可选,用于允许搜索引擎访问文档的元数据)
# securityPolicy.EncryptMetadata = False

# 应用安全策略以加密PDF文档
pdf.Encrypt(securityPolicy)

# 将加密的PDF文档保存为新文件
pdf.SaveToFile("安全权限.pdf")
pdf.Close()

运行生成加密后的文件,打开需要密码userpassword
在这里插入图片描述

编辑需需要密码ownerpassword
在这里插入图片描述

我们看下有哪些权限
在这里插入图片描述

注意事项

  • 在使用加密功能时,请确保你了解不同加密级别和权限设置的影响。
  • 加密后的PDF文件将需要密码才能打开或进行某些操作,因此请确保你妥善保管密码。
  • 如果你在处理大量PDF文件或需要更高级的功能(如数字签名、表单填充等),考虑使用更专业的库,如Spire.PDF for Python

使用Python解密PDF

加密的PDF文件可以使用其用户密码或所有者密码打开。打开后,你可以使用PdfDocument.Decrypt()方法对其进行解密。

使用Python解密加密PDF文件的主要步骤如下:

创建PdfDocument实例,并使用PdfDocument.LoadFromFile()方法加载加密的PDF文件。
调用PdfDocument.Decrypt()方法解密PDF文件。
将解密后的PDF文件保存为新文件。
以下代码示例展示了如何使用Python解密PDF文件:


from spire.pdf import *

# 创建PdfDocument对象
pdf = PdfDocument()
# 使用用户密码或所有者密码打开加密的PDF文档
pdf.LoadFromFile("安全权限.pdf", "userpassword")

# 解密PDF文档
pdf.Decrypt("ownerpassword")

# 将解密后的文档保存为新文件
pdf.SaveToFile("解密后文件.pdf")
pdf.Close()

在这里插入图片描述
解密后的pdf直接能打开。

当然,我们可以继续探讨一些高级话题和最佳实践,特别是在处理PDF文件时。以下是一些额外的考虑点和技巧,可以帮助你更有效地在Python中处理PDF文件。

高阶用法处理

1. 错误处理

在处理文件时,错误处理是非常重要的。无论是读取文件还是写入文件,都可能会遇到各种问题,如文件不存在、权限不足、磁盘空间不足等。因此,在你的代码中添加适当的错误处理逻辑是很重要的。

try:
    # 尝试读取或写入PDF文件的代码
    # ...
except FileNotFoundError:
    print(f"文件 {file_path} 未找到。")
except PermissionError:
    print(f"没有权限访问文件 {file_path}。")
except Exception as e:
    print(f"处理文件时发生错误:{e}")

2. 批量处理

如果你需要处理多个PDF文件,编写一个能够批量处理这些文件的脚本将非常有用。你可以使用Python的循环结构(如for循环)来遍历文件列表,并对每个文件执行相同的操作。

import os

def process_pdfs(folder_path, output_folder, password):
    # 获取文件夹中所有PDF文件的列表
    pdf_files = [f for f in os.listdir(folder_path) if f.endswith('.pdf')]

    # 遍历文件列表并处理每个文件
    for file in pdf_files:
        input_path = os.path.join(folder_path, file)
        output_path = os.path.join(output_folder, f"encrypted_{file}")
        
        # 这里可以调用加密函数
        # encrypt_pdf(input_path, output_path, password)
        
        # 示例:仅打印将要处理的文件路径
        print(f"正在处理 {input_path} ...")

# 使用示例
process_pdfs('input_pdfs', 'output_pdfs', 'mysecretpassword')

3. 加密选项的深入理解

当你使用PyPDF2Spire.PDF for Python等库加密PDF文件时,了解不同的加密选项和权限设置是非常重要的。例如,你可以设置不同的用户密码和所有者密码,以及控制哪些操作(如打印、修改、复制等)被允许。

  • 用户密码:用于打开和查看PDF文件。
  • 所有者密码:用于修改PDF文件的加密设置,包括更改密码和权限。
  • 权限:定义了对PDF文件可以执行哪些操作,如打印、修改内容、复制内容等。

4. 性能优化

如果你需要处理大型PDF文件或大量文件,性能可能会成为一个问题。以下是一些优化性能的方法:

  • 使用多线程或多进程:Python的threadingmultiprocessing模块可以帮助你并行处理多个文件,从而加快处理速度。
  • 内存管理:确保你的脚本不会消耗过多的内存。在处理大型文件时,考虑使用流式处理或分批处理文件内容。
  • 选择高效的库:不同的库在处理PDF文件时的性能可能会有所不同。根据你的具体需求选择最合适的库。

5. 安全性考虑

当你加密PDF文件时,请确保你使用的加密方法和密码足够强大,以防止未经授权的访问。以下是一些安全性考虑点:

  • 使用强密码:选择包含大小写字母、数字和特殊字符的复杂密码。
  • 定期更改密码:如果你经常处理敏感信息,请定期更改你的加密密码。
  • 了解加密算法的局限性:虽然AES等现代加密算法非常强大,但它们也有其局限性。了解你选择的加密算法的优缺点是很重要的。

6. 学习和探索

PDF处理是一个广泛而复杂的领域,有许多不同的库和工具可供选择。除了PyPDF2Spire.PDF for Python之外,还有其他一些流行的库,如pdfplumber(用于提取文本和表格)、ReportLab(用于创建PDF文件)等。花时间学习和探索这些库将帮助你更好地处理PDF文件。

希望这些额外的信息和技巧对你有所帮助!如果你有任何其他问题或需要进一步的帮助,请随时提问。

总结

在Python中读取和加密PDF文件是一个相对直接的过程,通过使用PyPDF2Spire.PDF for Python等库,你可以轻松地实现这些功能。根据你的具体需求(如加密级别、性能要求、预算等),你可以选择最适合你的库。希望本文对你有所帮助!

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

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

相关文章

Python酷库之旅-第三方库Pandas(082)

目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …

go语言源码解读之数据结构堆

概述 堆(heap),是一种计算中常用的数据结构。本文我们将探讨对的特性、实现细节以及实际应用场景。 基本概念 堆是一种特殊的完全二叉树。堆分为大顶堆与小顶堆。 大顶堆的特点是,父节点的值总是大于或等于其子节点的值。 小顶堆的特点是&#xff0c…

SocialFi新纪元:Match革新金融与社交的融合艺术

前言 Match在SocialFi领域的创新探索,或将金融与社交的融合艺术推向新的高度! SocialFi自带"爆点”属性,Web 3.0巨型流量池 统计数据显示,2023年第三季度,全球约有54亿人活跃在互联网上,而社交媒体领…

江协科技STM32学习笔记(第13章 WDG看门狗)

第13章 WDG看门狗 13.1 WDG看门狗 13.1.1 WDG简介 看门狗就是程序运行的一个保障措施,我们得在程序中定期地喂狗,如果程序卡死了,没有在规定的时间里喂狗,那么看门狗硬件电路就会自动帮我们复位一下,防止程序长时间…

<keep-alive> 一分钟了解

<keep-alive> 一分钟了解 <keep-alive> 是 Vue.js 提供的一个抽象组件&#xff0c;它的主要用途是在页面或组件切换时保留其状态&#xff0c;避免重复执行昂贵的渲染操作&#xff0c;从而提升应用性能。 文章目录 <keep-alive> 一分钟了解 一、 <keep-ali…

Ubuntu如何实现每天定时关机

要在Ubuntu中实现每天定时关机&#xff0c;你可以使用cron来安排定时任务。以下是具体的步骤&#xff1a; 步骤 1: 创建脚本 打开终端。使用文本编辑器创建一个新的文件。例如&#xff1a; nano ~/shutdown_script.sh 步骤 2: 编写脚本 在编辑器中输入以下内容&#xff1a…

华府便利店信息管理系统

TOC springboot239华府便利店信息管理系统 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

花四小时,写了个在线实时绘制等值面图小软件,明晚上线,喜欢的小伙伴关注哦

科研党的福音&#xff0c;绘图再也不需要安装一堆软件了&#xff0c;可以在线绘图了&#xff1b; 只需要传入绘制的区间、色值、以及所需要绘制的数据就可以直接出图了&#xff0c;可绘制各种等值面图&#xff0c;比如降水分布&#xff0c;高温分布&#xff0c;人口分布&#x…

文心快码真的很好用!!!

最近被身边的好友安利到了一个百度的新产品文心快码&#xff08;comate&#xff09;&#xff0c;没想到体验下来真的很好用&#xff0c;非常容易上手&#xff0c;解放了我的双手&#xff0c;提高了代码生产力&#xff01;可能有很多小伙伴不知道怎么使用comate,而我作为这类工具…

C语言-将n个数输入时顺序的逆序排列,用指针函数实现

一、题目要求&#xff1a; 将n个数输入时顺序的逆序排列&#xff0c;用指针函数实现 二、程序: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int n;printf("请输入一共有多少数:\n");scanf("%d", &n);int arr[100], i;…

大模型之二十五-人工智能新纪元

人类社会正式从信息科技时代步入了人工智能时代&#xff0c;相比信息科技革命&#xff0c;人工智能科技革命的影响要深远的多&#xff0c;在这新旧交替剧烈变革期&#xff0c;绝大多数人都有机会。 为了更好的理解人工智能科技革命&#xff0c;首先我们首先梳理一下技术的发展…

使用VNC-viewer对树莓派5 远程连接桌面—详细记录笔记版

树莓派5 的远程桌面连接&#x1f680; 在完成了对树莓派镜像的安装&#xff0c;以及点亮了屏幕之后&#xff0c;接下来就是为开发做一些准备&#xff0c;就是配置树莓派5的远程的桌面的操作&#xff0c;因为如果不这样的话&#xff0c;我在PC上和树莓派系统上分别进行作业的时候…

了解数据库中常用存储引擎数据结构(2)

目录 深入了解B树及其变种 BTree BTree B*Tree BTree并发机制 B-Link Tree 深入了解B树及其变种 先把我们要解释的B树变种都列出来&#xff0c;B树的变种主要有B树、B*树、B-Link树、COW B树、惰性B树、Bw树等。 下面具体来分析这些变种的优势和发展趋势。 BTree 下图…

C语言整数溢出的问题

补漏&#xff1a; 昨天我在开头提到-1的二进制如何表示&#xff0c;我在这里简单分析一下。 首先我们要明白有符号的数转换是需要补码的&#xff0c;所以我们想这个问题之前将补码的规则思考一遍&#xff08;首先将有符号的首位保留&#xff0c;后面几位取反后加一&#xff0…

数据结构初阶——算法复杂度超详解

文章目录 1. 数据结构前言1. 1 数据结构1. 2 算法 2. 算法效率2. 1 复杂度的概念 3. 时间复杂度3. 1 大O的渐进表示法3. 2 时间复杂度计算示例3. 2. 1 示例13. 2. 2 示例23. 2. 3 示例33. 2. 4 示例43. 2. 5 示例53. 2. 6 示例63. 2. 7 示例7 4. 空间复杂度4. 1 空间复杂度计算…

螺丝虽小,但其质量关乎家具安全——业内解读紧固件生产标准

螺丝是家具组装中不可或缺的部件&#xff0c;其质量直接影响到家具的牢固性和安全性。因此&#xff0c;在生产螺丝时&#xff0c;必须确保螺丝符合家具组装的耐用性和安全性要求。确保生产出来的螺丝符合家具组装的耐用性和安全性要求&#xff0c;需要从设计、材料选择、生产工…

思维导图软件哪个好?这里有4款专业工具供你选择!

如何选择适合自己的思维导图软件&#xff1f;哪个思维导图软件好&#xff1f;选择思维导图工具时需要考虑使用的场景&#xff0c;操作的难易程度和性价比。在此基础上&#xff0c;我筛选了4款比较优秀的思维导图工具分享给大家。 1、福昕导图软件 传送门&#xff1a;pdf365.cn…

重写的介绍

一、基本介绍 1、基本介绍 重写又称为覆盖(override)&#xff0c;即子类继承父类的属性和方法后&#xff0c;根据业务需求&#xff0c;再重新定义同名的属性或方法 2、案例演示 二、练习 class Person:nameNoneageNonedef __init__(self,name,age):self.namenameself.ageage…

FastAPI+SQLModel开发角色的增删改查接口实战,附完整代码

实现查询角色的功能 完整代码&#xff1a; router.get("/", summary"角色查询") def get_role(page: int 1,size: int 20,name: str "",nickname: str "",db: SASession Depends(get_db), ):"""分页查询文件&qu…

面试被问到关于软件测试计划方面的面试题,怎么样回答好。

1、软件的评审一般由哪些人参加?其目的是什么? 参考答案&#xff1a; 在正式的会议上将软件项目的成果(包括各阶段的文档、产生的代码等)提交给用户、客户或有关部门人员对软件产品进行评审和批准。其目的是找出可能影响软件产品质量、开发过程、维护工作的适用性和环境方面…