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

如何使用Python轻量化大体积PDF?去除背景保留文本

用Python轻量化PDF:去除背景保留文本

可以借助Python库实现PDF去背景轻量化,以下是基于你提到的pypdf、reportlab及更高效的PyMuPDF(适合处理页面元素)的具体方案:

核心思路

PDF的背景通常是底层的大型图形元素(矢量图/位图),我们可以通过解析页面内容,分离文本与背景元素,重新生成仅包含文本和白色背景的PDF,从而大幅缩小体积。

具体实现方法

方法1:用pypdf提取文本 + reportlab生成新PDF

这种方法适合背景与文本完全分离的PDF:

  1. 用pypdf.PdfReader读取原PDF,提取每个页面的文本内容
  2. 用reportlab创建新PDF,设置白色背景,将提取的文本逐页写入

代码示例:

from pypdf import PdfReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

input_pdf = PdfReader("large_pdf.pdf")
output_pdf = canvas.Canvas("lightweight_pdf.pdf", pagesize=letter)

for page_num in range(len(input_pdf.pages)):
    page = input_pdf.pages[page_num]
    text = page.extract_text()
    
    # 设置白色背景
    output_pdf.setFillColorRGB(1, 1, 1)
    output_pdf.rect(0, 0, letter[0], letter[1], fill=1)
    
    # 写入文本(可调整字体、位置适配原排版)
    output_pdf.setFont("Helvetica", 10)
    text_lines = text.split('\n')
    y_pos = letter[1] - 50
    for line in text_lines:
        output_pdf.drawString(50, y_pos, line)
        y_pos -= 15
        if y_pos < 50:
            output_pdf.showPage()
            output_pdf.setFillColorRGB(1, 1, 1)
            output_pdf.rect(0, 0, letter[0], letter[1], fill=1)
            output_pdf.setFont("Helvetica", 10)
            y_pos = letter[1] - 50
    output_pdf.showPage()

output_pdf.save()

方法2:用PyMuPDF直接移除背景元素

如果PDF的背景是独立图层的图形,PyMuPDF可以精准定位并移除背景,保留原文本排版:

  1. 遍历每个页面的所有元素,判断元素类型(图形/文本)
  2. 筛选出文本元素,重新构建页面,设置白色背景

代码示例:

import fitz  # PyMuPDF

input_path = "large_pdf.pdf"
output_path = "lightweight_pdf.pdf"

doc = fitz.open(input_path)
for page in doc:
    # 设置白色背景
    page.set_fill_color(fitz.utils.getColor("white"))
    page.draw_rect(page.rect, fill=True)
    
    # 提取文本块,重新绘制
    text_blocks = page.get_text("blocks")
    for block in text_blocks:
        x0, y0, x1, y1, text, _, _ = block
        # 绘制文本(保留原字体、大小)
        page.insert_text((x0, y1), text, fontsize=page.get_fontsize(), color=fitz.utils.getColor("black"))
    
    # 移除原页面的非文本元素
    page.clean_contents()

doc.save(output_path, garbage=4, deflate=True)  # 启用压缩进一步缩小体积
doc.close()

注意事项

  • XP系统需使用Python 3.8及以下版本,确保pypdf、PyMuPDF等库兼容
  • 如果PDF背景与文本融合(如扫描件),则需要OCR提取文本后再生成新PDF,可结合pytesseract实现
  • 生成新PDF时可调整字体、排版,尽量贴合原电子书的阅读体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:15:08