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

Python實(shí)現(xiàn)自動(dòng)化處理PDF文件的方法詳解

 更新時(shí)間:2022年09月05日 11:21:28   作者:夢(mèng)里逆天  
這篇文章主要為大家詳細(xì)介紹了如何使用Python完成簡(jiǎn)單的PDF文件處理操作,如PDF文件的批量合并、拆分、加密以及添加水印等,需要的可以參考一下

自動(dòng)化處理PDF文件

使用Python完成簡(jiǎn)單的PDF文件處理操作,如PDF文件的批量合并、拆分、加密以及添加水印等。

1. 批量合并PDF文件

from pathlib import Path
# PdfFileReader用于讀取PDF文件,PdfFileMerger用于合并PDF文件
from PyPDF2 import PdfFileReader, PdfFileMerger


src_folder = Path('PDF1')  # 設(shè)置要合并的多個(gè)PDF文件所在的文件路徑
des_file = Path(r'PDF2\combine.pdf')    # 設(shè)置合并后的PDF文件的保存文件夾和文件名
# 調(diào)用路徑對(duì)象的parent屬性返回父文件夾(即保存文件夾)的路徑
if not des_file.parent.exists():
    # 如果該文件夾不存在,則創(chuàng)建該文件夾
    des_file.parent.mkdir(parents=True)
# 獲取所有要合并的PDF文件的路徑
file_list = list(src_folder.glob('*.pdf'))

# 讀取PDF并進(jìn)行合并
merger = PdfFileMerger()  # 創(chuàng)建PdfFileMerger對(duì)象
outputPages = 0  # 統(tǒng)計(jì)合并到PDF文件的總頁(yè)數(shù)
# 遍歷文件列表
for pdf in file_list:
    input_file = PdfFileReader(str(pdf))  # 讀取待合并的PDF文件
    merger.append(input_file)  # 將PDF文件合并到PdfFileMerger對(duì)象中
    pageCount = input_file.getNumPages()   # 獲取PDF文件的頁(yè)數(shù)
    print(f'{pdf.name}--頁(yè)數(shù):{pageCount}')
    outputPages += pageCount  # 進(jìn)行累加,統(tǒng)計(jì)總頁(yè)數(shù)
merger.write(str(des_file))  # 將合并好的PDF文件寫(xiě)入指定的路徑
merger.close()  # 關(guān)閉PdfFileMerger對(duì)象,釋放資源
print(f'\n合并后的總頁(yè)數(shù):{outputPages}')

測(cè)試文件:

效果:

2. 批量拆分PDF文件

from math import ceil
from pathlib import Path
from PyPDF2 import PdfFileReader, PdfFileWriter

src_folder = Path('PDF2')  # 設(shè)置要拆分的多個(gè)PDF文件所在的文件路徑
output_folder = Path('PDF2')  # 設(shè)置拆分后的PDF文件的保存文件夾和文件名
# 獲取所有要拆分的PDF文件的路徑
file_list = list(src_folder.glob('*.pdf'))
# 采用按固定頁(yè)數(shù)進(jìn)行拆分
step = 5  # 每份為5頁(yè)
for pdf in file_list:
    inputFile = PdfFileReader(str(pdf))
    pages = inputFile.getNumPages()  # 獲取PDF文件的頁(yè)數(shù)
    # 判斷PDF文件頁(yè)數(shù)是否小于等于step
    if pages <= step:
        # 若是則不進(jìn)行拆分
        continue
    else:
        parts = ceil(pages / step)  # 拆分的份數(shù),向上取整
    # 根據(jù)份數(shù)進(jìn)行循環(huán)
    for pt in range(parts):
        # 計(jì)算每一份的開(kāi)始頁(yè)碼和結(jié)束頁(yè)碼
        # PyPDF2模塊中,PDF文件頁(yè)碼從0開(kāi)始
        start = step * pt
        # 判斷是否是最后一份
        if pt != (parts - 1):
            # 如果不是最后一份,那么結(jié)束頁(yè)碼為開(kāi)始頁(yè)碼加每份頁(yè)數(shù)減1
            end = start + step - 1
        else:
            # 若是最后一份,則結(jié)束頁(yè)碼等于文件頁(yè)數(shù)減1
            end = pages - 1

        # 拆分文件
        outputfile = PdfFileWriter()  # 創(chuàng)建PdfFileWriter對(duì)象
        for pageNum in range(start, end + 1):
            outputfile.addPage(inputFile.getPage(pageNum))
        # 調(diào)用路徑對(duì)象的stem屬性獲取文件的主名,與后面的字符串拼接成PDF文件名
        pt_name = f'{pdf.stem}_第{pt + 1}份.pdf'
        pt_file = output_folder / pt_name  # 生成當(dāng)前份的PDF文件的保存路徑
        with open(pt_file, 'wb') as f:
            outputfile.write(f)
    print(f'【{pdf.name}】共{pages}頁(yè),拆分為{parts}份-->完成')

效果:

3. 批量加密PDF文件

from pathlib import Path
from PyPDF2 import PdfFileReader, PdfFileWriter

src_folder = Path('PDF2')  # 設(shè)置要加密的多個(gè)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對(duì)象
    pageCount = len(inputFile.pages)  # 獲得PDF文件頁(yè)數(shù)
    for pageNum in range(pageCount):
        # 將PDF內(nèi)容逐頁(yè)添加到輸出文件
        outputFile.add_page(inputFile.pages[pageNum])
        # 進(jìn)行加密
        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è)置水印文件的頁(yè)面大小
    can.translate(5 * cm, 0 * cm)  # 設(shè)置頁(yè)面的坐標(biāo)原點(diǎn)
    # 注冊(cè)水印文件需要使用的字體
    reportlab.pdfbase.ttfonts.pdfmetrics.registerFont(
        reportlab.pdfbase.ttfonts.TTFont(name='華文行楷', filename=r'C:\Windows\Fonts\STXINGKA.TTF'))
    can.setFont(psfontname='華文行楷', size=25)  # 設(shè)置水印字體即字號(hào)
    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對(duì)象
    page_count = len(input_file.pages)  # 獲得PDF文件頁(yè)數(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)  # 將頁(yè)面添加到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è)置水印文件的頁(yè)面大小
    can.translate(5 * cm, 0 * cm)  # 設(shè)置頁(yè)面的坐標(biāo)原點(diǎn)
    # 注冊(cè)水印文件需要使用的字體
    reportlab.pdfbase.ttfonts.pdfmetrics.registerFont(
        reportlab.pdfbase.ttfonts.TTFont(name='華文行楷', filename=r'C:\Windows\Fonts\STXINGKA.TTF'))
    can.setFont(psfontname='華文行楷', size=25)  # 設(shè)置水印字體即字號(hào)
    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對(duì)象
    page_count = len(input_file.pages)  # 獲得PDF文件頁(yè)數(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)  # 將頁(yè)面添加到PDF文件
    with open(pdf_file_output, 'wb') as pf:
        output_file.write(pf)
    print(f'{pdf_file_input}添加水印-->處理完成')


if __name__ == '__main__':
    # 創(chuàng)建Path對(duì)象
    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實(shí)現(xiàn)自動(dòng)化處理PDF文件的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python自動(dòng)化處理PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python 將字符串中的數(shù)字相加求和的實(shí)現(xiàn)

    python 將字符串中的數(shù)字相加求和的實(shí)現(xiàn)

    這篇文章主要介紹了python 將字符串中的數(shù)字相加求和的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python實(shí)現(xiàn)定時(shí)自動(dòng)備份文件

    Python實(shí)現(xiàn)定時(shí)自動(dòng)備份文件

    隨著數(shù)據(jù)的不斷增長(zhǎng),文件備份變得越來(lái)越重要,這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)定時(shí)自動(dòng)備份文件功能,需要可以了解下
    2024-12-12
  • 詳解如何用TensorFlow訓(xùn)練和識(shí)別/分類(lèi)自定義圖片

    詳解如何用TensorFlow訓(xùn)練和識(shí)別/分類(lèi)自定義圖片

    這篇文章主要介紹了詳解如何用TensorFlow訓(xùn)練和識(shí)別/分類(lèi)自定義圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解OpenCV自適應(yīng)直方圖均衡化的應(yīng)用

    詳解OpenCV自適應(yīng)直方圖均衡化的應(yīng)用

    在本文中,將介紹如何應(yīng)用對(duì)比度受限的自適應(yīng)直方圖均衡化 ( Contrast Limited Adaptive Histogram Equalization, CLAHE ) 來(lái)均衡圖像,需要的可以參考一下
    2022-02-02
  • 詳解python中的變量與注釋

    詳解python中的變量與注釋

    在 Python 中,變量是用于存儲(chǔ)數(shù)據(jù)的名稱,它可以保存不同類(lèi)型的數(shù)據(jù),在Python中,有兩種類(lèi)型的注釋:?jiǎn)涡凶⑨尯投嘈凶⑨?本文就給大家詳細(xì)的介紹一下python中的變量與注釋,需要的朋友可以參考下
    2023-08-08
  • python查看微信好友是否刪除自己

    python查看微信好友是否刪除自己

    這篇文章主要為大家詳細(xì)介紹了python查看微信好友是否刪除自己,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • python中import,from……import的使用詳解

    python中import,from……import的使用詳解

    這篇文章主要介紹了python中import,from……import的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python?matplotlib實(shí)戰(zhàn)之氣泡圖繪制

    Python?matplotlib實(shí)戰(zhàn)之氣泡圖繪制

    氣泡圖是一種多變量的統(tǒng)計(jì)圖表,可以看作是散點(diǎn)圖的變形,這篇文章主要為大家介紹了如何使用Matplotlib繪制氣泡圖,需要的小伙伴可以參考下
    2023-08-08
  • Win10下Python3.7.3安裝教程圖解

    Win10下Python3.7.3安裝教程圖解

    到2019年初,Python3已經(jīng)更新到了Python3.7.3,Python有兩個(gè)大版本Python2和Python3,Python3是現(xiàn)在和未來(lái)的主流。這篇文章主要介紹了Win10下Python3.7.3安裝教程圖解,非常不錯(cuò),感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • Python實(shí)現(xiàn)按逗號(hào)分隔列表的方法

    Python實(shí)現(xiàn)按逗號(hào)分隔列表的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)按逗號(hào)分隔列表的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論

都江堰市| 芦山县| 凉山| 邻水| 清水县| 会东县| 辉县市| 洛隆县| 肥乡县| 综艺| 雅安市| 襄城县| 遵化市| 巴塘县| 三穗县| 绥化市| 湾仔区| 利辛县| 德惠市| 永平县| 厦门市| 都匀市| 宽甸| 含山县| 江陵县| 青海省| 宁远县| 云林县| 察哈| 班玛县| 平顶山市| 襄城县| 苏州市| 丽江市| 汝南县| 石城县| 邳州市| 滦南县| 苍溪县| 远安县| 临夏市|