超簡單!用 Python 為圖片和 PDF 去掉水印

大家好,我是菜鳥哥。
網(wǎng)上下載的 pdf 學(xué)習(xí)資料有一些會帶有水印,非常影響閱讀。比如下面的圖片就是在 pdf 文件上截取出來的,今天我們就來用Python解決這個(gè)問題。

安裝模塊
PIL:Python Imaging Library 是 python 上非常強(qiáng)大的圖像處理標(biāo)準(zhǔn)庫,但是只能支持 python 2.7,于是就有志愿者在 PIL 的基礎(chǔ)上創(chuàng)建了支持 python 3的 pillow,并加入了一些新的特性。
pip?install?pillow
pymupdf 可以用 python 訪問擴(kuò)展名為*.pdf、.xps、.oxps、.epub、.cbz或*.fb2的文件。還支持了許多流行的圖像格式,包括多頁TIFF圖像。
pip?install?PyMuPDF
導(dǎo)入需要用到的模塊
from?PIL?import?Image
from?itertools?import?product
import?fitz
import?os
獲取圖片的 RGB
pdf 去水印的原理和圖片去水印的原理差不多,小編先從去除上面那張圖片的水印開始。
學(xué)過計(jì)算機(jī)的小伙伴們都知道 ,計(jì)算機(jī)中用 RGB 代表紅綠藍(lán),用 (255, 0, 0) 表示紅色,(0, 255, 0) 表示綠色,(0, 0, 255) 表示藍(lán)色,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,去水印的原理就是將水印的顏色變成白色(255, 255, 255)。
首先獲取圖片寬和高,用 itertools 模塊獲取寬和高的笛卡爾積作為像素點(diǎn)。每個(gè)像素點(diǎn)的顏色都由 前三位的 RGB 和 第四位的 Alpha 通道構(gòu)成。Alpha 通道不需要,只要 RGB 數(shù)據(jù)。
def?remove_img():
????image_file?=?input("請輸入圖片地址:")
????img?=?Image.open(image_file)
????width,?height?=?img.size
????for?pos?in?product(range(width),?range(height)):
????????rgb?=?img.getpixel(pos)[:3]
????????print(rgb)
圖片去水印
用微信截圖的方式查看水印像素點(diǎn)的 RGB。

可以看到水印的 RGB 是 (210, 210, 210),這里用 RGB 的和超過 620 就判定是水印點(diǎn),此時(shí)將像素顏色替換為白色。最后保存圖片。
rgb?=?img.getpixel(pos)[:3]
if(sum(rgb)?>=?620):
????img.putpixel(pos,?(255,?255,?255))
img.save('d:/qsy.png')
示例結(jié)果:

PDF 去水印
PDF 去水印的原理和圖片去水印的原理大致相同,用 PyMuPDF 打開 pdf 文件后,將 pdf 的每一頁都轉(zhuǎn)換為圖片 pixmap,pixmap 有它自己的 RGB,只需要將 pdf 水印中的 RGB 改為(255, 255, 255) 最后保存為圖片。
def?remove_pdf():
????page_num?=?0
????pdf_file?=?input("請輸入 pdf 地址:")
????pdf?=?fitz.open(pdf_file);
????for?page?in?pdf:
????????pixmap?=?page.get_pixmap()
????????for?pos?in?product(range(pixmap.width),?range(pixmap.height)):
????????????rgb?=?pixmap.pixel(pos[0],?pos[1])
????????????if(sum(rgb)?>=?620):
????????????????pixmap.set_pixel(pos[0],?pos[1],?(255,?255,?255))
????????pixmap.pil_save(f"d:/pdf_images/{page_num}.png")
????????print(f"第{page_num}水印去除完成")
????????page_num?=?page_num?+?1
示例結(jié)果:

圖片轉(zhuǎn)為 pdf
圖片轉(zhuǎn) pdf 需要注意的是圖片的排序,數(shù)字文件名必須先轉(zhuǎn)換為 int 類型后排序。用 PyMuPDF 模塊打開圖片后將圖片用 convertToPDF() 函數(shù)轉(zhuǎn)成單頁的 pdf。插入到新的 pdf 文件中。
def?pic2pdf():
????pic_dir?=?input("請輸入圖片文件夾路徑:")
????
????pdf?=?fitz.open()
????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)??
????????pdfbytes?=?imgdoc.convertToPDF()???
????????imgpdf?=?fitz.open("pdf",?pdfbytes)
????????pdf.insertPDF(imgpdf)???????
????pdf.save("d:/demo.pdf")?????????
????pdf.close()
總結(jié)
pdf 和圖片上惱人的水印終于可以在強(qiáng)大的 python 面前消失了。小伙伴們學(xué)廢了嗎?
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個(gè)月的Python??|?實(shí)戰(zhàn)項(xiàng)目?|學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個(gè)海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會做詩的機(jī)器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費(fèi)!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r(jià)機(jī)票提示器!?|60行代碼做了一個(gè)語音壁紙切換器天天看小姐姐!|
年度爆款文案
點(diǎn)閱讀原文,看200個(gè)Python案例!

