1. 程式人生 > >用python給pdf批量新增水印,並給pdf加密

用python給pdf批量新增水印,並給pdf加密

  1. 設定路徑

先設定路徑,把需要加水印的相關文件放入一個目錄下。我的目錄是:E:\python\test\pdf批量加水印os.chdir('E:\\python\\test\\pdf批量加水印\\')

  1. 準備水印pdf檔案

如下程式碼所示。若水印為中文,先from reportlab.pdfbase.ttfonts import TTFont,然後找到電腦中字型路徑,如我希望找到宋體,路徑為“C:/Windows/Fonts/simsun.ttc”,命名為"song"(其他字型也可任君挑選)。應用到後續create_watermarkh函式中即可。

from reportlab.pdfbase.ttfonts import TTFont 
pdfmetrics.registerFont(TTFont('song', 'C:/Windows/Fonts/simsun.ttc'))#宋體

另,希望頁面上貼四個水印,通過函式c.drawString(-7cm, 0cm, content)改變座標實現。便可生成水印pdf檔案。

def create_watermark(content):
    #預設大小為21cm*29.7cm
    c = canvas.Canvas('mark.pdf', pagesize = (30*cm, 30*cm))   
    c.translate(10*cm, 10*cm) #移動座標原點(座標系左下為(0,0)))                                                                                                                             
    c.setFont('song',22)#設定字型為宋體,大小22號
    c.setFillColorRGB(0.5,0.5,0.5)#灰色                                                                                                                         
    c.rotate(45)#旋轉45度,座標系被旋轉
    c.drawString(-7*cm, 0*cm, content)
    c.drawString(7*cm, 0*cm, content)
    c.drawString(0*cm, 7*cm, content)
    c.drawString(0*cm, -7*cm, content)                                                                                                                              
    c.save()#關閉並儲存pdf檔案
  1. 準備水印pdf檔案 這一步驟基本沒有什麼問題,提醒給pdf設定密碼的語法為.encrypt('scb2018')#設定pdf密碼。若需更改密碼,改變引號中內容即可。注:input_pdf為需要打上水印的pdf,watermark_pdf為水印pdf,output_pdf為最終輸出的pdf。
def add_watermark2pdf(input_pdf,output_pdf,watermark_pdf):
    watermark = PdfFileReader(watermark_pdf)
    watermark_page = watermark.getPage(0)
    pdf = PdfFileReader(input_pdf,strict=False)
    pdf_writer = PdfFileWriter()
    for page in range(pdf.getNumPages()):
        pdf_page = pdf.getPage(page)
        pdf_page.mergePage(watermark_page)
        pdf_writer.addPage(pdf_page)
    pdfOutputFile = open(output_pdf,'wb')   
    pdf_writer.encrypt('scb2018')#設定pdf密碼
    pdf_writer.write(pdfOutputFile)
    pdfOutputFile.close()

4.匯入你需要批量作為水一個excel中

最後,完整程式碼如下

######## 基礎準備 ########
import os
os.getcwd() 
os.chdir('E:\\python\\test\\pdf批量加水印\\')
os.getcwd()    #獲取當前工作目錄

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('song', 'C:/Windows/Fonts/simsun.ttc'))#宋體
from PyPDF2 import PdfFileWriter,PdfFileReader
import xlrd
  
######## 1.生成水印pdf的函式 ########
def create_watermark(content):
    #預設大小為21cm*29.7cm
    c = canvas.Canvas('mark.pdf', pagesize = (30*cm, 30*cm))   
    c.translate(10*cm, 10*cm) #移動座標原點(座標系左下為(0,0)))                                                                                                                             
    c.setFont('song',22)#設定字型為宋體,大小22號
    c.setFillColorRGB(0.5,0.5,0.5)#灰色                                                                                                                         
    c.rotate(45)#旋轉45度,座標系被旋轉
    c.drawString(-7*cm, 0*cm, content)
    c.drawString(7*cm, 0*cm, content)
    c.drawString(0*cm, 7*cm, content)
    c.drawString(0*cm, -7*cm, content)                                                                                                                              
    c.save()#關閉並儲存pdf檔案

######## 2.為pdf檔案加水印的函式 ########
def add_watermark2pdf(input_pdf,output_pdf,watermark_pdf):
    watermark = PdfFileReader(watermark_pdf)
    watermark_page = watermark.getPage(0)
    pdf = PdfFileReader(input_pdf,strict=False)
    pdf_writer = PdfFileWriter()
    for page in range(pdf.getNumPages()):
        pdf_page = pdf.getPage(page)
        pdf_page.mergePage(watermark_page)
        pdf_writer.addPage(pdf_page)
    pdfOutputFile = open(output_pdf,'wb')   
    pdf_writer.encrypt('scb2018')#設定pdf密碼
    pdf_writer.write(pdfOutputFile)
    pdfOutputFile.close()

######## 3.匯入excel:325家投放商家明細10.30 ########
ExcelFile = xlrd.open_workbook('商家名單.xlsx')
sheet=ExcelFile.sheet_by_name('sheet1')#開啟有商家名單那個sheet
print('———————已匯入商家名單———————')
col = sheet.col_values(3)#第4列內容為商家名稱
id = sheet.col_values(0)#第1列內容為ID
del col[0];del id[0]#去掉標題
id2 = [str(int(i)) for i in id]
merchant_as_mark_content =[(i+'  ')*4 if len(i)<=5 else i for i in col]#如果名稱太短則重複4個為一行

######## 4.呼叫前面的函式製作商家水印pdf ########
if __name__=='__main__':
    for i,j,k in zip(merchant_as_mark_content,,id2):#i製作水印,j檔名,k對應ID
        create_watermark(i)#創造了一個水印pdf:mark.pdf
        add_watermark2pdf('需要加水印的原始檔.pdf',k+'通知('+j+').pdf','mark.pdf')
        print('———————已製作好第'+k+'個pdf,正在準備下一個———————')
    print('———————所有檔案已轉化完畢———————')