十行Python3代碼實(shí)現(xiàn)去除pdf文件水印
1、引言
小屌絲:魚哥,最近有點(diǎn)不像話了。
小魚:嗯?? 啥個(gè)意思嘛~
小屌絲:一周了,沒分享小知識(shí)了。
小魚:就因?yàn)檫@個(gè)??
小屌絲:那是,我這么愛學(xué)習(xí)的人。
小魚:怕是你有什么事情解決不了,想到我了吧?
小屌絲:呵 ~ 笑話 ~ 我 能有…什…么…事情…
小魚:說吧,
小屌絲:這可是你讓我說的,我可沒主動(dòng)要問的!
小魚:說吧,咋還磨磨唧唧了呢
小屌絲:我在某站下載的pfd文檔,有水印,如何去掉???
小魚:我突然想起來,PPT還沒寫完。
小屌絲:我家樓下剛開一個(gè)燒烤店,據(jù)說還不錯(cuò)!
小魚:PPT寫不完,可以晚上寫,助人為樂讓我更快樂。
2、代碼實(shí)戰(zhàn)
在上一篇博文,我們知道了如何給pdf文檔添加水印,
而本篇,我們就給pdf去水印
如果不知道如何添加水印,就看這篇:2行Python代碼實(shí)現(xiàn)給pdf文件添加水印
小屌絲:你這添加完水印,又去除水印,你這是鬧哪樣??
小魚:我喜歡,我稀罕,我樂意?。?/p>
2.1 去除原理
去除方法:
1、用 PyMuPDF 打開 pdf 文件,將 pdf 的每一頁(yè)都轉(zhuǎn)換為圖片 pixmap,
2、pixmap 有它自己的 RGB,只需要將 pdf 水印中的 RGB 改為(255, 255, 255),并保存圖片
3、按照生成的圖片,插入到pdf文檔中
因?yàn)閜fd文檔無法直接去除水印,需要先將pfd文檔轉(zhuǎn)換成圖片,在逐一對(duì)圖片進(jìn)行水印去除操作,最后在把圖片插入到pdf文檔中
2.2 代碼解析
1、先查看PDF文檔中的水印rgb值是多少
可以看到,RGB(179,179,179),因?yàn)檫@里要的是RGB色值總和,所以我們就認(rèn)為,超過510,就認(rèn)為是水印。
敲黑板
- 光學(xué)三原色是紅綠藍(lán)(RGB),也就是說它們是不可分解的三種基本顏色,其他顏色都可以通過這三種顏色混合而成,三種顏色等比例混合就是白色,沒有光就是黑色。
- 在計(jì)算機(jī)中,可以用三個(gè)字節(jié)表示 RGB 顏色,1個(gè)字節(jié)能表示的最大數(shù)值是 255, 所以,(255, 0, 0)代表紅色,(0, 255, 0)代表綠色,(0, 0, 255)代表藍(lán)色。相應(yīng)地,(255, 255, 255)代表白色,(0, 0, 0)代表黑色。從(0, 0, 0) ~ (255, 255, 255) 之間的任意組合都可以代表一個(gè)不同的顏色。
- 圖片每個(gè)位置顏色由四元組表示,前三位分別是 RGB,第四位是 Alpha 通道
2、pdf轉(zhuǎn)換成圖片,并去除水印
代碼示例:
# -*- 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("跟小魚學(xué)習(xí)去水印.pdf") #page_no 設(shè)置為0 page_no = 0 #page在pdf文件中遍歷 for page in pdf_file: #獲取每一頁(yè)對(duì)應(yīng)的圖片pix (pix對(duì)象類似于我們上面看到的img對(duì)象,可以讀取、修改它的 RGB) #page.get_pixmap() 這個(gè)操作是不可逆的,即能夠?qū)崿F(xiàn)從 PDF 到圖片的轉(zhuǎn)換,但修改圖片 RGB 后無法應(yīng)用到 PDF 上,只能輸出為圖片 pix = page.get_pixmap() #遍歷圖片中的寬和高,如果像素的rgb值總和大于510,就認(rèn)為是水印,轉(zhuǎn)換成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)) #打印結(jié)果 print(f'第 {page_no} 頁(yè)去除完成') page_no += 1 if __name__ == '__main__': remove_pdfwatermark()
執(zhí)行完成,
查看生成圖片:
查看圖片內(nèi)容:
3、圖片轉(zhuǎn)為pdf
代碼示例:
# -*- coding:utf-8 -*- # @Time : 2022-02-23 # @Author : carl_DJ from PIL import Image from itertools import product import fitz ''' 圖片轉(zhuǎn)為pdf''' #圖片所在的文件夾 pic_dir = 'D:\Project\watemark' pdf = fitz.open() #圖片數(shù)字文件先轉(zhuǎn)換成int類型進(jìn)行排序 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) #將打開后的圖片轉(zhuǎn)成單頁(yè)pdf pdfbytes = imgdoc.convertToPDF() imgpdf = fitz.open("pdf", pdfbytes) #將單頁(yè)pdf插入到新的pdf文檔中 pdf.insertPDF(imgpdf) pdf.save("跟小魚學(xué)習(xí)去水印_完成.pdf") pdf.close()
執(zhí)行代碼,
查看生成的pdf文檔
2.3 代碼整合
上面的內(nèi)容都了解以后,我們就整合代碼,直接運(yùn)行就可以了。
# -*- 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("跟小魚學(xué)習(xí)去水印.pdf") #page_no 設(shè)置為0 page_no = 0 #page在pdf文件中遍歷 for page in pdf_file: #獲取每一頁(yè)對(duì)應(yīng)的圖片pix (pix對(duì)象類似于我們上面看到的img對(duì)象,可以讀取、修改它的 RGB) #page.get_pixmap() 這個(gè)操作是不可逆的,即能夠?qū)崿F(xiàn)從 PDF 到圖片的轉(zhuǎn)換,但修改圖片 RGB 后無法應(yīng)用到 PDF 上,只能輸出為圖片 pix = page.get_pixmap() #遍歷圖片中的寬和高,如果像素的rgb值總和大于510,就認(rèn)為是水印,轉(zhuǎn)換成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)) #打印結(jié)果 print(f'第 {page_no} 頁(yè)去除完成') page_no += 1 #去除的pdf水印添加到pdf文件中 def pictopdf(): #水印截圖所在的文件夾 # pic_dir = input("請(qǐng)輸入圖片文件夾路徑:") pic_dir = 'D:\Project\watemark' pdf = fitz.open() #圖片數(shù)字文件先轉(zhuǎn)換成int類型進(jìn)行排序 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) #將打開后的圖片轉(zhuǎn)成單頁(yè)pdf pdfbytes = imgdoc.convertToPDF() imgpdf = fitz.open("pdf", pdfbytes) #將單頁(yè)pdf插入到新的pdf文檔中 pdf.insertPDF(imgpdf) pdf.save("跟小魚學(xué)習(xí)去水印_完成.pdf") pdf.close() if __name__ == '__main__': remove_pdfwatermark() pictopdf()
3、總結(jié)
寫到這里,今天的分享就差不多快結(jié)束了。
需要理解的流程是,
1.pdf文檔需要先轉(zhuǎn)換成圖片,進(jìn)行水印去除,
2.再轉(zhuǎn)換成pdf
3.最后插入到新的pdf文檔中。
到此這篇關(guān)于十行Python3代碼實(shí)現(xiàn)去除pdf文件水印的文章就介紹到這了,更多相關(guān)Python3去除pdf水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文教你Python如何使用sqlparse玩轉(zhuǎn)SQL解析
sqlparse?是一個(gè)?Python?第三方庫(kù),專門用于解析和格式化?SQL?語(yǔ)句,它提供了強(qiáng)大的?SQL?解析功能,下面小編就來為大家詳細(xì)介紹一下它的具體使用吧2025-02-02python人工智能tensorflow常用激活函數(shù)Activation?Functions
這篇文章主要為大家介紹了python人工智能tensorflow常用激活函數(shù)Activation?Functions的匯總介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05詳解python函數(shù)的閉包問題(內(nèi)部函數(shù)與外部函數(shù)詳述)
這篇文章主要介紹了python函數(shù)的閉包問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python數(shù)學(xué)建模庫(kù)StatsModels統(tǒng)計(jì)回歸簡(jiǎn)介初識(shí)
這篇文章主要為大家介紹了Python數(shù)學(xué)建模庫(kù)StatsModels統(tǒng)計(jì)回歸的基本概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝打擊多多進(jìn)步2021-10-10python語(yǔ)法之語(yǔ)言元素和分支循環(huán)結(jié)構(gòu)詳解
這篇文章主要介紹了Python的語(yǔ)言元素和分支循環(huán)結(jié)構(gòu),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10Python使用Beautiful Soup包編寫爬蟲時(shí)的一些關(guān)鍵點(diǎn)
這篇文章主要介紹了Python使用Beautiful Soup包編寫爬蟲時(shí)的一些關(guān)鍵點(diǎn),文中講到了parent屬性的使用以及soup的編碼問題,需要的朋友可以參考下2016-01-01