使用PyPDF2在PDF上去除水印

7
# This Section imports the necessary classes from the PyPDF2 library

from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.generic import ContentStream, NameObject, TextStringObject
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
reader = PdfFileReader("input.pdf")
writer = PdfFileWriter()

for page in reader.pages:
    # Get the current page's contents
    content_object = page["/Contents"].getObject()
    content = ContentStream(content_object, reader)

    # 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
    writer.addPage(page)

# Write the stream
with open("output.pdf", "wb") as fh:
    writer.write(fh)
2个回答

6

使用此问题中的代码,这里是一个可在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)

don't support CJK character - loader
我尝试使用代码通过设置operands[0] = NullObject()来删除标志图像,但输出的 PDF 文件被损坏了。 - Lei Yang
上面的代码对我来说可以用于删除每个页面上的特定文本,但我还没有考虑其他情况。 - faysou
1
我建议使用PyPDF2而不是PyPDF4。尽管名称相似,但在2022年,PyPDF2是更为更新的项目。我是PyPDF2的新维护者。 - Martin Thoma
有趣,谢谢。我将保留答案,因为我目前不从事这方面的工作,但其他人可以看到您的评论。 - faysou

0

截至2023年3月

from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import ContentStream, NameObject, TextStringObject

# The watermark says SAMPLE on it so I've tried different
# capitalization cases
wm_text = "WATERMARK TEXT"
replace_with = ""
# I'm hoping to just replace the SAMPLE watermark with nothing
# so a space could suffice

# Load PDF into pyPDF
reader = PdfReader("INPUT FILE")
writer = PdfWriter()

for page in reader.pages:
    # Get the current page's contents
    content_object = page["/Contents"]
    content = ContentStream(content_object, reader)

    # 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
    writer.add_page(page)

# Write the stream
with open("OUTPUT FILE", "wb") as fh:
    writer.write(fh)

PyPDF2已经被弃用,请使用pypdf。 - Martin Thoma
这个解决方案对我来说不起作用,不像使用PyPDF4的解决方案那样。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接