成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何批量給PDF添加水印?

開發
批量給PDF添加水印的工作如果手動操作肯定要累死人,但是如果用Python來做,就非常簡單,代碼不超過30行。

我們有時候需要把一些機密文件發給多個客戶,為了避免客戶泄露文件,會在機密文件中添加水印。每個客戶收到的文件內容相同,但是水印都不相同。這樣一來,如果資料泄露了,通過水印就知道是從誰手上泄露的。

今天,一個做市場的朋友找我咨詢PDF加水印的問題,如下圖所示:

他有一個Excel文件,文件里面有10000個經銷商的名字,他要把價目表PDF發給這些經銷商,每個經銷商收到的PDF文件上面的水印都是這個經銷商自己的名字。

這個需求手動操作肯定要累死人。但是如果用Python來做,就非常簡單。代碼不超過30行。

準備環境

要完成這個需求,需要安裝兩個模塊,分別叫做reportlab和pikepdf。使用Pip安裝就可以了:

python3 -m pip install reportlab pikepdf

然后,需要找到一個.ttf或者.ttc格式的中文字體。你可以直接從網上下載中文字體文件。也可以使用系統自帶的中文字體。這里以尋找macOS系統默認的宋體為例。

macOS系統字體在/System/Library/Fonts,宋體對應的.ttc文件地址是/System/Library/Fonts/Supplemental/Songti.ttc。對于系統默認的字體,我們只需要知道它的對應的文件名叫做Songti.ttc就可以了。如果是從網上下載的第三方字體,需要使用絕對路徑或者相對于項目代碼的相對路徑。

獲得經銷商名字對應的列表

由于這位朋友不會使用pandas,那么我們就盡量使用Python原生的方法來獲得經銷商名字列表。假設經銷商信息對應的Excel如下圖所示:

我們首先把這個Excel文件導出成csv文件:

然后,我們用Python讀取這個csv文件,獲得經銷商名字列表:

import csv
with open('經銷商信息.csv') as f:
reader = csv.DictReader(f)
name_list = [x['經銷商名字'] for x in reader]

print(name_list)

運行效果如下圖所示:

生成水印PDF

一般來說,我們不能直接把一段文字作為水印添加到另一個PDF文件中。我們只有先把這段文字生成圖片或者生成水印PDF文件,然后把這個圖片或者水印PDF作為『圖層』覆蓋到目標PDF上面。

因此,現在需要給每一個經銷商生成對應的水印PDF文件。這個PDF中只含有水印文字。效果如下圖所示:

對應的代碼create_watermark.py如下:

import csv
from pathlib import Path
from reportlab.lib import units
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont


with open('經銷商信息.csv') as f:
reader = csv.DictReader(f)
name_list = [x['經銷商名字'] for x in reader]

pdfmetrics.registerFont(TTFont('Songti', 'Songti.ttc')) # 加載中文字體

water_mark_folder = Path('water_pdf') # 用一個文件夾存放所有的水印PDF
water_mark_folder.mkdir(exist_ok=True)

for name in name_list:
path = str(water_mark_folder / Path(f'{name}.pdf'))
c = canvas.Canvas(path, pagesize=(200 * units.mm, 200 * units.mm)) # 生成畫布,長寬都是200毫米
c.translate(0.1 * 200 * units.mm, 0.1 * 200 * units.mm)
c.rotate(45) # 把水印文字旋轉45°
c.setFont('Songti', 35) # 字體大小
c.setStrokeColorRGB(0, 0, 0) # 設置字體顏色
c.setFillColorRGB(0, 0, 0) # 設置填充顏色
c.setFillAlpha(0.3) # 設置透明度,越小越透明
c.drawString(0, 0, f'{name}專用價目表,嚴禁泄露!')
c.save()

代碼的具體作用,已經寫到注釋中了。運行以后會在當前項目根目錄生成water_pdf文件夾,里面就是生成的水印PDF。

合并水印與目標PDF

最后一步,把每一個經銷商的水印PDF與目標PDF進行合并。水印PDF作為一個圖層覆蓋到目標PDF上面。

使用pikepdf完成這個工作非常簡單,編寫一個combine.py文件,代碼如下:

import glob
from pathlib import Path
from pikepdf import Pdf, Page, Rectangle


water_pdf_list = glob.glob('water_pdf/*.pdf')
result = Path('result')
result.mkdir(exist_ok=True)

col = 2 # 每頁多少列水印
row = 3 # 每頁多少行水印

for path in water_pdf_list:
target = Pdf.open('./PythonisinstanceGolang.pdf') # 必須每次重新打開PDF,因為添加水印是inplace的操作
file = Path(path)
name = file.stem
water_mark_pdf = Pdf.open(path)
water_mark = water_mark_pdf.pages[0]

for page in target.pages:
for x in range(col): # 每一行顯示多少列水印
for y in range(row): # 每一頁顯示多少行PDF
page.add_overlay(water_mark,
Rectangle(page.trimbox[2] * x / col,
page.trimbox[3] * y / row,
page.trimbox[2] * (x + 1) / col,
page.trimbox[3] * (y + 1) / row))

result_name = Path('result', f'{name}_添加水印.pdf')
target.save(str(result_name))

運行以后,會在項目根目錄生成一個result文件夾,里面就是添加了水印的PDF文件了,如下圖所示:

這里有必要對代碼中的一些地方進行解釋。帶上行號的代碼如下圖所示:

代碼第21行和22行,有兩個for循環,他們的作用是給一個頁面上添加多個水印。請大家注意下圖我畫圈的地方:

每一頁都有6個水印,分成3行2列。其中的3行對應了變量row的值。2列對應了變量col的值。大家也可以根據自己的需要修改這兩個數字。甚至每一頁的水印隨機變換位置,防止被去水印的程序移除。

page.trimbox是PDF頁面的寬度,page.trimbox是PDF頁面的高度。

總結

大家注意在這篇文章中,我把任務分成了三個部分,分別是:

  • Excel轉CSV,讓Python方便讀取
  • Python讀取CSV生成水印PDF
  • 水印PDF與目標PDF文件合并

這三個部分的代碼是可以合并在一個.py文件里面的,但是我沒有這樣做,是考慮到問這個問題的同學不是程序員,Python水平只是入門,如果合并在一起,代碼量多了以后,出問題都不知道錯在哪里。

在計算機領域,所有問題都可以通過把問題拆分成多個部分分別單獨運行或者增加若干個中間層來解決。今天用的方法就是把問題拆分的方法。對于初學者來說,每一步都是相對獨立的,都能立刻看到效果。第二步只需要依賴第一步的結果,第三步只需要依賴第二步的結果,這樣每一步的輸入輸出非常清楚,可以顯著降低問題的復雜度。如果報錯了,也更容易知道是哪個地方有問題。

責任編輯:趙寧寧 來源: 未聞Code
相關推薦

2024-08-01 08:37:46

vue圖片性能

2021-11-09 06:55:03

水印圖像開發

2024-01-09 16:02:44

Python開源

2025-04-09 08:00:00

2024-03-19 08:35:30

Vue3添加水印維護版權標識

2022-05-13 09:36:06

Python水印命令

2021-04-22 11:27:24

Python命令水印

2023-09-27 12:11:08

Python水印Pillow

2023-08-30 13:24:00

AI工具

2009-11-24 15:43:17

PHP給圖片加水印

2019-08-15 15:00:31

Linux命令行PDF

2025-02-04 10:23:56

C#視頻版權

2009-12-07 15:41:51

PHP圖片加水印

2021-09-02 15:25:54

技術視頻摳圖

2016-09-06 21:09:35

Phpgd庫圖片水印

2020-09-01 16:56:58

華為云

2024-06-12 08:36:32

PyPDF2Python庫文件處理

2023-07-25 09:54:00

谷歌科技

2025-04-08 09:10:00

PillowPython圖像處理

2019-12-19 15:12:37

AI 數據人工智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产伦精品一区二区三区高清 | 黄色一级毛片免费看 | 精品av久久久久电影 | 91porn在线观看| 午夜看看| 欧美99久久精品乱码影视 | 精品久久视频 | 日韩欧美精品在线 | 国产精品久久久久一区二区三区 | av中文字幕在线观看 | 成人性视频在线播放 | 亚洲精彩视频 | 黄色片在线观看网址 | 在线观看黄色电影 | 国产欧美一区二区三区在线看 | 亚洲专区在线 | 超碰人人在线 | 欧美激情综合网 | 六月成人网 | 欧美一区二区三区,视频 | 国产精品福利久久久 | 秋霞a级毛片在线看 | 欧美亚洲国产成人 | 亚洲另类春色偷拍在线观看 | 国产一级片一区二区三区 | 免费激情av | 国产一区二区三区久久久久久久久 | 91成人免费看片 | 精品一区二区久久久久久久网精 | 视频二区 | 亚洲国产精品人人爽夜夜爽 | 国产精品一区二区三区在线 | 日韩不卡一区二区 | 9久久精品| 欧美v日韩v | 国产一区二区三区不卡av | 欧美日韩国产不卡 | 日韩精品成人一区二区三区视频 | 嫩草视频在线看 | 日本aa毛片a级毛片免费观看 | 在线日韩福利 |