python操作pdf、word、csv

该博客介绍了使用Python的PyPDF2库进行PDF操作,包括如何创建PDF(复制页面)、旋转页面、叠加页面(添加水印)、加密与解密PDF文件,以及如何通过密码本进行暴力破解加密的PDF。文章详细展示了每个操作的代码实现过程,提醒读者在设置密码时避免使用弱密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建pdf(复制页面)

PyPDF2不允许直接编辑PDF,必须创建一个新的PDF,然后从已有的文档复制内容

import PyPDF2
"""
创建pdf的步骤,PyPDF2不允许直接编辑PDF,必须创建一个新的PDF,然后从已有的文档复制内容
    1. 打开或创建1个或多个已有的PDF(源PDF),得到PdfFileReader对象
    2. 创建一个新的PdfFileWriter对象
    3. 将页面从PdfFileReader对象复制到PdfFileWriter对象中。
    4. 利用PdfFileReader对象写入输出的pdf.
创建一个PdfFileWriter对象,只是在Python中创建了一个代表PDF文档的值,这并没有创建实际的PDF文件,
要生成实际的PDF文件,必须调用PdfFileWriter对象的writer()方法。 
"""

pdf1File = open('./report1.pdf', 'rb')
pdf2File = open('./report2.pdf', 'rb')
pdf1Reader = PyPDF2.PdfFileReader(pdf1File)
pdf2Reader = PyPDF2.PdfFileReader(pdf2File)
pdfWriter = PyPDF2.PdfFileWriter()

for pageNum in range(pdf1Reader.numPages):
    pageObj = pdf1Reader.getPage(pageNum)
    pdfWriter.addPage(pageObj)

for pageNum in range(pdf2Reader.numPages):
    pageObj = pdf2Reader.getPage(pageNum)
    pdfWriter.addPage(pageObj)

pdfOutputFile = open('combinedminutes.pdf', 'wb')
pdfWriter.write(pdfOutputFile)
pdfOutputFile.close()
pdf1File.close()
pdf2File.close()

2. 旋转页面

import PyPDF2
# 旋转页面
pdffile = open('./combinedminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdffile)
page = pdfReader.getPage(0).rotateCounterClockwise(90)

pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(page)
resultPdfFile = open('rotatedPage.pdf', 'wb')
pdfWriter.write(resultPdfFile)
resultPdfFile.close()
pdffile.close()

3. 叠加页面(水印)

import PyPDF2
'''
    PyPDF2也可以将一页的内容叠加到另一页,这可以用来在页面上添加公司标志、时间戳或水印,
    可以很容易为多个文件添加水印,并且只针对程序指定的页面添加
'''
pdffile = open('./combinedminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdffile)
pdfWatermarkReader = PyPDF2.PdfFileReader(open('./watermark.pdf', 'rb'))
pdfWriter = PyPDF2.PdfFileWriter()

for pagenum in range(0,pdfReader.numPages):
    pageobj = pdfReader.getPage(pagenum)
    pageobj.mergePage(pdfWatermarkReader.getPage(0))
    pdfWriter.addPage(pageobj)

resultPdfFile = open('watermarkCover.pdf', 'wb')
pdfWriter.write(resultPdfFile)
pdffile.close()
resultPdfFile.close()

4. pdf的加密与解密

import PyPDF2
# # 加密pdf
pdffile = open('./combinedminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdffile)

pdfWriter = PyPDF2.PdfFileWriter()
for pagenum in range(pdfReader.numPages):
    pdfWriter.addPage(pdfReader.getPage(0))

pdfWriter.encrypt('xyz123')
resultPdf = open('entryptedfile.pdf', 'wb')
pdfWriter.write(resultPdf)
resultPdf.close()
pdffile.close()
import PyPDF2
# 解密pdf
pdfReader = PyPDF2.PdfFileReader(open('entryptedfile.pdf', 'rb'))
# 如果PDF是加密的返回true,否则返回false
print(pdfReader.isEncrypted)
# 在文件用正确的口令之前解密之前,尝试调用函数来读取文件将会导致错误
# 要读取加密的PDF,需调用decrypt()函数 ;口令正确返回1,否则返回0
# pdfReader.decrypt('xyz123')
print(pdfReader.decrypt('xyz123'))

pageobj = pdfReader.getPage(0)
# print(pageobj.extractText())      # 提取页面内容
resultPdfFile = open('解密后的文件.pdf', 'wb')
pdfWriter.write(resultPdfFile)
resultPdfFile.close()

注意:decrypt函数只解密了PdfFileReader对象,而不是实际的PDF文档。在程序终止后,硬盘上的文件仍然是加密的。在程序下次运行时,任然需要再次调用decrypt()

5 使用密码本对加密的pdf文件进行暴力破解

# -*- coding: utf-8 -*-
import time
from PyPDF2 import PdfFileReader, PdfFileWriter

# 1 穷举法:生成6位数字+字母密码本,极为耗时!!!!不建议采用
# string='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'#这里加上你想要的字符
# stm=time.time()
# with open('password.txt','a') as dic:#在当前目录生成password.txt文件
#     for a in range(len(string)):
#         for b in range(len(string)):
#             for c in range(len(string)):
#                 for d in range(len(string)):
#                     for e in range(len(string)):
#                         for f in range(len(string)):
#                                     pwd=string[a]+string[b]+string[c]+string[d]+string[e]+string[f]#生成6位数字字母密码
#                                     dic.write(pwd)
#                                     dic.write('\n')
#                                     print('密码正在写入文件:', pwd)
# ent=time.time()
# print('成功生成密码本!用时%f分'%((ent-stm)/60))


pdf_reader = PdfFileReader('entryptedfile.pdf')
pdf_writer = PdfFileWriter()
stm=time.time()
# 2 读取密码字典文件里的密码,进行暴力破解
i = 0
with open('password0.txt', 'r', encoding='gb18030', errors='ignore') as f:
    for passwrd in f.readlines():
        print('第{}次破解:{}'.format(i, passwrd.strip()))
        i += 1
        try:
            if pdf_reader.decrypt(passwrd.strip()):
                print(f'文件已破解!!! 密码为{passwrd.strip()}')
                pages = pdf_reader.getNumPages()
                for i in range(pages):
                    content = pdf_reader.getPage(i)
                    pdf_writer.addPage(content)
                with open('new_file.pdf', 'wb') as pdf:
                    pdf_writer.write(pdf)
                break
        except Exception as e:
            print(e)
            continue
ent = time.time()
print('暴力破解共用时%f分'%((ent-stm)/60))

使用网络上下载的密码本进行暴力破解时,若密码本中不包含正确密码则会解密失败,因此建议小伙伴们在对文件进行加密时不要设置弱密码!!!
密码本及本文源程序下载地址为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值