PDF去除水印

考研的同学应该被很多电子版书籍的水印搞得痛苦不已,我也是!所以就各种想办法把它去除。在这里我只提供方法,因为这不能用于通用水印去除,具体什么水印还得灵活操作。需要懂python的知识。

我的思路是:

  1. 将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这个库

  1. 如果觉得图片很糊的话,需要用超分辨率重构一下,这里我直接给出GitHub的项目链接,根据作者的步骤安装好环境,再去下个×2倍的权重文件

https://github.com/xinntao/Real-ESRGAN

  1. 如果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)

  1. 最后只要将处理好的图片拼成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!")

流程就是这样的,需要自己去捣鼓一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值