You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中保存红化PDF:彻底隐藏底层可搜索文本的方法

问题描述

在Python中读取PDF后,在需要遮挡的文本上方添加了文本框并保存为新PDF,但PDF阅读器仍能搜索到被遮挡的底层文本。想知道如何将PDF保存为单层文件,或是彻底移除文本框下方的底层文本?

原代码

import PyPDF2 
import re
import fitz 
import io
import os
import pandas
import numpy as np

from PyPDF2 import PdfFileReader, PdfFileWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.graphics import renderPDF
from reportlab.lib import colors
from reportlab.graphics.shapes import *

reader = PyPDF2.PdfReader(files)
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize = A4)
can.rect(65, 750, 40, 30, stroke=1, fill=1) 
can.setFillColorRGB(1, 1, 1)
can.save()

packet.seek(0)
new_pdf = PdfFileReader(packet)
output = PyPDF2.PdfFileWriter() 
            
pageToOutput = reader.getPage(1)
pageToOutput.mergePage(new_pdf.getPage(0))
output.addPage(pageToOutput)

outputStream = open('NewFile.pdf', "wb")
output.write(outputStream)
outputStream.close()

解决方案

你当前的代码只是在原文本上叠加遮挡层,底层文本并未被删除,所以仍能被搜索到。以下两种方法可以解决问题:

方法一:彻底删除目标文本(保留PDF可搜索性)

用PyMuPDF(fitz)直接定位并删除指定文本,再添加遮挡,从根源消除底层文本:

import fitz  # PyMuPDF

# 打开原PDF
doc = fitz.open("原文件路径.pdf")
page = doc[1]  # 操作第2页(索引从0开始)

# 定位要删除的文本(替换成你需要遮挡的内容)
target_text = "需要遮挡的文本内容"
text_positions = page.search_for(target_text)

# 标记并删除文本,同时用白色填充区域
for pos in text_positions:
    page.add_redact_annot(pos, fill=(1, 1, 1))  # 白色填充
page.apply_redactions()  # 应用修改,彻底移除文本

# 如果需要手动绘制固定位置的遮挡框,可替换上面的逻辑
# page.draw_rect(fitz.Rect(65, 750, 65+40, 750-30), fill=(1,1,1), color=(1,1,1))

# 保存处理后的PDF
doc.save("处理完成的文件.pdf")
doc.close()
  • 核心逻辑:search_for定位文本位置,apply_redactions会彻底删除该区域的文本内容,同时用指定颜色填充,这样底层文本完全消失,搜索也找不到。

方法二:转成单层图像PDF(丢失文本可搜索性)

如果不需要保留文本可搜索功能,直接把PDF转成图像再生成新PDF,整个文件就是单层图像:

import fitz

doc = fitz.open("原文件路径.pdf")
output_doc = fitz.open()  # 创建空白PDF

for page_num in range(len(doc)):
    page = doc[page_num]
    # 将页面转成高清图像(dpi越高越清晰)
    pix = page.get_pixmap(dpi=300)
    # 创建和原页面尺寸一致的新页面
    new_page = output_doc.new_page(width=page.rect.width, height=page.rect.height)
    # 将图像铺满新页面
    new_page.insert_image(page.rect, pixmap=pix)

output_doc.save("单层图像版.pdf")
output_doc.close()
doc.close()
  • 注意:这种方法生成的PDF是纯图像,无法搜索、复制文本,适合不需要文本交互的场景。

内容的提问来源于stack exchange,提问作者TTZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:02:15