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
相关产品推荐
相关产品推荐

