您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Python怎么實(shí)現(xiàn)批量向PDF文件添加中文水印”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python怎么實(shí)現(xiàn)批量向PDF文件添加中文水印”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
可以通過設(shè)置批量PDF文件所在的路徑及需要添加的水印名稱可以實(shí)現(xiàn)批量添加PDF水印的效果。
實(shí)現(xiàn)思路是這樣的,通過在批量PDF文件路徑下面生成一個(gè)帶有水印的PDF模板。最后,將批量文件的每個(gè)PDF頁面和水印模板進(jìn)行合并完成批量添加水印的效果。
需要注意的是批量PDF文件必須和PDF模板水印文件的大小尺寸保持一致,這個(gè)可以在代碼里面調(diào)節(jié)一下就成了。
首先將需要添加水印的PDF文件準(zhǔn)備好放在一個(gè)文件夾下面。
在代碼中設(shè)置好PDF批量文件的路徑及水印名稱。
if __name__ == '__main__': main('C:/pdf', '我是一個(gè)水印')
內(nèi)部實(shí)現(xiàn)過程都封裝在main()函數(shù)里面了,這里改一下水印名稱和批量PDF文件路徑直接執(zhí)行就好了。
啟動(dòng)以后,出現(xiàn)如下面的結(jié)果說明已經(jīng)執(zhí)行完成了。
為了不覆蓋原來的PDF文件,合并后的文件都是添加了"已合并"字樣的PDF文件。
說完了怎么操作,看一下主要的代碼塊部分有哪些吧。
其中用到的第三方庫有下面這些,里面我寫了相關(guān)的注釋。
import os # 應(yīng)用文件操作 # reportlab是Python的一個(gè)標(biāo)準(zhǔn)庫,可以畫圖、畫表格、編輯文字,最后可以輸出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文件,裁剪或轉(zhuǎn)換PDF文件中的頁面。 from PyPDF2 import PdfFileWriter, PdfFileReader import logging # 日志打印庫
日志模塊的初始化也比較簡單,前面的文章中都有過相關(guān)的調(diào)用。
# 初始化日志設(shè)置 logger = logging.getLogger('批量添加水印') logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s') logger.setLevel(logging.DEBUG)
日志初始化完成后在后面需要打印日志的地方調(diào)用就可以了。
實(shí)現(xiàn)過程主要有三個(gè)函數(shù)來實(shí)現(xiàn)的,一個(gè)是為了生成水印模板、另一個(gè)是使水印模板和批量PDF文件執(zhí)行合并從而實(shí)現(xiàn)添加水印的功能、還有一個(gè)就是逐個(gè)遍歷批量PDF文件使其能夠逐個(gè)實(shí)現(xiàn)水印合并。
水印模板生成函數(shù)。
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) # 移動(dòng)原點(diǎn)坐標(biāo) cans.setFont('songti', 23) # 設(shè)置字體為宋體、大小為23號(hào) cans.setFillColorRGB(0.5, 0.5, 0.5) # 設(shè)置字體背景顏色 cans.rotate(45) # 設(shè)置字體傾斜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文件
水印合成實(shí)現(xiàn)函數(shù)。
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() # 創(chuàng)建PDF文件寫入對(duì)象 for page in range(pdf.getNumPages()): # 遍歷每一頁P(yáng)DF對(duì)象 pdf_page = pdf.getPage(page) # 獲取PDF的當(dāng)前頁對(duì)象 pdf_page.mergePage(water_page) # 將水印頁合并到當(dāng)前頁中 pdf_writer.addPage(pdf_page) # 將合并后的PDF對(duì)象頁添加到PDF寫入對(duì)象中 output_file = open(output_pdf, 'wb') # 打開PDF輸出文件 pdf_writer.write(output_file) # 將文件寫入到輸出文件 output_file.close() # 關(guān)閉寫入流
批量PDF文件遍歷調(diào)用合成函數(shù)。
def main(diretory, current): if os.path.isdir(diretory): logger.info('文件夾[' + diretory + ']校驗(yàn)成功!') os.chdir(diretory) logger.info('當(dāng)前路徑為[' + 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 + ']發(fā)生異常,執(zhí)行下一個(gè)!') logger.error('異常信息:' + repr(e)) else: logger.info('文件夾[' + diretory + ']校驗(yàn)失?。?#39;)
主要實(shí)現(xiàn)過程就是通過上面三個(gè)函數(shù)來完成的,最后調(diào)用后臺(tái)入口函數(shù)將mian()函數(shù)調(diào)用執(zhí)行就可以了。
# -*- coding:utf-8 -*- # @author Python 集中營 # @date 2022/1/27 # @file test4.py # done # 批量向PDF文件添加中文水印 import os # 應(yīng)用文件操作 # reportlab是Python的一個(gè)標(biāo)準(zhǔn)庫,可以畫圖、畫表格、編輯文字,最后可以輸出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文件,裁剪或轉(zhuǎn)換PDF文件中的頁面。 from PyPDF2 import PdfFileWriter, PdfFileReader import logging # 日志打印庫 # 初始化日志設(shè)置 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) # 移動(dòng)原點(diǎn)坐標(biāo) cans.setFont('songti', 23) # 設(shè)置字體為宋體、大小為23號(hào) cans.setFillColorRGB(0.5, 0.5, 0.5) # 設(shè)置字體背景顏色 cans.rotate(45) # 設(shè)置字體傾斜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() # 創(chuàng)建PDF文件寫入對(duì)象 for page in range(pdf.getNumPages()): # 遍歷每一頁P(yáng)DF對(duì)象 pdf_page = pdf.getPage(page) # 獲取PDF的當(dāng)前頁對(duì)象 pdf_page.mergePage(water_page) # 將水印頁合并到當(dāng)前頁中 pdf_writer.addPage(pdf_page) # 將合并后的PDF對(duì)象頁添加到PDF寫入對(duì)象中 output_file = open(output_pdf, 'wb') # 打開PDF輸出文件 pdf_writer.write(output_file) # 將文件寫入到輸出文件 output_file.close() # 關(guān)閉寫入流 def main(diretory, current): if os.path.isdir(diretory): logger.info('文件夾[' + diretory + ']校驗(yàn)成功!') os.chdir(diretory) logger.info('當(dāng)前路徑為[' + 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 + ']發(fā)生異常,執(zhí)行下一個(gè)!') logger.error('異常信息:' + repr(e)) else: logger.info('文件夾[' + diretory + ']校驗(yàn)失?。?#39;) if __name__ == '__main__': main('C:/pdf', '我是一個(gè)水印')
讀到這里,這篇“Python怎么實(shí)現(xiàn)批量向PDF文件添加中文水印”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。