網站首頁 編程語言 正文
前言
可以通過設置批量PDF文件所在的路徑及需要添加的水印名稱可以實現批量添加PDF水印的效果。
實現思路是這樣的,通過在批量PDF文件路徑下面生成一個帶有水印的PDF模板。最后,將批量文件的每個PDF頁面和水印模板進行合并完成批量添加水印的效果。
需要注意的是批量PDF文件必須和PDF模板水印文件的大小尺寸保持一致,這個可以在代碼里面調節一下就成了。
實現步驟
首先將需要添加水印的PDF文件準備好放在一個文件夾下面。
在代碼中設置好PDF批量文件的路徑及水印名稱。
if?__name__?==?'__main__': ????main('C:/pdf',?'我是一個水印')
內部實現過程都封裝在main()函數里面了,這里改一下水印名稱和批量PDF文件路徑直接執行就好了。
啟動以后,出現如下面的結果說明已經執行完成了。
為了不覆蓋原來的PDF文件,合并后的文件都是添加了"已合并"字樣的PDF文件。
說完了怎么操作,看一下主要的代碼塊部分有哪些吧。
其中用到的第三方庫有下面這些,里面我寫了相關的注釋。
import?os??#?應用文件操作 # reportlab是Python的一個標準庫,可以畫圖、畫表格、編輯文字,最后可以輸出PDF格式。 from?reportlab.pdfgen?import?canvas from?reportlab.lib.units?import?cm from?reportlab.pdfbase?import?pdfmetrics from?reportlab.pdfbase.ttfonts?import?TTFont pdfmetrics.registerFont(TTFont('songti',?'C:/Windows/Fonts/simsun.ttc'))??#?加載宋體 # PyPDF2模塊主要的功能是分割或合并PDF文件,裁剪或轉換PDF文件中的頁面。 from?PyPDF2?import?PdfFileWriter,?PdfFileReader import?logging??#?日志打印庫
日志模塊的初始化也比較簡單,前面的文章中都有過相關的調用。
#?初始化日志設置 logger?=?logging.getLogger('批量添加水印') logging.basicConfig(format='%(asctime)s?%(levelname)-8s:?%(message)s') logger.setLevel(logging.DEBUG)
日志初始化完成后在后面需要打印日志的地方調用就可以了。
實現過程主要有三個函數來實現的,一個是為了生成水印模板、另一個是使水印模板和批量PDF文件執行合并從而實現添加水印的功能、還有一個就是逐個遍歷批量PDF文件使其能夠逐個實現水印合并。
水印模板生成函數。
def?generate_water_pdf(content): ????''' ????生成帶有水印的PDF ????:param?content:?水印名稱 ????:return: ????''' ????cans?=?canvas.Canvas('water_back.pdf',?pagesize=(21?*?cm,?29.7?*?cm)) ????cans.translate(10?*?cm, ???????????????????12?*?cm)??#?移動原點坐標 ????cans.setFont('songti',?23)??#?設置字體為宋體、大小為23號 ????cans.setFillColorRGB(0.5,?0.5, ?????????????????????????0.5)??#?設置字體背景顏色 ????cans.rotate(45)??#?設置字體傾斜45度 ????cans.drawString(-7?*?cm,?0?*?cm,?content) ????cans.drawString(7?*?cm,?0?*?cm,?content) ????cans.drawString(0?*?cm,?7?*?cm,?content) ????cans.drawString(0?*?cm,?-7?*?cm,?content) ????cans.save()??#?保存水印的PDF文件
水印合成實現函數。
def?insert_water_to_pdf(input_pdf,?output_pdf,?water_pdf): ????''' ????合并水印到PDF文件中 ????:param?input_pdf:?輸入文件路徑 ????:param?output_pdf:?輸出文件路徑 ????:param?water_pdf:?水印文件路徑 ????:return: ????''' ????water?=?PdfFileReader(water_pdf)??#?讀取水印PDF ????water_page?=?water.getPage(0)??#?獲取水印PDF的第一頁 ????pdf?=?PdfFileReader(input_pdf,?strict=False)??#?讀取需要添加水印的文件 ????pdf_writer?=?PdfFileWriter()??#?創建PDF文件寫入對象 ????for?page?in?range(pdf.getNumPages()):??#?遍歷每一頁PDF對象 ????????pdf_page?=?pdf.getPage(page)??#?獲取PDF的當前頁對象 ????????pdf_page.mergePage(water_page)??#?將水印頁合并到當前頁中 ????????pdf_writer.addPage(pdf_page)??#?將合并后的PDF對象頁添加到PDF寫入對象中 ????output_file?=?open(output_pdf,?'wb')??#?打開PDF輸出文件 ????pdf_writer.write(output_file)??#?將文件寫入到輸出文件 ????output_file.close()??#?關閉寫入流
批量PDF文件遍歷調用合成函數。
def?main(diretory,?current): ????if?os.path.isdir(diretory): ????????logger.info('文件夾['?+?diretory?+?']校驗成功!') ????????os.chdir(diretory) ????????logger.info('當前路徑為['?+?os.getcwd()?+?']') ????????generate_water_pdf(current) ????????logger.info('水印PDF文件生成成功!') ????????for?file_path,?dir_names,?file_names?in?os.walk(r''?+?os.getcwd()): ????????????for?file_name?in?file_names: ????????????????try: ????????????????????name?=?file_name.split('.')[0] ????????????????????if?name?==?'water_back': ????????????????????????continue ????????????????????else: ????????????????????????file_name_path?=?os.path.join(file_path,?file_name) ????????????????????????output_file_path?=?file_name_path.split('.')[0]?+?'_已添加水印.pdf' ????????????????????????insert_water_to_pdf(file_name_path,?output_file_path,?'water_back.pdf') ????????????????????????logger.info('['?+?file_name_path?+?']完成水印合并!') ????????????????except?Exception?as?e: ????????????????????logger.error('['?+?file_name_path?+?']發生異常,執行下一個!') ????????????????????logger.error('異常信息:'?+?repr(e)) ????else: ????????logger.info('文件夾['?+?diretory?+?']校驗失敗!')
主要實現過程就是通過上面三個函數來完成的,最后調用后臺入口函數將mian()函數調用執行就可以了。
完整代碼
# -*- coding:utf-8 -*- # @author Python 集中營 # @date 2022/1/27 # @file test4.py # done # 批量向PDF文件添加中文水印 import os # 應用文件操作 # reportlab是Python的一個標準庫,可以畫圖、畫表格、編輯文字,最后可以輸出PDF格式。 from reportlab.pdfgen import canvas from reportlab.lib.units import cm from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont pdfmetrics.registerFont(TTFont('songti', 'C:/Windows/Fonts/simsun.ttc')) # 加載宋體 # PyPDF2模塊主要的功能是分割或合并PDF文件,裁剪或轉換PDF文件中的頁面。 from PyPDF2 import PdfFileWriter, PdfFileReader import logging # 日志打印庫 # 初始化日志設置 logger = logging.getLogger('批量添加水印') logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s') logger.setLevel(logging.DEBUG) def generate_water_pdf(content): ''' 生成帶有水印的PDF :param content: 水印名稱 :return: ''' cans = canvas.Canvas('water_back.pdf', pagesize=(21 * cm, 29.7 * cm)) cans.translate(10 * cm, 12 * cm) # 移動原點坐標 cans.setFont('songti', 23) # 設置字體為宋體、大小為23號 cans.setFillColorRGB(0.5, 0.5, 0.5) # 設置字體背景顏色 cans.rotate(45) # 設置字體傾斜45度 cans.drawString(-7 * cm, 0 * cm, content) cans.drawString(7 * cm, 0 * cm, content) cans.drawString(0 * cm, 7 * cm, content) cans.drawString(0 * cm, -7 * cm, content) cans.save() # 保存水印的PDF文件 def insert_water_to_pdf(input_pdf, output_pdf, water_pdf): ''' 合并水印到PDF文件中 :param input_pdf: 輸入文件路徑 :param output_pdf: 輸出文件路徑 :param water_pdf: 水印文件路徑 :return: ''' water = PdfFileReader(water_pdf) # 讀取水印PDF water_page = water.getPage(0) # 獲取水印PDF的第一頁 pdf = PdfFileReader(input_pdf, strict=False) # 讀取需要添加水印的文件 pdf_writer = PdfFileWriter() # 創建PDF文件寫入對象 for page in range(pdf.getNumPages()): # 遍歷每一頁PDF對象 pdf_page = pdf.getPage(page) # 獲取PDF的當前頁對象 pdf_page.mergePage(water_page) # 將水印頁合并到當前頁中 pdf_writer.addPage(pdf_page) # 將合并后的PDF對象頁添加到PDF寫入對象中 output_file = open(output_pdf, 'wb') # 打開PDF輸出文件 pdf_writer.write(output_file) # 將文件寫入到輸出文件 output_file.close() # 關閉寫入流 def main(diretory, current): if os.path.isdir(diretory): logger.info('文件夾[' + diretory + ']校驗成功!') os.chdir(diretory) logger.info('當前路徑為[' + os.getcwd() + ']') generate_water_pdf(current) logger.info('水印PDF文件生成成功!') for file_path, dir_names, file_names in os.walk(r'' + os.getcwd()): for file_name in file_names: try: name = file_name.split('.')[0] if name == 'water_back': continue else: file_name_path = os.path.join(file_path, file_name) output_file_path = file_name_path.split('.')[0] + '_已添加水印.pdf' insert_water_to_pdf(file_name_path, output_file_path, 'water_back.pdf') logger.info('[' + file_name_path + ']完成水印合并!') except Exception as e: logger.error('[' + file_name_path + ']發生異常,執行下一個!') logger.error('異常信息:' + repr(e)) else: logger.info('文件夾[' + diretory + ']校驗失??!') if __name__ == '__main__': main('C:/pdf', '我是一個水印')
原文鏈接:https://mp.weixin.qq.com/s/yj8gOkcS6UPpTOGMEL3D3w
相關推薦
- 2022-02-20 Spring Boot 打包報錯Failed to execute goal org.apache.
- 2024-02-28 UNI-APP,text、rich-text控件顯示字符串,當字符串過長時,實現自動換行
- 2022-04-10 MalformedByteSequenceException: 1字節的 UTF-8 序列的字節 1
- 2022-05-21 Nginx實現會話保持的兩種方式_nginx
- 2022-10-01 Docker部署單頁應用的詳細操作_docker
- 2022-05-25 <C++>詳解類對象作為類成員時調用構造和析構的時機及靜態成員解釋
- 2022-05-17 bat批處理腳本中文亂碼的解決_DOS/BAT
- 2022-09-16 Go語言入門學習之Channel通道詳解_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支