网络编程
位置:首页>> 网络编程>> Python编程>> Python实现自动化处理PDF文件的方法详解

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}')

测试文件:

Python实现自动化处理PDF文件的方法详解

效果:

Python实现自动化处理PDF文件的方法详解

Python实现自动化处理PDF文件的方法详解

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}份-->完成')

效果:

Python实现自动化处理PDF文件的方法详解

Python实现自动化处理PDF文件的方法详解

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}加密文件-->保存完成')

效果:

Python实现自动化处理PDF文件的方法详解

Python实现自动化处理PDF文件的方法详解

4. 批量PDF添加水印

4.1 创建水印文件

安装reportlab模块

pip install reportlab

Python实现自动化处理PDF文件的方法详解

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)  # 添加水印

效果:

Python实现自动化处理PDF文件的方法详解

Python实现自动化处理PDF文件的方法详解

Python实现自动化处理PDF文件的方法详解

Python实现自动化处理PDF文件的方法详解

来源:https://blog.csdn.net/username666/article/details/126533462

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com