python3 去除PDF部分内容

本文介绍两种高效去除PDF中特定内容的方法:一是通过图片操作,将PDF转换为图片,使用空白图片覆盖不需要的内容后再转回PDF;二是利用PyPDF2包,通过添加带有空白图片的水印来遮盖目标内容,此法更轻便,不会显著增加文件大小。

先说问题,如图,要把红框的内容去除:

 

比较容易想到的办法是图片操作,

1.先把PDF文件转化为图片,

2.新建一张空白图片,

3.把空白图片粘贴到pdf转化的图片上,覆盖内容。

4.最后再把图片转化为PDF。

部分关键代码如下:

import pdf2image
import img2pdf
from PIL import Image
# 输出单个pdf
#file_name pdf名字
#pdf_name 保存的pdf名字
def Out_pdf_single(file_name, pdf_name):
    pdf_imgs = []
    file = open("./pdf/" + pdf_name, "wb")
    images = pdf2image.convert_from_path(file_name, poppler_path='./poppler-0.68.0/bin')
    for idx, img in enumerate(images):
        path = '{}.jpg'.format(idx)
        %只处理单页数pdf
        if idx % 2 == 0:
            # 判断样式 并 处理图片
            # 样式6 左上角C(73,50)
            img_arr = img.load()
            if img_arr[74, 49] <= (50, 50, 50):
                print('样式6')
                # 130 285  - 862 466
                # 创建空白图像
                img_white = Image.new('RGB', (732, 181), (255, 255, 255))
                # 粘贴
                img.paste(img_white, (131, 286))
            else:
                print("样式1")
                # 165 323  - 896 504
                # 创建空白图像
                img_white = Image.new('RGB', (731, 181), (255, 255, 255))
                # 粘贴
                img.paste(img_white, (165, 323))
        # 保存图片
        img.save(os.path.join('./img/', path), 'JPEG', quality=10)
        # 添加到imgs
        pdf_imgs.append(os.path.join('./img/', path))

    # 保存为pdf
    pdf_bytes = img2pdf.convert(pdf_imgs)
    file.write(pdf_bytes)
    file.close()

图片操作最后得到的PDF文件会很多,原始PDF文件100KB,转化后变成大概4M。

 

所以下面又换了一种方法,给PDF添加水印的方式添加图片。

1.制作水印PDF(新建一个空白图像,新建一页PDF,把图像插入到PDF,这个pdf看上去是空白的,实际上背景是透明的,然后上面有一张空白图片,可以用来覆盖要删除的内容)

2.给要去除内容的PDF添加水印(用到了PyPDF2的包)

要安装的话,要注意一下大小写。

pip install PyPDF2

部分关键代码如下:

from PyPDF2 import PdfFileWriter, PdfFileReader

#给pdf批量加水印
#input_pdf = '.PDF',输入文件
#output = '.pdf',输出pdf
#watermark = '.pdf'水印文件
def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)
    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()
    # 给所有页面添加水印
    for page_num in range(pdf_reader.getNumPages()):
        print("page:",page_num)
        page = pdf_reader.getPage(page_num)
        if page_num%2 == 0:
            page.mergePage(watermark_page)
        pdf_writer.addPage(page)
    with open(output, 'wb') as out:
        pdf_writer.write(out)

#调用示例
create_watermark(
        input_pdf = 'y8.PDF',
        output = 'y8_style.pdf',
        watermark = 'style.pdf')

效果展示:

这里其实有一张空白图片,但正常看没什么问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值