生产环境使用pdfkit Python生成PDF后下载图片模糊问题
我之前也碰到过类似的情况,用pdfkit生成PDF时图片模糊,大多和渲染分辨率、图片加载方式或者HTML里的尺寸设置有关。结合你的代码,给你几个可行的解决方案:
1. 提升PDFKit的渲染分辨率
PDFKit默认的图片渲染分辨率偏低(通常是96dpi),这是导致图片模糊的核心原因。你可以在配置选项里添加高分辨率相关参数:
options = { 'page-size': 'A4', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'image-dpi': '300', # 强制用300dpi(打印级分辨率)渲染图片 'zoom': 1.5 # 提升整体页面渲染缩放比例,强化细节清晰度 }
image-dpi会让PDFKit以更高的精度处理图片,zoom则放大整个HTML的渲染尺寸,能同时改善文字和图片的清晰度。
2. 优化HTML模板中的图片处理
你的HTML里给图片设置了固定的height:160px; width:160px,如果原始图片分辨率远高于这个尺寸,PDFKit在渲染时可能会压缩图片导致模糊。可以做这些调整:
- 确保
context['user_info']['photo']指向的是高分辨率原始图片,不要使用经过压缩的缩略图 - 修改img标签样式,保留图片原始比例,避免强制压缩:
<img src="{{ context['user_info']['photo'] }}" style="height: 160px; width: 160px; object-fit: cover; image-rendering: crisp-edges;" alt="Tutor Photo">
object-fit: cover保证图片按比例填充容器,image-rendering: crisp-edges让图片边缘更锐利,减少模糊感。
另外要确认图片URL是绝对路径(比如https://your-domain.com/photos/xxx.jpg),如果是相对路径,PDFKit可能无法正确加载原始高清图,只能用低清版本渲染。
3. 优化后端PDF生成与编码逻辑
你当前先保存PDF到文件再读取编码的方式,可能会有不必要的损耗,而且str(encode_string).split("'")[1]的字符串处理不够健壮。可以改成直接生成字节流再编码:
# 直接生成PDF字节流,跳过文件保存步骤 pdf_bytes = pdfkit.from_string(html, output_path=False, options=options) # 正确解码base64字符串 encode_string = base64.b64encode(pdf_bytes) data = encode_string.decode('utf-8')
这样代码更简洁,还避免了文件读写可能带来的问题,同时确保base64编码的正确性。
4. 验证前端base64处理
你的前端代码看起来没问题,但可以检查后端返回的base64字符串是否完整:比如在前端打印cb的值,确认开头没有多余字符、结尾是正确的填充符=,避免编码截断导致的PDF损坏或模糊。
按照这些步骤调整后,生成的PDF图片清晰度应该会有明显提升。
内容的提问来源于stack exchange,提问作者Md Morshed Alam

