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

Django项目中使用pdfkit生成PDF体积过大的优化咨询

缩小pdfkit生成PDF体积的优化方案

一、配置wkhtmltopdf压缩参数

pdfkit依赖wkhtmltopdf,通过添加专用压缩参数可大幅降低体积,修改代码如下:

import pdfkit
from django.template.loader import render_to_string

my_html = ''
for content in blocktexts:
   my_html += render_to_string('mypath/myhtml.html')

# 添加压缩相关配置
options = {
    'enable-compression': True,  # 开启PDF内容压缩
    'image-quality': '60',       # 降低嵌入图片质量(范围0-100,按需调整)
    'lowquality': '',            # 启用全局低质量模式,压缩文本和图片
    'cache-dir': '/tmp',         # 缓存重复资源(比如每页相同的小图片,避免重复嵌入)
    'disable-javascript': '',    # 禁用不必要的JS渲染
    'no-background': ''          # 无背景需求时可开启,减少冗余内容
}

# 传入options生成PDF
pdf_content = pdfkit.from_string(my_html, False, options=options)

二、优化HTML中的图片资源

  • 若每页的小图片是同一张,通过上述cache-dir参数缓存图片,避免重复嵌入导致体积叠加。
  • 提前压缩图片:将图片转为JPG(非透明场景)或压缩PNG体积,确保图片尺寸仅满足页面显示需求,不要用过大的原图。

三、精简HTML结构与样式

  • 移除HTML中的冗余标签、空白字符,减少渲染后的PDF冗余内容。
  • 用内联CSS代替外部样式文件,避免wkhtmltopdf生成额外的样式冗余代码。
  • 简化复杂CSS(如嵌套层级、浮动布局),减少PDF渲染时的不必要计算和内容生成。

四、二次压缩PDF(可选)

如果上述优化后体积仍不满足需求,可通过PyPDF2对生成的PDF进行二次压缩:

from PyPDF2 import PdfWriter, PdfReader
from io import BytesIO

# 先生成带基础压缩的PDF字节流
pdf_bytes = pdfkit.from_string(my_html, False, options=options)

# 二次压缩
output_buffer = BytesIO()
reader = PdfReader(BytesIO(pdf_bytes))
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

# 保留原PDF元数据
writer.add_metadata(reader.metadata)
writer.write(output_buffer)

compressed_pdf = output_buffer.getvalue()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:17:42