去除某目录下所有pdf的图片,文字水印。
去除后:
python代码:
[Python] 纯文本查看 复制代码 import fitz
import os
import shutil
def remove_watermarks_by_sizes(pdf_path, output_path, watermark_sizes, watermark_rects, watermark_texts):
"""
从PDF中删除特定大小的图片(水印)和特定的文字。
参数:
pdf_path (str): 输入PDF文件的路径。
output_path (str): 输出PDF文件的路径。
watermark_sizes (list of tuples): 水印的尺寸列表,每个元素是一个 (宽度, 高度) 的元组。
watermark_rects (list of str): 水印的矩形位置列表,每个元素是一个矩形位置字符串。
watermark_texts (list of str): 要删除的特定文字列表。
"""
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc.load_page(page_num)
images = page.get_images(full=True)
for img in images:
xref = img[0]
base_image = doc.extract_image(xref)
image_width = base_image['width']
image_height = base_image['height']
image_rect = str(page.get_image_rects(xref))
for watermark_size, watermark_rect in zip(watermark_sizes, watermark_rects):
watermark_width, watermark_height = watermark_size
# 检查图像尺寸是否与水印尺寸匹配
if watermark_rect:
if (
image_width == watermark_width and image_height == watermark_height and image_rect == watermark_rect):
print(f"Removing image at {image_rect} of size ({watermark_width}, {watermark_height})")
page.delete_image(xref)
break
else:
if (image_width == watermark_width and image_height == watermark_height):
print(f"Removing image at {image_rect} of size ({watermark_width}, {watermark_height})")
page.delete_image(xref)
break
# 查找并删除特定文字
for watermark_text in watermark_texts:
text_instances = page.search_for(watermark_text)
for inst in text_instances:
print(f"Removing text: {watermark_text} at {inst}")
page.add_redact_annot(inst, text="") # 添加遮盖注释
page.apply_redactions() # 应用遮盖注释
temp_output_path = output_path + ".temp"
doc.save(temp_output_path)
doc.close()
shutil.move(temp_output_path, output_path)
def process_pdfs_in_directory(directory_path, watermark_sizes, watermark_rects, watermark_texts, save_option):
"""
处理目录下的所有PDF文件。
参数:
directory_path (str): PDF文件所在的目录路径。
watermark_sizes (list of tuples): 水印的尺寸列表,每个元素是一个 (宽度, 高度) 的元组。
watermark_rects (list of str): 水印的矩形位置列表,每个元素是一个矩形位置字符串。
watermark_texts (list of str): 要删除的特定文字列表。
save_option (str): 保存选项 ('overwrite' 或 'suffix')。
"""
for filename in os.listdir(directory_path):
if filename.lower().endswith('.pdf'):
pdf_path = os.path.join(directory_path, filename)
if save_option == 'overwrite':
output_path = pdf_path
elif save_option == 'suffix':
base, ext = os.path.splitext(filename)
output_path = os.path.join(directory_path, f"{base}_qsy{ext}")
else:
raise ValueError("Invalid save_option. Use 'overwrite' or 'suffix'.")
remove_watermarks_by_sizes(pdf_path, output_path, watermark_sizes, watermark_rects, watermark_texts)
print(f"Processed {pdf_path} -> {output_path}")
# 使用示例
directory_path = r"D:\学习\一建2024\2024\经济\讲义" # 使用原始字符串
watermark_sizes = [(83, 83), (213, 72), (750, 1000)] # 假设有多个水印图片的大小
watermark_rects = ["", "", ""] # 对应的水印的矩形位置需要测试获取,主要是防止误删除和水印同样大小的图片。
watermark_texts = ["扫码关注更多内容", "学员专用 请勿外泄"] # 要删除的特定文字列表
# 选择保存方式:'overwrite'覆盖保存 或 'suffix'添加后缀保存
save_option = 'overwrite' # 选择'suffix' 或 'overwrite'
process_pdfs_in_directory(directory_path, watermark_sizes, watermark_rects, watermark_texts, save_option)
|