Python实现PDF(图片版)水印的去除

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

PDF文件转换成一个个的图片

下面展示一些 内联代码片

def ex_img(file):  # file 是文件路径+文件名,从pdf中提取图片,实现水印去除
    """
    :param file: PDF文件路径
    :return:
    提取的图片地址位于原PDF地址+img文件夹内
    """
    print('图片提取开始')
    (filepath, tempfilename) = os.path.split(file)
    export_file = filepath + '\\img'
    mkdir(export_file)
    doc = fitz.open(file)
    temp = 0
    for pg in range(doc.pageCount):
        page = doc[pg]
        temp += 1
        rotate = int(0)
        # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
        zoom_x = 2.0
        zoom_y = 2.0
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pm = page.getPixmap(matrix=trans, alpha=False)

        pic_name = '{}.jpg'.format(temp)
        # 拼接生成pdf的文件路径
        pic_pwd = os.path.join(export_file, pic_name)
        pm.writePNG(pic_pwd)
        de_water(pic_pwd) #去图片水印
    print('图片提取+去水印完成')

对图片内的水印去除

先简单介绍下计算机里关于颜色的知识。光学三原色是红绿蓝(RGB),也就是说它们是不可分解的三种基本颜色,其他颜色都可以通过这三种颜色混合而成,三种颜色等比例混合就是白色,没有光就是黑色。

在计算机中,可以用三个字节表示 RGB 颜色,1个字节能表示的最大数值是 255, 所以,(255, 0, 0)代表红色,(0, 255, 0)代表绿色,(0, 0, 255)代表蓝色。相应地,(255, 255, 255)代表白色,(0, 0, 0)代表黑色。从(0, 0, 0) ~ (255, 255, 255) 之间的任意组合都可以代表一个不同的颜色。

其实用到这里就是颜色越浅,RGB的数值越大

下面展示一些 内联代码片

# 去除图片里的水印
def de_water(jpg_file):
    img = Image.open(jpg_file)
    # print(img)
    width, height = img.size  # 图片长宽
    # 读取图片的RGB,,读取长宽方向的每一个像素
    for i in range(width):
        for j in range(height):
            pos = (i, j)
            # print(img.getpixel(pos)[:3]) # 图片每个位置颜色由四元组表示,前三位分别是 RGB,第四位是 Alpha 通道,我们不需要关心。
            if sum(img.getpixel(pos)[:3]) >= jpg_num and sum(img.getpixel(pos)[:3]) < 765: # 一般水印的颜色会淡于页面内容,颜色越淡,RGB越大
                # print(img.getpixel(pos)[:3])
                img.putpixel(pos, (255, 255, 255)) # 将水印的颜色变为白色
    img.save('D:\\tool\\python 代码\\panpdf_v1.6\\De watermark\\img\\watermark_removed_pic.png')

将图片转换成PDF

def create_pdf(src):  # 将单个的图片转为pdf
    """
    :param src: 原文件地址
    :param dst: 新文件地址,若想在原文件上修改,设置dst = src
    :return:
    """
    print('pdf创建开始')
    # 大概改了改,没看具体实现。此处是为了将指定文件夹下得图片合并为pdf
    (filepath, tempfilename) = os.path.split(src)
    part_file = filepath + '\\img' # ex_img 中pdf转成图片后存放的地址,调整图片大小后的位置

    pdf_part_file = filepath + '\\pdf'
    mkdir(pdf_part_file)

    img_open_list = []  # 创建打开后的图片列表
    for root, dirs, files in os.walk(part_file):
        for i in natsorted(files):
            file = os.path.join(root, i)  # 遍历所有图片,带绝对路径
            img_open = Image.open(file)  # 打开图片
            if img_open.mode != 'RGB':  # and int(i.replace('t_','').replace('.png','')) > 300:
                # print(i)
                img_open = img_open.convert('RGB')  # 转换图像模式
            img_open.save(pdf_part_file + "\\t_{}.pdf".format(i), "PDF", resolution=100.0, save_all=True)
    print('pdf创建成功')

def join(otherpath, pdf_writer):  # 给原文档加入指定文件页面
    '''

    :param otherpath: 插入的文件路径
    :param pdf_writer: PdfFileWriter(),打开pdf文件
    :return:
    '''
    pdf_reader = PdfFileReader(otherpath)  # 要插入的文档path路径
    for page in range(pdf_reader.getNumPages()):  # 在文档开头加入
        # 把每张PDF页面加入到这个可读取对象中
        pdf_writer.addPage(pdf_reader.getPage(page))

def makePdf(src, dst):  # src 应该是临时存放pdf的路径+文件名.pdf,out_file是输出路径+文件名.pdf
    print('pdf合并开始')
    (filepath, tempfilename) = os.path.split(src)
    t = 0  # 用来计数pdf的位置
    pdf_part_file = filepath + '\\pdf'
    for root, dirs, files in os.walk(pdf_part_file):
        for i in natsorted(files):
            file = os.path.join(root, i)  # 遍历所有pdf,带绝对路径
            if t == 0:  # 打开第一个pdf文件,把后续文件添加到第一个文件
                pdf = PdfFileReader(file)
                pdf_writer = PdfFileWriter()
                pdf_writer.addPage(pdf.getPage(0))  # 每个pdf文件只有1页
            else:
                join(file, pdf_writer)
            t += 1
    with open(dst, 'wb') as output_pdf:  # 写入
        pdf_writer.write(output_pdf)
    print('pdf合并完成')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值