最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)批量向PDF文件添加中文水印

 更新時(shí)間:2022年02月08日 09:09:03   作者:Python 集中營  
本文將通過設(shè)置批量PDF文件所在的路徑及需要添加的水印名稱,從而實(shí)現(xiàn)批量添加PDF水印的效果。感興趣的小伙伴可以跟隨小編一起動手試一試

前言

可以通過設(shè)置批量PDF文件所在的路徑及需要添加的水印名稱可以實(shí)現(xiàn)批量添加PDF水印的效果。

實(shí)現(xiàn)思路是這樣的,通過在批量PDF文件路徑下面生成一個帶有水印的PDF模板。最后,將批量文件的每個PDF頁面和水印模板進(jìn)行合并完成批量添加水印的效果。

圖片

需要注意的是批量PDF文件必須和PDF模板水印文件的大小尺寸保持一致,這個可以在代碼里面調(diào)節(jié)一下就成了。

實(shí)現(xiàn)步驟

首先將需要添加水印的PDF文件準(zhǔn)備好放在一個文件夾下面。

圖片

在代碼中設(shè)置好PDF批量文件的路徑及水印名稱。

if?__name__?==?'__main__':
????main('C:/pdf',?'我是一個水印')

內(nèi)部實(shí)現(xiàn)過程都封裝在main()函數(shù)里面了,這里改一下水印名稱和批量PDF文件路徑直接執(zhí)行就好了。

啟動以后,出現(xiàn)如下面的結(jié)果說明已經(jīng)執(zhí)行完成了。

圖片

為了不覆蓋原來的PDF文件,合并后的文件都是添加了"已合并"字樣的PDF文件。

說完了怎么操作,看一下主要的代碼塊部分有哪些吧。

其中用到的第三方庫有下面這些,里面我寫了相關(guān)的注釋。

import?os??#?應(yīng)用文件操作

# reportlab是Python的一個標(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)過程主要有三個函數(shù)來實(shí)現(xiàn)的,一個是為了生成水印模板、另一個是使水印模板和批量PDF文件執(zhí)行合并從而實(shí)現(xiàn)添加水印的功能、還有一個就是逐個遍歷批量PDF文件使其能夠逐個實(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)??#?移動原點(diǎn)坐標(biāo)
????cans.setFont('songti',?23)??#?設(shè)置字體為宋體、大小為23號
????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文件寫入對象
????for?page?in?range(pdf.getNumPages()):??#?遍歷每一頁P(yáng)DF對象
????????pdf_page?=?pdf.getPage(page)??#?獲取PDF的當(dāng)前頁對象
????????pdf_page.mergePage(water_page)??#?將水印頁合并到當(dāng)前頁中
????????pdf_writer.addPage(pdf_page)??#?將合并后的PDF對象頁添加到PDF寫入對象中
????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í)行下一個!')
????????????????????logger.error('異常信息:'?+?repr(e))
????else:
????????logger.info('文件夾['?+?diretory?+?']校驗(yàn)失?。?)

主要實(shí)現(xiàn)過程就是通過上面三個函數(shù)來完成的,最后調(diào)用后臺入口函數(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的一個標(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)  # 移動原點(diǎn)坐標(biāo)
    cans.setFont('songti', 23)  # 設(shè)置字體為宋體、大小為23號
    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文件寫入對象
    for page in range(pdf.getNumPages()):  # 遍歷每一頁P(yáng)DF對象
        pdf_page = pdf.getPage(page)  # 獲取PDF的當(dāng)前頁對象
        pdf_page.mergePage(water_page)  # 將水印頁合并到當(dāng)前頁中
        pdf_writer.addPage(pdf_page)  # 將合并后的PDF對象頁添加到PDF寫入對象中
    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í)行下一個!')
                    logger.error('異常信息:' + repr(e))
    else:
        logger.info('文件夾[' + diretory + ']校驗(yàn)失??!')


if __name__ == '__main__':
    main('C:/pdf', '我是一個水印')

到此這篇關(guān)于Python實(shí)現(xiàn)批量向PDF文件添加中文水印的文章就介紹到這了,更多相關(guān)Python PDF添加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python隨機(jī)生成身份證號碼及校驗(yàn)功能

    Python隨機(jī)生成身份證號碼及校驗(yàn)功能

    這篇文章主要介紹了Python隨機(jī)生成身份證號碼及校驗(yàn)功能,文中給大家提到了校驗(yàn)碼計(jì)算方法,需要的朋友可以參考下
    2018-12-12
  • 一起來學(xué)習(xí)一下python的數(shù)字類型

    一起來學(xué)習(xí)一下python的數(shù)字類型

    這篇文章主要為大家詳細(xì)介紹了python的數(shù)字類型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python中的QPixmap用法詳解

    Python中的QPixmap用法詳解

    QPixmap主要用于繪圖,針對圖像顯示而最佳化設(shè)計(jì),這篇文章主要介紹了Python中的QPixmap用法,對QPixmap使相關(guān)知識感興趣的朋友一起看看吧
    2023-03-03
  • 基于python實(shí)現(xiàn)語音錄入識別代碼實(shí)例

    基于python實(shí)現(xiàn)語音錄入識別代碼實(shí)例

    這篇文章主要介紹了如何通過python實(shí)現(xiàn)語音錄入識別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 基于Python編寫一個網(wǎng)絡(luò)帶寬測試工具

    基于Python編寫一個網(wǎng)絡(luò)帶寬測試工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫一個網(wǎng)絡(luò)帶寬測試工具,能夠準(zhǔn)確測量網(wǎng)絡(luò)的上傳和下載速度,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-12-12
  • Python高級特性與幾種函數(shù)的講解

    Python高級特性與幾種函數(shù)的講解

    今天小編就為大家分享一篇關(guān)于Python高級特性與幾種函數(shù)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Python中多進(jìn)程處理的Process和Pool的用法詳解

    Python中多進(jìn)程處理的Process和Pool的用法詳解

    在Python編程中,多進(jìn)程是一種強(qiáng)大的并行處理技術(shù),Python提供了兩種主要的多進(jìn)程處理方式:Process和Pool,本文將詳細(xì)介紹這兩種方式的使用,希望對大家有所幫助
    2024-02-02
  • python opencv通過按鍵采集圖片源碼

    python opencv通過按鍵采集圖片源碼

    OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上,本文給大家分享python opencv通過按鍵采集圖片源碼,感興趣的朋友一起看看吧
    2021-05-05
  • Python 實(shí)現(xiàn)一個顏色色值轉(zhuǎn)換的小工具

    Python 實(shí)現(xiàn)一個顏色色值轉(zhuǎn)換的小工具

    這篇文章主要介紹了Python 實(shí)現(xiàn)一個顏色色值轉(zhuǎn)換的小工具的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • python實(shí)現(xiàn)公司年會抽獎程序

    python實(shí)現(xiàn)公司年會抽獎程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)公司年會抽獎程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

聂拉木县| 益阳市| 荆州市| 红桥区| 务川| 新化县| 华宁县| 大荔县| 宁河县| 临泉县| 福建省| 宁明县| 武清区| 米泉市| 乐东| 内江市| 竹溪县| 南阳市| 太仓市| 泸水县| 莱阳市| 通化县| 宜城市| 股票| 万州区| 远安县| 遵义市| 山丹县| 秀山| 洪湖市| 新干县| 宿州市| 新河县| 朝阳县| 八宿县| 万山特区| 博乐市| 伊宁县| 福安市| 漳州市| 镇沅|