如何使用Python移除PDF文本层且不丢失图像内的文字像素
基于PyMuPDF(fitz)的PDF转扫描件效果实现方案
实现思路
直接将PDF每一页全页渲染为光栅图像,再将所有图像重新拼接为新PDF。该方案完全删除原文本层、矢量元素,最终输出仅包含图像内容,不存在任何可选中复制的文本,也不会出现Ghostscript误删文字像素的问题。
依赖安装
pip install pymupdf
实现代码
import fitz def pdf_to_image_only(input_path: str, output_path: str, dpi: int = 200) -> None: # 打开原PDF doc = fitz.open(input_path) # 新建空PDF用于存储渲染后的页面 new_doc = fitz.open() # 缩放系数:72是PDF默认DPI,计算对应缩放比 zoom = dpi / 72 matrix = fitz.Matrix(zoom, zoom) for page in doc: # 渲染当前页为光栅图像,alpha设为False去掉透明通道,减小文件体积 pix = page.get_pixmap(matrix=matrix, alpha=False) # 新建和渲染图像尺寸一致的空白页 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_path, garbage=4, deflate=True) new_doc.close() doc.close() # 调用示例 if __name__ == "__main__": pdf_to_image_only("input.pdf", "output_scan_like.pdf", dpi=200)
方案说明
- 可通过调整
dpi参数控制输出清晰度,常规办公场景150-200DPI足够,需要高精度可设为300DPI,DPI越高文件体积越大 - 适配绝大多数无密码的常规PDF格式,处理速度远快于调用外部工具、逐页截图的方案
内容的提问来源于stack exchange,提问作者Demetry Pascal
相关产品推荐
相关产品推荐

