首頁 > 軟體

Python實現為PDF去除水印的範例程式碼

2022-04-02 19:00:44

前言

為什麼做出這個?

就是有時候從網上下載的資料中的pdf有水印,看著不舒服。

比如說我從網上下載的試卷,然後去列印店列印,列印之後水印看著很不舒服,而去水印wps要會員,而我是一個程式設計師,為什麼不做一個呢,何樂而不為。

雖然最後是做出來的,但是還是有限制。

原理

把pdf轉化為圖片,然後將圖片去水印。

圖片去水印,是又條件限制的,必須水印的顏色和pdf中文字的顏色的rgb相差很大,然後把水印的顏色改變成背景顏色。

特色

網上很多和我類似的原理去水印,但是都是先pdf轉化為圖片存起來,然後圖片去水印之後,然後把圖片拼接成pdf。

而我就不需要中間步驟,我是直接輸入pdf檔案,輸出pdf檔案。

成果

安裝依賴

Image

pip install pillow

fitz

pip install PyMuPDF

程式碼

程式處理pdf需要的時間比較久(因為處理的是畫素點),可以先用頁數少的pdf進行測試之後再去頁數比較多的pdf。

from PIL import Image
import os
import io
import fitz
import time


def single_pdf_clearwater(pdf_path: str):
    pdf = fitz.open(pdf_path)   # 開啟pdf目錄
    pdf_img = fitz.open()       # 開啟空檔案,用來存圖片pdf
    for page_inf in pdf:
        definition = 3    # 清晰度,感覺輸出的pdf不夠清晰,可以調大,調大,檔案大小也會變大
        matrix = fitz.Matrix(definition, definition)
        img = page_inf.get_pixmap(matrix=matrix).tobytes()
        img = Image.open(io.BytesIO(img))
        width, height = img.size
        for i in range(width):
            for j in range(height):
                if sum(img.getpixel((i, j))) > 600: # 這裡的600你需要根據自己的水印的顏色進行更改。
                    img.putpixel((i, j), (255, 255, 255))
        img = img.tobytes()  # = img = np.asarray(img);img = bytearray(img)
        img = fitz.Pixmap(fitz.csRGB, width, height, img)
        img = img.tobytes()
        img = fitz.open("png", img)
        pdf_bytes = img.convert_to_pdf()
        pdf_img.insert_pdf(fitz.open("pdf", pdf_bytes))
    if not os.path.exists("output"):
        os.makedirs("output")  # 處理好的pdf存入了output目錄下
    pdf_img.save("output/去水印pdf_" + os.path.basename(pdf_path))


def group_pdf_clearwater(path_array: list[str]):
    print("************去水印時間比較久***********")
    for pdf_path in path_array:
        print(pdf_path, "去水印中...")
        single_pdf_clearwater(pdf_path)
    print("完成")


def folder_pdf_files(folder: str) -> list[str]:  # 一個資料夾裡面有多少pdf檔案
    file_list = []
    for a, b, c in os.walk(folder):
        if b == []:
            for filename in c:
                if filename[-3:].lower() == 'pdf':
                    file_path = os.path.join(a, filename)
                    file_list.append(file_path)
    print(folder, ": 有", len(file_list), "個pdf檔案")
    return file_list


if __name__ == '__main__':
    time_start = time.time()
    path_list = folder_pdf_files("pdf的目錄")
    group_pdf_clearwater(path_list)
    time_end = time.time()
    print("程式執行時間:", round(time_end - time_start, 2), "秒")

想法

雖然最後實現了,但是有限制。

為了去除儲存圖片後取圖片的中間步驟,我查閱了很多的文獻和資料,後面發現只有我最不想看的英文檔案才找到了問題的答案。我就感覺,比較偏的點,只有英文文獻才有。

因為限制,我在想是不是可以和python-普通pdf的新增水印的逆向思維進行操作,就是把水印圖層直接取出來。
如果處理的pdf檔案比較多,並且頁數很多,程式執行就要很久,我都感覺像深度學習了。

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


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