10行代碼給pdf檔案去水印
- 1、引言
- 2、代碼實戰
- 2.1 去除原理
- 2.2 代碼決議
- 2.3 代碼整合
- 3、總結
1、引言
小屌絲:魚哥,最近有點不像話了,
小魚:嗯?? 啥個意思嘛~
小屌絲:一周了,沒分享小知識了,
小魚:就因為這個??
小屌絲:那是,我這么愛學習的人,
小魚:怕是你有什么事情解決不了,想到我了吧?
小屌絲:呵 ~ 笑話 ~ 我 能有…什…么…事情…
小魚:說吧,
小屌絲:這可是你讓我說的,我可沒主動要問的!
小魚:說吧,咋還磨磨唧唧了呢
小屌絲:我在某站下載的pfd檔案,有水印,如何去掉啊?
小魚:我突然想起來,PPT還沒寫完,
小屌絲:我家樓下剛開一個燒烤店,據說還不錯!
小魚:PPT寫不完,可以晚上寫,助人為樂讓我更快樂,

2、代碼實戰
在上一篇博文,我們知道了如何給pdf檔案添加水印,
而本篇,我們就給pdf去水印
如果不知道如何添加水印,就看這篇:《Python3,2段代碼,給pdf檔案添加水印,原來watermark還可以這么玩,》
小屌絲:你這添加完水印,又去除水印,你這是鬧哪樣??
小魚:我喜歡,我稀罕,我樂意!!
2.1 去除原理
去除方法:
- 1、用 PyMuPDF 打開 pdf 檔案,將 pdf 的每一頁都轉換為圖片 pixmap,
- 2、pixmap 有它自己的 RGB,只需要將 pdf 水印中的 RGB 改為(255, 255, 255),并保存圖片
- 3、按照生成的圖片,插入到pdf檔案中
因為pfd檔案無法直接去除水印,需要先將pfd檔案轉換成圖片,在逐一對圖片進行水印去除操作,最后在把圖片插入到pdf檔案中
2.2 代碼決議
1、先查看PDF檔案中的水印rgb值是多少
可以看到,RGB(179,179,179),因為這里要的是RGB色值總和,所以我們就認為,超過510,就認為是水印,
敲黑板
- 光學三原色是紅綠藍(RGB),也就是說它們是不可分解的三種基本顏色,其他顏色都可以通過這三種顏色混合而成,三種顏色等比例混合就是白色,沒有光就是黑色,
- 在計算機中,可以用三個位元組表示 RGB 顏色,1個位元組能表示的最大數值是 255, 所以,(255, 0, 0)代表紅色,(0, 255, 0)代表綠色,(0, 0, 255)代表藍色,相應地,(255, 255, 255)代表白色,(0, 0, 0)代表黑色,從(0, 0, 0) ~ (255, 255, 255) 之間的任意組合都可以代表一個不同的顏色,
- 圖片每個位置顏色由四元組表示,前三位分別是 RGB,第四位是 Alpha 通道
2、pdf轉換成圖片,并去除水印
代碼示例:
# -*- coding:utf-8 -*-
# @Time : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
# 去除pdf的水印
def remove_pdfwatermark():
#打開源pfd檔案
pdf_file = fitz.open("跟小魚學習去水印.pdf")
#page_no 設定為0
page_no = 0
#page在pdf檔案中遍歷
for page in pdf_file:
#獲取每一頁對應的圖片pix (pix物件類似于我們上面看到的img物件,可以讀取、修改它的 RGB)
#page.get_pixmap() 這個操作是不可逆的,即能夠實作從 PDF 到圖片的轉換,但修改圖片 RGB 后無法應用到 PDF 上,只能輸出為圖片
pix = page.get_pixmap()
#遍歷圖片中的寬和高,如果像素的rgb值總和大于510,就認為是水印,轉換成255,255,255-->即白色
for pos in product(range(pix.width), range(pix.height)):
if sum(pix.pixel(pos[0], pos[1])) >= 510:
pix.set_pixel(pos[0], pos[1], (255, 255, 255))
#保存去掉水印的截圖
pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))
#列印結果
print(f'第 {page_no} 頁去除完成')
page_no += 1
if __name__ == '__main__':
remove_pdfwatermark()
執行完成,
查看生成圖片:

查看圖片內容:

3、圖片轉為pdf
代碼示例:
# -*- coding:utf-8 -*-
# @Time : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
''' 圖片轉為pdf'''
#圖片所在的檔案夾
pic_dir = 'D:\Project\watemark'
pdf = fitz.open()
#圖片數字檔案先轉換成int型別進行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))
for img in img_files:
print(img)
imgdoc = fitz.open(pic_dir + '/' + img)
#將打開后的圖片轉成單頁pdf
pdfbytes = imgdoc.convertToPDF()
imgpdf = fitz.open("pdf", pdfbytes)
#將單頁pdf插入到新的pdf檔案中
pdf.insertPDF(imgpdf)
pdf.save("跟小魚學習去水印_完成.pdf")
pdf.close()
執行代碼,
查看生成的pdf檔案

2.3 代碼整合
上面的內容都了解以后,我們就整合代碼,直接運行就可以了,
# -*- coding:utf-8 -*-
# @Time : 2022-02-23
# @Author : carl_DJ
from PIL import Image
from itertools import product
import fitz
# 去除pdf的水印
def remove_pdfwatermark():
#打開源pfd檔案
pdf_file = fitz.open("跟小魚學習去水印.pdf")
#page_no 設定為0
page_no = 0
#page在pdf檔案中遍歷
for page in pdf_file:
#獲取每一頁對應的圖片pix (pix物件類似于我們上面看到的img物件,可以讀取、修改它的 RGB)
#page.get_pixmap() 這個操作是不可逆的,即能夠實作從 PDF 到圖片的轉換,但修改圖片 RGB 后無法應用到 PDF 上,只能輸出為圖片
pix = page.get_pixmap()
#遍歷圖片中的寬和高,如果像素的rgb值總和大于510,就認為是水印,轉換成255,255,255-->即白色
for pos in product(range(pix.width), range(pix.height)):
if sum(pix.pixel(pos[0], pos[1])) >= 510:
pix.set_pixel(pos[0], pos[1], (255, 255, 255))
#保存去掉水印的截圖
pix.pil_save(f"./{page_no}.png", dpi=(30000, 30000))
#列印結果
print(f'第 {page_no} 頁去除完成')
page_no += 1
#去除的pdf水印添加到pdf檔案中
def pictopdf():
#水印截圖所在的檔案夾
# pic_dir = input("請輸入圖片檔案夾路徑:")
pic_dir = 'D:\Project\watemark'
pdf = fitz.open()
#圖片數字檔案先轉換成int型別進行排序
img_files = sorted(os.listdir(pic_dir), key=lambda x: int(str(x).split('.')[0]))
for img in img_files:
print(img)
imgdoc = fitz.open(pic_dir + '/' + img)
#將打開后的圖片轉成單頁pdf
pdfbytes = imgdoc.convertToPDF()
imgpdf = fitz.open("pdf", pdfbytes)
#將單頁pdf插入到新的pdf檔案中
pdf.insertPDF(imgpdf)
pdf.save("跟小魚學習去水印_完成.pdf")
pdf.close()
if __name__ == '__main__':
remove_pdfwatermark()
pictopdf()
3、總結
寫到這里,今天的分享就差不多快結束了,
需要理解的流程是,
- pdf檔案需要先轉換成圖片,進行水印去除,
- 再轉換成pdf
- 最后插入到新的pdf檔案中,
關于圖片及pdf如何添加水印,可以參照小魚的這兩篇博文:
- 《Python3,2行代碼添加水印》
- 《Python3,2段代碼,給pdf檔案添加水印》
關注小魚博客,帶你了解更多更有趣python知識,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432146.html
標籤:AI
上一篇:Python環境下用中文做了個《王者榮耀》AI腳本,附視頻
下一篇:R語言匯入資料檔案(資料匯入、加載、讀取)、使用readr包中的read_csv函式匯入逗號分割檔案CSV(Comma Delimited Text File)
