首頁 > 軟體

十行Python3程式碼實現去除pdf檔案水印

2022-02-23 19:02:01

1、引言

小屌絲:魚哥,最近有點不像話了。

小魚:嗯?? 啥個意思嘛~

小屌絲:一週了,沒分享小知識了。

小魚:就因為這個??

小屌絲:那是,我這麼愛學習的人。

小魚:怕是你有什麼事情解決不了,想到我了吧?

小屌絲:呵 ~ 笑話 ~ 我 能有…什…麼…事情…

小魚:說吧,

小屌絲:這可是你讓我說的,我可沒主動要問的!

小魚:說吧,咋還磨磨唧唧了呢

小屌絲:我在某站下載的pfd檔案,有水印,如何去掉啊?

小魚:我突然想起來,PPT還沒寫完。

小屌絲:我家樓下剛開一個燒烤店,據說還不錯!

小魚:PPT寫不完,可以晚上寫,助人為樂讓我更快樂。

2、程式碼實戰

在上一篇博文,我們知道了如何給pdf檔案新增水印,

而本篇,我們就給pdf去水印

如果不知道如何新增水印,就看這篇:2行Python程式碼實現給pdf檔案新增水印

小屌絲:你這新增完水印,又去除水印,你這是鬧哪樣??

小魚:我喜歡,我稀罕,我樂意!!

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:Projectwatemark'

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:Projectwatemark'
	
	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、總結

寫到這裡,今天的分享就差不多快結束了。

需要理解的流程是,

1.pdf檔案需要先轉換成圖片,進行水印去除,

2.再轉換成pdf

3.最後插入到新的pdf檔案中。

到此這篇關於十行Python3程式碼實現去除pdf檔案水印的文章就介紹到這了,更多相關Python3去除pdf水印內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com