Python實現(xiàn)自動化處理PDF文件的方法詳解
更新時間:2022年09月05日 11:21:28 作者:夢里逆天
這篇文章主要為大家詳細介紹了如何使用Python完成簡單的PDF文件處理操作,如PDF文件的批量合并、拆分、加密以及添加水印等,需要的可以參考一下
自動化處理PDF文件
使用Python完成簡單的PDF文件處理操作,如PDF文件的批量合并、拆分、加密以及添加水印等。
1. 批量合并PDF文件
from pathlib import Path
# PdfFileReader用于讀取PDF文件,PdfFileMerger用于合并PDF文件
from PyPDF2 import PdfFileReader, PdfFileMerger
src_folder = Path('PDF1') # 設(shè)置要合并的多個PDF文件所在的文件路徑
des_file = Path(r'PDF2\combine.pdf') # 設(shè)置合并后的PDF文件的保存文件夾和文件名
# 調(diào)用路徑對象的parent屬性返回父文件夾(即保存文件夾)的路徑
if not des_file.parent.exists():
# 如果該文件夾不存在,則創(chuàng)建該文件夾
des_file.parent.mkdir(parents=True)
# 獲取所有要合并的PDF文件的路徑
file_list = list(src_folder.glob('*.pdf'))
# 讀取PDF并進行合并
merger = PdfFileMerger() # 創(chuàng)建PdfFileMerger對象
outputPages = 0 # 統(tǒng)計合并到PDF文件的總頁數(shù)
# 遍歷文件列表
for pdf in file_list:
input_file = PdfFileReader(str(pdf)) # 讀取待合并的PDF文件
merger.append(input_file) # 將PDF文件合并到PdfFileMerger對象中
pageCount = input_file.getNumPages() # 獲取PDF文件的頁數(shù)
print(f'{pdf.name}--頁數(shù):{pageCount}')
outputPages += pageCount # 進行累加,統(tǒng)計總頁數(shù)
merger.write(str(des_file)) # 將合并好的PDF文件寫入指定的路徑
merger.close() # 關(guān)閉PdfFileMerger對象,釋放資源
print(f'\n合并后的總頁數(shù):{outputPages}')
測試文件:

效果:


2. 批量拆分PDF文件
from math import ceil
from pathlib import Path
from PyPDF2 import PdfFileReader, PdfFileWriter
src_folder = Path('PDF2') # 設(shè)置要拆分的多個PDF文件所在的文件路徑
output_folder = Path('PDF2') # 設(shè)置拆分后的PDF文件的保存文件夾和文件名
# 獲取所有要拆分的PDF文件的路徑
file_list = list(src_folder.glob('*.pdf'))
# 采用按固定頁數(shù)進行拆分
step = 5 # 每份為5頁
for pdf in file_list:
inputFile = PdfFileReader(str(pdf))
pages = inputFile.getNumPages() # 獲取PDF文件的頁數(shù)
# 判斷PDF文件頁數(shù)是否小于等于step
if pages <= step:
# 若是則不進行拆分
continue
else:
parts = ceil(pages / step) # 拆分的份數(shù),向上取整
# 根據(jù)份數(shù)進行循環(huán)
for pt in range(parts):
# 計算每一份的開始頁碼和結(jié)束頁碼
# PyPDF2模塊中,PDF文件頁碼從0開始
start = step * pt
# 判斷是否是最后一份
if pt != (parts - 1):
# 如果不是最后一份,那么結(jié)束頁碼為開始頁碼加每份頁數(shù)減1
end = start + step - 1
else:
# 若是最后一份,則結(jié)束頁碼等于文件頁數(shù)減1
end = pages - 1
# 拆分文件
outputfile = PdfFileWriter() # 創(chuàng)建PdfFileWriter對象
for pageNum in range(start, end + 1):
outputfile.addPage(inputFile.getPage(pageNum))
# 調(diào)用路徑對象的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') # 設(shè)置要加密的多個PDF文件所在的文件路徑
output_folder = Path('PDF2') # 設(shè)置加密后的PDF文件的保存文件夾和文件名
# 獲取所有要加密的PDF文件的路徑
file_list = list(src_folder.glob('*.pdf'))
# 遍歷文件列表
for pdf in file_list:
inputFile = PdfFileReader(str(pdf)) # 讀取文件
outputFile = PdfFileWriter() # 創(chuàng)建PdfFileWriter對象
pageCount = len(inputFile.pages) # 獲得PDF文件頁數(shù)
for pageNum in range(pageCount):
# 將PDF內(nèi)容逐頁添加到輸出文件
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 創(chuàng)建水印文件
安裝reportlab模塊
pip install reportlab

def createWatermark(content):
"""
創(chuàng)建水印
:param content: 水印內(nèi)容
:return:
"""
filename = 'watermark.pdf' # 水印文件的文件名
can = canvas.Canvas(filename=filename, pagesize=(30 * cm, 30 * cm)) # 設(shè)置水印文件的頁面大小
can.translate(5 * cm, 0 * cm) # 設(shè)置頁面的坐標原點
# 注冊水印文件需要使用的字體
reportlab.pdfbase.ttfonts.pdfmetrics.registerFont(
reportlab.pdfbase.ttfonts.TTFont(name='華文行楷', filename=r'C:\Windows\Fonts\STXINGKA.TTF'))
can.setFont(psfontname='華文行楷', size=25) # 設(shè)置水印字體即字號
can.rotate(28) # 設(shè)置水印旋轉(zhuǎn)角度
can.setFillColorRGB(r=0.3, g=0.6, b=0.9) # 設(shè)置填充顏色
can.setFillAlpha(a=0.2) # 設(shè)置透明度
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() # 創(chuàng)建PdfFileWriter對象
page_count = len(input_file.pages) # 獲得PDF文件頁數(shù)
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):
"""
創(chuàng)建水印
:param content: 水印內(nèi)容
:return:
"""
filename = 'watermark.pdf' # 水印文件的文件名
can = canvas.Canvas(filename=filename, pagesize=(30 * cm, 30 * cm)) # 設(shè)置水印文件的頁面大小
can.translate(5 * cm, 0 * cm) # 設(shè)置頁面的坐標原點
# 注冊水印文件需要使用的字體
reportlab.pdfbase.ttfonts.pdfmetrics.registerFont(
reportlab.pdfbase.ttfonts.TTFont(name='華文行楷', filename=r'C:\Windows\Fonts\STXINGKA.TTF'))
can.setFont(psfontname='華文行楷', size=25) # 設(shè)置水印字體即字號
can.rotate(28) # 設(shè)置水印旋轉(zhuǎn)角度
can.setFillColorRGB(r=0.3, g=0.6, b=0.9) # 設(shè)置填充顏色
can.setFillAlpha(a=0.2) # 設(shè)置透明度
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() # 創(chuàng)建PdfFileWriter對象
page_count = len(input_file.pages) # 獲得PDF文件頁數(shù)
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__':
# 創(chuàng)建Path對象
src_folder = Path('PDF1')
output_folder = Path('PDF_mark')
# 判斷輸出目錄是否存在
if not output_folder.exists():
# 不存在則創(chuàng)建
output_folder.mkdir(parents=True)
file_list = list(src_folder.glob('*.pdf')) # 獲得給定目錄下的所有pdf文件的路徑
for file in file_list:
pdf_file_in = str(file) # 輸入文件路徑
# 創(chuàng)建水印
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實現(xiàn)自動化處理PDF文件的方法詳解的詳細內(nèi)容,更多關(guān)于Python自動化處理PDF的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 將字符串中的數(shù)字相加求和的實現(xiàn)
這篇文章主要介紹了python 將字符串中的數(shù)字相加求和的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
詳解OpenCV自適應(yīng)直方圖均衡化的應(yīng)用
在本文中,將介紹如何應(yīng)用對比度受限的自適應(yīng)直方圖均衡化 ( Contrast Limited Adaptive Histogram Equalization, CLAHE ) 來均衡圖像,需要的可以參考一下2022-02-02
python中import,from……import的使用詳解
這篇文章主要介紹了python中import,from……import的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
Python?matplotlib實戰(zhàn)之氣泡圖繪制
氣泡圖是一種多變量的統(tǒng)計圖表,可以看作是散點圖的變形,這篇文章主要為大家介紹了如何使用Matplotlib繪制氣泡圖,需要的小伙伴可以參考下2023-08-08

