【问题标题】:Watermark Removal on PDF with PyPDF2使用 PyPDF2 去除 PDF 上的水印
【发布时间】:2016-06-10 16:01:51
【问题描述】:

本节从 PyPDF2 库中导入必要的类

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:

被告知根据我的 PDF 文件调整这部分

        if operator == b_("TJ"):
            text = operands[0][0]
            if isinstance(text, TextStringObject) and text.startswith(wm_text):
                operands[0] = TextStringObject(replace_with)

将修改后的内容设置为页面上的内容对象

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

将页面添加到输出

    output.addPage(page)

写流 outputStream = open("output.pdf", "wb") output.write(outputStream)

【问题讨论】:

    标签: python pdf watermark pypdf2


    【解决方案1】:

    使用此处问题中的代码是一个在 Python 3 中有效的函数。

    def remove_watermark(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"
    remove_watermark(wm_text, inputFile, outputFile)
    

    【讨论】:

    • 不支持 CJK 字符
    • 我尝试通过设置operands[0] = NullObject() 使用代码删除徽标图像,但输出pdf 被损坏。
    • 上面的代码对我有用,可以删除每个页面上的特定文本,我没有考虑其他情况。
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    相关资源
    最近更新 更多