目标:净化电子书水印,供notability使用。
库安装
pillow库:基于PIL,支持python3
官方文档:Pillow (PIL Fork) 9.2.0.dev0 documentation
pip install pillow
PyMuPDF
:MuPDF
的Python
接口形式
官方文档:PyMuPDF Documentation — PyMuPDF 1.19.6 documentation
安装文件:PyMuPDF · PyPI
实际安装时,利用conda无对应库,利用pip会出现“Microsoft Visual C++ 14.0 or greater is required”的问题,参考下面文章:
安装模块
from itertools import product
from PIL import Image
import os
import fitz
为图片去水印
def remove_for_img():
img = Image.open('原图.png')
# 增大分辨率
width, height = img.size
width *= 10
height *= 10
high_img = img.resize((width, height), Image.ANTIALIAS)
# product(A,B):返回A和B中的元素组成的笛卡尔积的元组作为像素点
# PIL-getpixel((a,b)):获取图像中某点的像素的RGB值(RED,GREEN,BLUE)
# PIL-putpixel((4,4),(255,0,0)):写某个像素位置的值
for pos in product(range(width), range(height)):
if sum(high_img.getpixel(pos)[:3]) > 600:
high_img.putpixel(pos, (255, 255, 255))
high_img.save('去水印.png')
计算机中用 RGB (RED,GREEN,BLUE)代表红绿蓝,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,目标就是将水印的颜色变成白色(255, 255, 255)。
600是经验值,也可以用相应工具获取水印RGB值;但过低容易导致文字轮廓虚化,根据实际情况调整。
为pdf去水印,并重新连接
过程:将pdf转为图片处理并保存,再依次转为pdf连接生成最终文件。
def remove_for_pdf():
page_num = 1
pdf_file = '原图.pdf'
pdf = fitz.open(pdf_file) # 打开原pdf
total_pdfs = fitz.open() # 创建新pdf
for page in pdf:
# 缩放倍数越大越耗时
zoom_x = 4.0 # 水平缩放
zomm_y = 4.0 # 垂直缩放
mat = fitz.Matrix(zoom_x, zomm_y) # 每个维度应用对应缩放因子-分辨率提高
pixmap = page.get_pixmap(matrix=mat)
# 生成PNG图像(通过参数matrix实现结果矩阵的缩放)
# pixmap = page.get_pixmap()
for pos in product(range(pixmap.width), range(pixmap.height)):
rgb = pixmap.pixel(pos[0], pos[1])
if(sum(rgb) >= 600):
pixmap.set_pixel(pos[0], pos[1], (255, 255, 255))
pixmap.pil_save(f"{page_num}.png")
pixmapconvert = fitz.open(f"{page_num}.png")
pdfbytes = pixmapconvert.convert_to_pdf()
# open(type, buffer) - type: extension, buffer: bytes object.
imgpdf = fitz.open("pdf", pdfbytes)
total_pdfs.insert_pdf(imgpdf)
print(f"第{page_num}页水印去除完成")
page_num = page_num + 1
total_pdfs.save('removed_pdf.pdf')
total_pdfs.close()