Python实现自动化处理PDF文件的方法详解
作者:梦里逆天 发布时间:2024-01-02 07:02:21
标签:Python,自动化,PDF
自动化处理PDF文件
使用Python完成简单的PDF文件处理操作,如PDF文件的批量合并、拆分、加密以及添加水印等。
1. 批量合并PDF文件
from pathlib import Path
# PdfFileReader用于读取PDF文件,PdfFileMerger用于合并PDF文件
from PyPDF2 import PdfFileReader, PdfFileMerger
src_folder = Path('PDF1') # 设置要合并的多个PDF文件所在的文件路径
des_file = Path(r'PDF2\combine.pdf') # 设置合并后的PDF文件的保存文件夹和文件名
# 调用路径对象的parent属性返回父文件夹(即保存文件夹)的路径
if not des_file.parent.exists():
# 如果该文件夹不存在,则创建该文件夹
des_file.parent.mkdir(parents=True)
# 获取所有要合并的PDF文件的路径
file_list = list(src_folder.glob('*.pdf'))
# 读取PDF并进行合并
merger = PdfFileMerger() # 创建PdfFileMerger对象
outputPages = 0 # 统计合并到PDF文件的总页数
# 遍历文件列表
for pdf in file_list:
input_file = PdfFileReader(str(pdf)) # 读取待合并的PDF文件
merger.append(input_file) # 将PDF文件合并到PdfFileMerger对象中
pageCount = input_file.getNumPages() # 获取PDF文件的页数
print(f'{pdf.name}--页数:{pageCount}')
outputPages += pageCount # 进行累加,统计总页数
merger.write(str(des_file)) # 将合并好的PDF文件写入指定的路径
merger.close() # 关闭PdfFileMerger对象,释放资源
print(f'\n合并后的总页数:{outputPages}')
测试文件:
效果:
2. 批量拆分PDF文件
from math import ceil
from pathlib import Path
from PyPDF2 import PdfFileReader, PdfFileWriter
src_folder = Path('PDF2') # 设置要拆分的多个PDF文件所在的文件路径
output_folder = Path('PDF2') # 设置拆分后的PDF文件的保存文件夹和文件名
# 获取所有要拆分的PDF文件的路径
file_list = list(src_folder.glob('*.pdf'))
# 采用按固定页数进行拆分
step = 5 # 每份为5页
for pdf in file_list:
inputFile = PdfFileReader(str(pdf))
pages = inputFile.getNumPages() # 获取PDF文件的页数
# 判断PDF文件页数是否小于等于step
if pages <= step:
# 若是则不进行拆分
continue
else:
parts = ceil(pages / step) # 拆分的份数,向上取整
# 根据份数进行循环
for pt in range(parts):
# 计算每一份的开始页码和结束页码
# PyPDF2模块中,PDF文件页码从0开始
start = step * pt
# 判断是否是最后一份
if pt != (parts - 1):
# 如果不是最后一份,那么结束页码为开始页码加每份页数减1
end = start + step - 1
else:
# 若是最后一份,则结束页码等于文件页数减1
end = pages - 1
# 拆分文件
outputfile = PdfFileWriter() # 创建PdfFileWriter对象
for pageNum in range(start, end + 1):
outputfile.addPage(inputFile.getPage(pageNum))
# 调用路径对象的stem属性获取文件的主名,与后面的字符串拼接成PDF文件名
pt_name = f'{pdf.stem}_第{pt + 1}份.pdf'
pt_file = output_folder / pt_name # 生成当前份的PDF文件的保存路径
with open(pt_file, 'wb') as f:
outputfile.write(f)
print(f'【{pdf.name}】共{pages}页,拆分为{parts}份-->完成')
效果:
3. 批量加密PDF文件
from pathlib import Path
from PyPDF2 import PdfFileReader, PdfFileWriter
src_folder = Path('PDF2') # 设置要加密的多个PDF文件所在的文件路径
output_folder = Path('PDF2') # 设置加密后的PDF文件的保存文件夹和文件名
# 获取所有要加密的PDF文件的路径
file_list = list(src_folder.glob('*.pdf'))
# 遍历文件列表
for pdf in file_list:
inputFile = PdfFileReader(str(pdf)) # 读取文件
outputFile = PdfFileWriter() # 创建PdfFileWriter对象
pageCount = len(inputFile.pages) # 获得PDF文件页数
for pageNum in range(pageCount):
# 将PDF内容逐页添加到输出文件
outputFile.add_page(inputFile.pages[pageNum])
# 进行加密
outputFile.encrypt('123456')
# 输出文件名
output_name = f'{pdf.stem}_encrypted.pdf'
# 输出文件的路径
output_path = output_folder / output_name
with open(output_path, 'wb') as pf:
outputFile.write(pf)
print(f'{output_name}加密文件-->保存完成')
效果:
4. 批量PDF添加水印
4.1 创建水印文件
安装reportlab模块
pip install reportlab
def createWatermark(content):
"""
创建水印
:param content: 水印内容
:return:
"""
filename = 'watermark.pdf' # 水印文件的文件名
can = canvas.Canvas(filename=filename, pagesize=(30 * cm, 30 * cm)) # 设置水印文件的页面大小
can.translate(5 * cm, 0 * cm) # 设置页面的坐标原点
# 注册水印文件需要使用的字体
reportlab.pdfbase.ttfonts.pdfmetrics.registerFont(
reportlab.pdfbase.ttfonts.TTFont(name='华文行楷', filename=r'C:\Windows\Fonts\STXINGKA.TTF'))
can.setFont(psfontname='华文行楷', size=25) # 设置水印字体即字号
can.rotate(28) # 设置水印旋转角度
can.setFillColorRGB(r=0.3, g=0.6, b=0.9) # 设置填充颜色
can.setFillAlpha(a=0.2) # 设置透明度
for i in range(0, 30, 5):
for j in range(0, 30, 5):
can.drawString(x=i * cm, y=j * cm, text=content) # 绘制6行x6列的水印文字
can.save() # 保存水印
return filename
4.2 添加水印
def addWatermark(pdf_file_input, pdf_file_mark, pdf_file_output):
"""
添加水印
:param pdf_file_input: 需要添加水印的文件
:param pdf_file_mark: 水印文件
:param pdf_file_output: 输出文件
:return:
"""
input_file = PdfFileReader(pdf_file_input)
output_file = PdfFileWriter() # 创建PdfFileWriter对象
page_count = len(input_file.pages) # 获得PDF文件页数
water_mark = PdfFileReader(pdf_file_mark) # 读取水印PDF文件
for pageNum in range(page_count):
page = input_file.pages[pageNum]
page.merge_page(water_mark.pages[0]) # 将两张PDF合并成1张
output_file.add_page(page) # 将页面添加到PDF文件
with open(pdf_file_output, 'wb') as pf:
output_file.write(pf)
print(f'{pdf_file_input}添加水印-->处理完成')
完整代码
# author:mlnt
# createdate:2022/8/25
from pathlib import Path
from PyPDF2 import PdfFileReader, PdfFileWriter
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
import reportlab.pdfbase.ttfonts
def createWatermark(content):
"""
创建水印
:param content: 水印内容
:return:
"""
filename = 'watermark.pdf' # 水印文件的文件名
can = canvas.Canvas(filename=filename, pagesize=(30 * cm, 30 * cm)) # 设置水印文件的页面大小
can.translate(5 * cm, 0 * cm) # 设置页面的坐标原点
# 注册水印文件需要使用的字体
reportlab.pdfbase.ttfonts.pdfmetrics.registerFont(
reportlab.pdfbase.ttfonts.TTFont(name='华文行楷', filename=r'C:\Windows\Fonts\STXINGKA.TTF'))
can.setFont(psfontname='华文行楷', size=25) # 设置水印字体即字号
can.rotate(28) # 设置水印旋转角度
can.setFillColorRGB(r=0.3, g=0.6, b=0.9) # 设置填充颜色
can.setFillAlpha(a=0.2) # 设置透明度
for i in range(0, 30, 5):
for j in range(0, 30, 5):
can.drawString(x=i * cm, y=j * cm, text=content) # 绘制6行x6列的水印文字
can.save() # 保存水印
return filename
def addWatermark(pdf_file_input, pdf_file_mark, pdf_file_output):
"""
添加水印
:param pdf_file_input: 需要添加水印的文件
:param pdf_file_mark: 水印文件
:param pdf_file_output: 输出文件
:return:
"""
input_file = PdfFileReader(pdf_file_input)
output_file = PdfFileWriter() # 创建PdfFileWriter对象
page_count = len(input_file.pages) # 获得PDF文件页数
water_mark = PdfFileReader(pdf_file_mark) # 读取水印PDF文件
for pageNum in range(page_count):
page = input_file.pages[pageNum]
page.merge_page(water_mark.pages[0]) # 将两张PDF合并成1张
output_file.add_page(page) # 将页面添加到PDF文件
with open(pdf_file_output, 'wb') as pf:
output_file.write(pf)
print(f'{pdf_file_input}添加水印-->处理完成')
if __name__ == '__main__':
# 创建Path对象
src_folder = Path('PDF1')
output_folder = Path('PDF_mark')
# 判断输出目录是否存在
if not output_folder.exists():
# 不存在则创建
output_folder.mkdir(parents=True)
file_list = list(src_folder.glob('*.pdf')) # 获得给定目录下的所有pdf文件的路径
for file in file_list:
pdf_file_in = str(file) # 输入文件路径
# 创建水印
pdf_file_mark = createWatermark('绝密文件')
# 输出文件名
output_name = f'{file.stem}_mark.pdf'
pdf_file_out = str(output_folder / output_name) # 输出文件的路径
addWatermark(pdf_file_in, pdf_file_mark, pdf_file_out) # 添加水印
效果:
来源:https://blog.csdn.net/username666/article/details/126533462
0
投稿
猜你喜欢
- 作为一名前端,我们通常要做的就是让页面在各系统A-Grade浏览器,甚至网站浏览份额0.1%以上的浏览器上良好显示。当然,还有性能问题。不过
- 为什么在facebook交友会更容易?facebook与传统的BSP(Blog Service Provider)到底有什么不同?是因为它有
- 因为这两天在弄自己的一个问答程序www.sosoask.com ,结果发现开发人员把我的存储过程加密了,郁闷,还好找到解决方法了,现在共享下
- 创建游戏文件 2048.py首先导入需要的包:import cursesfrom random import randrange, choi
- js浮点数计算有时是不准确的,比如7*0.8 == 7*8/10的值为false,因为7*0.8=5.6000000000000005,乘出
- 使用picasa的时候,注意到它首先是显示模糊的图片,然后图片突然变得清晰,这样做有一定的好处——picasa的图片翻页是用javascri
- 这个是很有用的一个运算,除了本身可以求自然对数,还是求指数函数需要用到的基础函数。实现原理就是泰勒展开,最简单是在x=1处进行泰勒展开:但该
- 将转储设备加入到SQL Server备份数据库的地方。在SEM中转储设备是可见性的,并且在设备上的信息被存储在主要数据库的sysdevice
- 前一段时间就安装了AspJpeg 2.0,一直没有时间去测试,直到昨天晚上因为服务器无法访问才在本机测试下,特分享下测试结果,只针对GIF图
- 提叻一个代码段,要人帮助解释一下。代码如下:declare type t_indexby is ta
- 什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般
- 首先要下载:Graphviz - Graph Visualization Software安装完成后将安装目录的bin 路径加到系统路径中,
- 一、基于socket实现的TCP客户端import socket # 建立socket对象# 参数一表示IP地址类型(AF_INE
- 一、引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存
- 最近有点审美疲劳,以往看起来觉得漂亮的界面现在觉得很一般,以前觉得看来还行的界面现在觉得很丑了。想来是时候休息一下了。唯美觉得上次做的OA登
- 初步介绍 当然,我知道现在有成千上万个关于 用CSS处理圆角 的教程,但不管怎么说,我仍然想把这篇文章展示给您。也希望您会发现这篇文章会非常
- 具体代码和说明如下:upload.asp<form action=http://<%= Request.&n
- 0、背景今天看到了一个比较诡异的写法,for后直接跟了else语句,起初还以为是没有缩进好,查询后发现果然有这种语法,特此分享。之前写过c+
- 上代码:#coding=utf-8import cv2import dlibpath = "imagePath/9.jpg&quo
- 大家经常在网上登陆的时候经常会看到让你输入验证码,有的是文字的,有的呢是图片,比如chinaren.com校友录中留言的时候,我们就会看到数