考研的同学应该被很多电子版书籍的水印搞得痛苦不已,我也是!所以就各种想办法把它去除。在这里我只提供方法,因为这不能用于通用水印去除,具体什么水印还得灵活操作。需要懂python的知识。
我的思路是:
将pdf转成图片
def pdf2pic(pdf_file):
# for pdf_file in pdfPathList:
image_dir = osp.join(osp.dirname(pdf_file), osp.basename(pdf_file).rsplit(".", 1)[0])
if not osp.exists(image_dir):
os.mkdir(image_dir)
print(f"Create save dir {image_dir}")
pdf = fitz.open(pdf_file)
for idx, page in enumerate(pdf):
zoom_x, zomm_y = 2.0, 2.0 # horizontal zoom, vertical zoom
mat = fitz.Matrix(zoom_x, zomm_y) # zoom factor 2 in each dimension
pixmap = page.get_pixmap(matrix=mat)
pixmap.pil_save(osp.join(image_dir, f'{idx}.png'), dpi=(40000, 40000))
print(f"{image_dir} is done")
需要安装pymupdf这个库
如果觉得图片很糊的话,需要用超分辨率重构一下,这里我直接给出GitHub的项目链接,根据作者的步骤安装好环境,再去下个×2倍的权重文件
https://github.com/xinntao/Real-ESRGAN
如果PDF文件不糊的话可以跳过步骤2。这一步需要安装飞浆的框架
https://www.paddlepaddle.org.cn/ ,再安装它的ocr包,我是直接装ocr这个库调用的
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_en/quickstart_en.md
下面是ocr识别水印字体的代码(注:其中如果是灰色的字体的水印我是直接判断像素点RGB的值过滤的)
wmList = [":118105451", "微信公众号:", "关注微信公众号:考研满分君获取更多考研资源", "获取更多考研资源","关注微信公众号:考研满分君,获取更多考研资源",
"考研人的精神家园", "群:118105451", "微信公众号(神灯考研)", "关注微信公众号:考研满分君‧获取更多考研资源"]
def re_wm(imPathList):
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
for imPath in imPathList:
print(imPath)
result = ocr.ocr(imPath, cls=True)
im = cv2.imread(imPath)
#去除灰色字体的水印
im[np.where((im > [180, 180, 180]).all(axis=2))] = [255, 255, 255]
for line in result[0]:
print(line[1][0])
#这里是两种写法,看ocr识别的效果怎么样
# if str(line[1][0]) in wmList:
if "关注" in str(line[1][0]) or "考研" in str(line[1][0]) or "微信" in str(line[1][0]) or "群" in str(line[1][0]) or "神灯" in str(line[1][0]):
bbox = line[0]
bbox = np.array(bbox, dtype=np.int32)
# 将识别到水印的区域赋成白色
cv2.fillPoly(im, [bbox], (255,255,255))
cv2.imwrite(imPath, im)
最后只要将处理好的图片拼成pdf就行了
def pic2pdf(img_dir):
print('Save to', osp.join(osp.dirname(img_dir), osp.basename(img_dir)+'.pdf'))
doc = fitz.open()
# print(sorted(glob(osp.join(img_dir, '*.png'))))
for i in range(len(glob(osp.join(img_dir, '*.png')))): # 读取图片,确保按文件名排序
# resize to A4 Shape
im = cv2.imread(osp.join(img_dir, str(i)+'.png'))
# 这里是将图片resize成A4纸的两倍大,防止最后的文件过大
im = cv2.resize(im, (2480,3508))
cv2.imwrite(osp.join(img_dir, str(i)+'.png'), im)
imgdoc = fitz.open(osp.join(img_dir, str(i)+'.png')) # 打开图片
pdfbytes = imgdoc.convertToPDF() # 使用图片创建单页的 PDF
imgpdf = fitz.open("pdf", pdfbytes)
doc.insertPDF(imgpdf) # 将当前页插入文档
doc.save(osp.join(osp.dirname(img_dir), osp.basename(img_dir)+'_re.pdf')) # 保存pdf文件
doc.close()
print(osp.join(osp.dirname(img_dir), osp.basename(img_dir)+'.pdf'), "is Done!")
流程就是这样的,需要自己去捣鼓一下