精华内容
下载资源
问答
  • OpenCV官方教程中文版(For Python去水印.pdf
  • 针对的是网上下载的OpenCV 3.x with Python By Example 2nd Edition PDF文件,采用Python和PyPDF2编程,去除该PDF上的文字水印。去除水印的方法随着采用的加水印的方法不同而不同,所采用的方法对于去除一些指定的...
  • 今天介绍下用 Python 去除 PDF (图片)的水印。思路很简单,代码也很简洁。 首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面。 原理 这张图片是前几天整理《数据结构和算法》PDF里的一个...

    前言

    今天介绍下用 Python 去除 PDF (图片)的水印。思路很简单,代码也很简洁。

    首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面。

    原理

    这张图片是前几天整理《数据结构和算法》PDF里的一个截图,带着公众号的水印。

    从上图可以明显看到,为了不影响阅读正文,水印颜色一般比较浅。因此,我们可以利用颜色差这个特征来去掉水印。即:用 Python 读取图片的颜色,并将浅颜色部分变白。

    准备工作

    • Python 标准库 PIL 可以获取图片的颜色,Python2 是系统自带的,Python3 需要自己安装,我用的 Python 3.8,需要执行以下命令安装:

    pip install pillow 
    • 安装完成,读取图片,并获取图片的尺寸(宽度和高度)

    from PIL import Image 
     
    img = Image.open('watermark_pic.png') 
     
    width, height = img.size 

    进行下一步之前,先简单介绍下计算机里关于颜色的知识。光学三原色是红绿蓝(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

    for i in range(width): 
        for j in range(height): 
            pos = (i, j) 
            print(img.getpixel(pos)[:3]) 

    图片每个位置颜色由四元组表示,前三位分别是 RGB,第四位是 Alpha 通道,我们不需要关心。

    有了 RGB ,我们就可以对其修改。

    从图中可以发现,水印的 RGB 是 #d9d9d9,这里是用十六进制表示的,其实就是(217, 217, 217)。

    这三个颜色值都越靠近 255,颜色就越淡,当它们都变成 255,也就成了白色。所以只要 RGB 都大于 217 的位置,我们都可以给它填成白色。即:RGB 三位数之和大于等于 651。

    if sum(img.getpixel(pos)[:3]) >= 651: 
     
    img.putpixel(pos, (255, 255, 255)) 
    完整代码如下:
    
    from PIL import Image 
     
    img = Image.open('watermark_pic.png') 
    width, height = img.size 
     
    for i in range(width): 
        for j in range(height): 
            pos = (i, j) 
            if sum(img.getpixel(pos)[:3]) >= 651: 
                img.putpixel(pos, (255, 255, 255)) 
     
    img.save('watermark_removed_pic.png') 

    有了上面的基础,去除 PDF 的水印就简单了

    代码实现

    思路

    思路是将每页 PDF 转成图片,然后修改水印的 RGB,最后输出图片即可。

    1.安装 pymupdf 库,用来来操作 PDF

    pip install pymupdf 

    2.读取 PDF,并转图片

    import fitz 
     
     
    doc = fitz.open("数据结构和算法手册@公众号渡码.pdf") 
     
    for page in doc: 
        pix = page.get_pixmap() 

    该 PDF 共 480 页,所以需要遍历每一页,并获取每一页对应的图片pix。pix对象类似于我们上面看到的img对象,可以读取、修改它的 RGB。

    page.get_pixmap() 这个操作是不可逆的,即能够实现从 PDF 到图片的转换,但修改图片 RGB 后无法应用到 PDF 上,只能输出为图片。

    修改水印 RGB 跟刚才一样,区别是这里的 RGB 是一个三元组,没有 Alpha 通道,代码如下:

    from itertools import product 
     
    for pos in product(range(pix.width), range(pix.height)): 
        if sum(pix.pixel(pos[0], pos[1])) >= 651: 
            pix.set_pixel(pos[0], pos[1], (255, 255, 255)) 

    完整代码如下:

    from itertools import product 
     
    import fitz 
     
    doc = fitz.open("数据结构和算法手册@公众号渡码.pdf") 
     
    page_no = 0 
     
    for page in doc: 
     
    pix = page.get_pixmap() 
     
    for pos in product(range(pix.width), range(pix.height)): 
     
    if sum(pix.pixel(pos[0], pos[1])) >= 651: 
     
    pix.set_pixel(pos[0], pos[1], (255, 255, 255)) 
     
    pix.pil_save(f"pdf_pics/page_{page_no}.png", dpi=(30000, 30000)) 
     
    print(f'第 {page_no} 页去除完成') 
     
    page_no += 1 

    缺点

    这种方案是有缺点的,

    第一,输出并非 PDF 格式;

    第二,输出的图片比较模糊,后续还有待优化,最好是能直接修改 PDF。

    展开全文
  • 一、前言大家好,有关Python操作PDF的案例之前已经写过一个????PDF批量合并,这个案例初衷只是给大家提供一个便利的脚本,并没有太多讲解原理,其中涉及的就是PDF处理很实用的模块PyPDF2,本文就好好剖析一下这个模块...

    一、前言

    大家好,有关Python操作PDF的案例之前已经写过一个👉PDF批量合并,这个案例初衷只是给大家提供一个便利的脚本,并没有太多讲解原理,其中涉及的就是PDF处理很实用的模块PyPDF2,本文就好好剖析一下这个模块,主要将涉及

    os 模块综合应用

    glob 模块综合应用

    PyPDF2 模块操作

    二、基本操作

    PyPDF2 导入模块的代码常常是:

    fromPyPDF2importPdfFileReader, PdfFileWriter

    这里导入了两个方法:

    PdfFileReader 可以理解为读取器

    PdfFileWriter可以理解为写入器

    接下来通过几个案例进一步认识这两个工具的奇妙之处,用到的示例文件是5个发票的pdf

    每个发票的PDF都由两页组成:

    12eb22403861

    12eb22403861

    三、合并

    第一个工作是将5个发票pdf合并成10页。这里读取器和写入器应该怎么配合呢?

    逻辑如下:

    读取器将所有pdf读取一遍

    读取器将读取的内容交给写入器

    写入器统一输出到一个新pdf

    这里还有一个重要的知识点:读取器只能将读取的内容一页一页交给写入器。

    因此,逻辑中第1步和第2步实际上不是彼此独立的步骤,而是读取器读取完一个pdf后,就将这个pdf全部页循环一遍,挨页交给写入器。最后等读取工作全部结束后再输出。

    看一下代码可以让思路更清楚:

    fromPyPDF2importPdfFileReader, PdfFileWriter

    path =r'C:\Users\xxxxxx'

    pdf_writer = PdfFileWriter()

    foriinrange(1,6):

    pdf_reader = PdfFileReader(path +'/INV{}.pdf'.format(i))

    forpageinrange(pdf_reader.getNumPages()):

    pdf_writer.addPage(pdf_reader.getPage(page))

    withopen(path +r'\合并PDF\merge.pdf','wb')asout:

    pdf_writer.write(out)

    由于全部内容都需要交给同一个写入器最后一起输出,所以写入器的初始化一定是在循环体之外的.

    如果在循环体内则会变成每次访问读取一个pdf就生成一个新的写入器,这样每一个读取器交给写入器的内容就会被反复覆盖,无法实现我们的合并需求!

    循环体开头的代码:

    foriinrange(1,6):

    pdf_reader = PdfFileReader(path +'/INV{}.pdf'.format(i))

    目的就是每次循环读取一个新的pdf文件交给读取器进行后续操作。实际上这种写法不是很提倡,由于各pdf命名恰好很规则,所以可以直接人为指定数字进行循环。更好的方法是用 glob 模块:

    importglob

    forfileinglob.glob(path +'/*.pdf'):

    pdf_reader = PdfFileReader(path)

    代码中 pdf_reader.getNumPages(): 能够获取读取器的页数,配合range就能遍历读取器的所有页。

    pdf_writer.addPage(pdf_reader.getPage(page))能够将当前页交给写入器。

    最后,用with新建一个pdf并由写入器的 pdf_writer.write(out)方法输出即可

    四、拆分

    如果明白了合并操作中读取器和写入器的配合,那么拆分就很好理解了,这里我们以拆分INV1.pdf为2个单独的pdf文档为例,同样也先来捋一捋逻辑:

    读取器读取PDF文档

    读取器一页一页交给写入器

    写入器每获取一页就立即输出

    通过这个代码逻辑我们也可以明白,写入器初始化和输出的位置一定都在读取PDF循环每一页的循环体内,而不是在循环体外

    代码很简单:

    fromPyPDF2importPdfFileReader, PdfFileWriter

    path =r'C:\Users\xxx'

    pdf_reader = PdfFileReader(path +'\INV1.pdf')

    forpageinrange(pdf_reader.getNumPages()):

    # 遍历到每一页挨个生成写入器

    pdf_writer = PdfFileWriter()

    pdf_writer.addPage(pdf_reader.getPage(page))

    # 写入器被添加一页后立即输出产生pdf

    withopen(path +'\INV1-{}.pdf'.format(page +1),'wb')asout:

    pdf_writer.write(out)

    五、水印

    本次的工作是将下图作为水印添加到INV1.pdf中

    首先是准备工作,将需要作为水印的图片插入word中调整合适位置后保存为PDF文件。然后就可以码代码了,需要额外用到copy模块,具体解释见下图:

    12eb22403861

    就是把读取器和写入器初始化,并且把水印PDF页先读取好备用,核心代码稍微比较难理解:

    12eb22403861

    加水印本质上就是把水印PDF页和需要加水印的每一页都合并一遍

    12eb22403861

    由于需要加水印的PDF可能有很多页,而水印PDF只有一页,因此如果直接把水印PDF拿来合并,可以抽象理解成加完第一页,水印PDF页就没有了。

    因此不能直接拿来合并,而要把水印PDF页不断copy出来成新的一页备用new_page,再运用.mergePage方法完成跟每一页合并,把合并后的页交给写入器待最后统一输出!

    关于.mergePage的使用:出现在下面的页.mergePage(出现在上面的页),最后效果如图:

    12eb22403861

    六、加密

    加密很简单,只需要记住:「加密是针对写入器加密」

    因此只需要在相关操作完成后调用pdf_writer.encrypt(密码)

    以单个PDF的加密为例:

    12eb22403861

    写在最后

    当然除了对PDF的合并、拆分、加密、水印,我们还可以使用Python结合Excel和Word实现更多的自动化需求,这些就留给读者自己开发。

    最后还是希望大家能够理解Python办公自动化的一个核心就是批量操作-解放双手,让复杂的工作自动化!

    展开全文
  • 用PyPDF2去除PDF中的水印

    千次阅读 2020-12-06 05:43:24
    This Section imports the necessary classes from the PyPDF2 libraryfrom PyPDF2 import PdfFileReader, PdfFileWriterfrom PyPDF2.pdf import ContentStreamfrom PyPDF2.generic import TextStringObject, NameOb...

    This Section imports the necessary classes from the PyPDF2 libraryfrom PyPDF2 import PdfFileReader, PdfFileWriter

    from PyPDF2.pdf import ContentStream

    from PyPDF2.generic import TextStringObject, NameObject

    from PyPDF2.utils import b_

    >The watermark says SAMPLE on it so I've tried different capitalization cases

    wm_text = 'Sample'

    replace_with = ''

    >I'm hoping to just replace the SAMPLE watermark with nothing so a space could suffice

    > Load PDF into pyPDF

    source = PdfFileReader(open('input.pdf', "rb"))

    output = PdfFileWriter()

    > For each page

    for page in range(source.getNumPages()):

    # Get the current page and it's contents

    page = source.getPage(page)

    content_object = page["/Contents"].getObject()

    content = ContentStream(content_object, source)

    > Loop over all pdf elements

    for operands, operator in content.operations:Was told to adapt this part dependent on my PDF file

    ^{pr2}$

    Set the modified content as content object on the pagepage.__setitem__(NameObject('/Contents'), content)Add the page to the outputoutput.addPage(page)

    编写流

    outputStream=打开(“输出.pdf“,”wb“)

    输出.写入(输出流)

    展开全文
  • This Section imports the necessary classes from the PyPDF2 libraryfrom PyPDF2 import PdfFileReader, PdfFileWriterfrom PyPDF2.pdf import ContentStreamfrom PyPDF2.generic import TextStringObject, NameOb...

    This Section imports the necessary classes from the PyPDF2 library

    from PyPDF2 import PdfFileReader, PdfFileWriter

    from PyPDF2.pdf import ContentStream

    from PyPDF2.generic import TextStringObject, NameObject

    from PyPDF2.utils import b_

    >The watermark says SAMPLE on it so I've tried different capitalization cases

    wm_text = 'Sample'

    replace_with = ''

    >I'm hoping to just replace the SAMPLE watermark with nothing so a space could suffice

    > Load PDF into pyPDF

    source = PdfFileReader(open('input.pdf', "rb"))

    output = PdfFileWriter()

    > For each page

    for page in range(source.getNumPages()):

    # Get the current page and it's contents

    page = source.getPage(page)

    content_object = page["/Contents"].getObject()

    content = ContentStream(content_object, source)

    > Loop over all pdf elements

    for operands, operator in content.operations:

    Was told to adapt this part dependent on my PDF file

    if operator == b_("TJ"):

    text = operands[0][0]

    if isinstance(text, TextStringObject) and text.startswith(wm_text):

    operands[0] = TextStringObject(replace_with)

    Set the modified content as content object on the page

    page.__setitem__(NameObject('/Contents'), content)

    Add the page to the output

    output.addPage(page)

    Write the stream

    outputStream = open("output.pdf", "wb")

    output.write(outputStream)

    解决方案

    Using the code from the question here is a function that works in Python 3.

    def removeWatermark(wm_text, inputFile, outputFile):

    from PyPDF4 import PdfFileReader, PdfFileWriter

    from PyPDF4.pdf import ContentStream

    from PyPDF4.generic import TextStringObject, NameObject

    from PyPDF4.utils import b_

    with open(inputFile, "rb") as f:

    source = PdfFileReader(f, "rb")

    output = PdfFileWriter()

    for page in range(source.getNumPages()):

    page = source.getPage(page)

    content_object = page["/Contents"].getObject()

    content = ContentStream(content_object, source)

    for operands, operator in content.operations:

    if operator == b_("Tj"):

    text = operands[0]

    if isinstance(text, str) and text.startswith(wm_text):

    operands[0] = TextStringObject('')

    page.__setitem__(NameObject('/Contents'), content)

    output.addPage(page)

    with open(outputFile, "wb") as outputStream:

    output.write(outputStream)

    wm_text = 'wm_text'

    inputFile = r'input.pdf'

    outputFile = r"output.pdf"

    removeWatermark(wm_text, inputFile, outputFile)

    展开全文
  • Python 获取pdf文件中的所有图片,保存到文件夹中。 pip install fitz pip install pymupdf import fitz def func(doc): for i in range(len(doc)): imglist = doc.getPageImageList(i) for j, img in enumerate...
  • python pdf加水印

    千次阅读 2019-05-28 17:52:57
    python pdf加水印 from PyPDF2 import PdfFileReader, PdfFileWriter from reportlab.lib.units import cm from reportlab.pdfgen import canvas def create_watermark(content): """水印信息""" # 默认大小为21...
  • 我们在使用的PDF文件也会有一部分水印,想要直接在PDF文件中去除这些水印还是比较难的,去除PDF文件中的水印需要使用专业的PDF编辑器来进行操作,接下面为大家揭晓一下如何给PDF文件去除水印。操作方法如下:一:...
  • PDF去水印

    2020-08-14 22:13:43
    这里写自![在这里插入图片描述](https://img-blog.csdnimg.cn/20200814221303205.png?x-oss-process=image/watermark...t_70#pic_center欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何
  • Python 去除 PDF 水印,你学会吗?

    千次阅读 2021-11-26 13:20:00
    今天介绍下用 Python 去除 PDF (图片)的水印。思路很简单,代码也很简洁。 首先来考虑 Python 如何去除图片的水印,然后再将思路复用到 PDF 上面。 这张图片是前几天整理《数据结构和算法》PDF里的一个截图,带...
  • 主要介绍了Python实现PyPDF2处理PDF文件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • PDF怎么去水印,去除PDF水印的方法

    千次阅读 2019-04-12 15:57:14
    有些PDF文件会把文件中添加上水印,但我们在使用的时候感觉不是那么好,这个时候就需要去除水印了。那么PDF文件去除水印的方法是什么呢?估计有许多的小伙伴还不是懂,今天小编就来跟大家分享一下PDF去除水印的方法...
  • 欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。日常学习和工作中,经常会遇到上面的情况,好好的PDF文档...
  • 一、前言大家好,有关Python操作PDF的案例之前已经写过一个????PDF批量合并,这个案例初衷只是给大家提供一个便利的脚本,并没有太多讲解原理,其中涉及的就是PDF处理很实用的模块P...
  • 大家好,我是菜鸟哥!有粉丝问,既然Python这么牛逼,可不可使用Python去除图片水印的方法呢?这个肯定有啊,不过由于图片水印的种类有很多,今天我们先讲最简单的一种。即上图中的①类水印...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录对比图(水印去除前后)一、原理二、代码实现三、使用教程1. 文件夹目录(pic和res... 图片转PDF总结 对比图(水印去除前后) 一、原理
  • 1.说明:下载到的pdf总会有一些水印,pdf文件水印添加方式除了acrobat adobe自带的以外,还有很多,所以去除水印方法也很多,这里介绍的也只是一种适用python批量删除图片水印Xobject的方法,对于不想装pitstop、...
  • import os import fitz pdf_dir=[] # 当前路径 def get_file(): docunames = os.listdir... if os.path.splitext(docuname)[1] == '.pdf':#目录下包含.pdf的文件 pdf_dir.append(docuname) def conver_img(): f
  • Python开发技术详解适合Python爱好者、大中专院校的学生、社会培训班的学生以及用Python语言进行系统管理、GUI开发、Web开发、数据库编程、网络编程的人员使用。内容提要Python是目前流行的动态脚本语言之一。本书共...
  • python camelot pdf表格提取

    千次阅读 2020-03-02 14:48:45
    camelot 是一个通过图像分割提取表格的函数库,有强大的pdf表格提取功能,擅长于提取不规则表格,非结构性表格(例如通过颜色进行表格分割)有着显著的效果 正文 解决安装问题 安装camelot 后,camelot.read_pdf...
  • PDF文件JAVA去水印源码Muhimbi PDF Converter 在线服务 关于 这是一项基于 REST 的服务,可以轻松地将文档转换、合并、水印、保护和光学字符识别 (OCR) 添加到大多数编程语言、操作系统和开发平台。 此服务也可作为...
  • 前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的。作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了。我做的是一个关于PDF的处理,在百度上找了...
  • 这是“Python1024-自动化办公”的第2篇:PDF文件处理。 整个系列涵盖Python处理文本文件、PDF、Word、Excel、PPT、图像、音频、视频、邮件、企业办公机器人等职场办公实用场景。
  • Python中通过PyPDF2实现PDF添加水印

    千次阅读 2019-04-26 17:19:53
    PyPDF 2是一个纯python PDF库,能够分割、合并、裁剪和转换PDF文件的页面。它还可以向PDF文件中添加自定义数据、查看选项和密码。它可以从PDF检索文本和元数据,还可以将整个文件合并在一起。 PyPDF 2 1.26.0文档:...
  • aspose.cells-17.9-java 去水印sheet页 直接删除的 aspose.cells-17.9-java 去水印sheet页 直接删除的
  • python去水印

    2021-09-22 16:10:01
    import cv2 def get_water(): # 黑底白字 src = cv2.imread(‘1.png’) # 默认的彩色图(IMREAD_COLOR)方式读入原始图像 # black.jpg mask = cv2.imread(‘2.png’, cv2.IMREAD_GRAYSCALE) # 灰度图(IMREAD_GRAYSCALE...
  • 去水印相关算法代码

    千次阅读 2021-11-27 17:19:50
    接下来我就为大家介绍如何去除 PDF水印 现在就为大家介绍三行代码来做这个工作,保证适用。 1. 解决方案 使用opencv就可以快速完成,如下所示: import cv2 import numpy as np img = cv2.imread('veidz.jpg') new ...
  • 使用opencv去除水印

    2020-04-24 17:15:55
    使用opencv去除pdf水印实现去除pdf水印思路所使用的工具和库核心代码 实现去除pdf水印 pdf水印在每一页的大小位置相同 水印颜色与正常字体颜色稍微浅些 思路 pdf转图片 ...python opencv PIL nu...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

pythonpdf去水印

python 订阅