日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python實現為PDF去除水印的示例代碼_python

作者:KjPrime ? 更新時間: 2022-06-06 編程語言

前言

為什么做出這個?

就是有時候從網上下載的資料中的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文件比較多,并且頁數很多,程序運行就要很久,我都感覺像深度學習了。

原文鏈接:https://blog.csdn.net/qq_45019494/article/details/123876659

欄目分類
最近更新