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

如何用Python将文件夹内可搜索PDF转为无损不可搜索PDF?

解决可搜索PDF转不可搜索PDF时的画质损失问题(批量处理方案)

方案一:优化PyMuPDF参数,保证画质

你之前用PyMuPDF出现画质下降,大概率是默认分辨率设置过低。调整渲染参数后可以大幅提升输出画质,以下是批量处理脚本:

首先安装依赖:

pip install pymupdf

批量处理脚本:

import os
import fitz  # PyMuPDF

def convert_to_non_searchable(input_pdf, output_pdf, dpi=300):
    doc = fitz.open(input_pdf)
    new_doc = fitz.open()
    
    # 计算缩放比例:PDF默认DPI为72,300DPI是兼顾画质和体积的最优值
    zoom = dpi / 72
    matrix = fitz.Matrix(zoom, zoom)
    
    for page in doc:
        # 高分辨率渲染页面为图像
        pix = page.get_pixmap(matrix=matrix, alpha=False)
        # 将图像插入新PDF页面
        new_page = new_doc.new_page(width=pix.width, height=pix.height)
        new_page.insert_image(new_page.rect, pixmap=pix)
    
    new_doc.save(output_pdf)
    new_doc.close()
    doc.close()

def batch_process(input_folder, output_folder, dpi=300):
    os.makedirs(output_folder, exist_ok=True)
    
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.pdf'):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, f"non_searchable_{filename}")
            print(f"处理中:{filename}")
            convert_to_non_searchable(input_path, output_path, dpi)
    print("所有文件处理完成!")

# 替换为你的文件夹路径
if __name__ == "__main__":
    INPUT_DIR = "你的输入PDF文件夹路径"
    OUTPUT_DIR = "你的输出文件夹路径"
    batch_process(INPUT_DIR, OUTPUT_DIR, dpi=300)
  • 若需更高画质,可将dpi设为600(文件体积会相应增大)
  • alpha=False关闭透明通道,避免不必要的体积浪费

方案二:用Ghostscript批量处理(无需poppler)

如果你更倾向用Ghostscript,它对PDF画质的控制更精准,且转换效率更高:

先安装Ghostscript

  • Windows:官网下载安装包,将安装路径添加到系统PATH环境变量
  • macOS:终端执行brew install ghostscript
  • Linux:终端执行apt install ghostscript(Debian/Ubuntu)或yum install ghostscript(CentOS)

批量调用脚本

import os
import subprocess

def gs_convert(input_pdf, output_pdf, dpi=300):
    # Ghostscript核心命令,保证高画质转换
    cmd = [
        "gs",
        "-dNOPAUSE",
        "-dBATCH",
        "-sDEVICE=pdfwrite",
        f"-r{dpi}",
        "-dPDFSETTINGS=/prepress",  # 印刷级画质配置
        "-dEmbedAllFonts=false",  # 转图像后无需嵌入字体
        "-sOutputFile=" + output_pdf,
        input_pdf
    ]
    subprocess.run(cmd, check=True)

def batch_process_gs(input_folder, output_folder, dpi=300):
    os.makedirs(output_folder, exist_ok=True)
    
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.pdf'):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, f"non_searchable_{filename}")
            print(f"处理中:{filename}")
            gs_convert(input_path, output_path, dpi)
    print("所有文件处理完成!")

# 替换为你的文件夹路径
if __name__ == "__main__":
    INPUT_DIR = "你的输入PDF文件夹路径"
    OUTPUT_DIR = "你的输出文件夹路径"
    batch_process_gs(INPUT_DIR, OUTPUT_DIR, dpi=300)
  • -dPDFSETTINGS=/prepress对应高画质,若想减小体积可改为/default(画质略降)或/screen(适合快速查看)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:43:18