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

itextpdf html2pdf生成PDF时base64图片显示模糊如何解决

iText html2pdf 生成PDF中Base64图片模糊解决方案

问题核心原因

  • 前端ECharts导出Base64图片时默认像素比为1,导出的原始图片像素密度不足,渲染到PDF时被拉伸
  • 后端配置的分辨率参数和PDF实际渲染DPI不匹配:当前设置的2000f分辨率不符合常规渲染逻辑,且未给PdfWriter配置对应高DPI参数,默认按72DPI栅格化图片,必然出现模糊
  • 自定义页面尺寸时未按DPI等比换算,导致整体布局包括图片被非等比缩放

分步修复方案

1. 前端提高ECharts导出图片的像素密度

调用ECharts的getDataURL方法导出Base64时,手动指定pixelRatio参数,从根源提高导出图片的像素量,一般设置为3(对应3倍视网膜屏清晰度)即可,最高不要超过5避免文件体积过大:

// ECharts导出Base64配置示例
const base64Str = chartInstance.getDataURL({
  type: 'png',
  pixelRatio: 3,
  backgroundColor: '#ffffff' // 避免透明背景在PDF中出现色差
});

同时在HTML模板中,给渲染该Base64图片的<img>标签设置明确的宽高属性,不要仅靠CSS相对单位缩放,保证图片渲染尺寸和导出时的预期尺寸一致。

2. 修正后端iText渲染配置

去掉不合理的2000f分辨率设置,统一前后端DPI参数,给PdfWriter开启高清晰度渲染配置,修正后的代码如下:

public static void main(String[] args) throws Exception{
    File file = FileUtil.newFile("D:/test.html");
    BufferedOutputStream outputStream = FileUtil.getOutputStream("D:/test.pdf");
    BufferedInputStream inputStream = FileUtil.getInputStream(file);
    
    ConverterProperties converterProperties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider();
    FontProgram fontProgram = FontProgramFactory.createFont(Constant.CONFIG_PATH + File.separator + "simsun.ttc,1");
    fontProvider.addFont(fontProgram);
    
    // 统一设置渲染分辨率为300DPI(印刷级清晰度),不要设置无意义的超高数值
    MediaDeviceDescription mediaDeviceDescription = new MediaDeviceDescription(MediaType.SCREEN);
    mediaDeviceDescription.setResolution(300f);
    converterProperties.setFontProvider(fontProvider);
    converterProperties.setMediaDeviceDescription(mediaDeviceDescription);
    
    // 配置Writer参数,设置合理压缩级别平衡体积和清晰度
    WriterProperties writerProperties = new WriterProperties()
            .setCompressionLevel(3); 
    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outputStream, writerProperties));
    // 自定义页面尺寸需按DPI等比换算:72DPI下1000*1700的尺寸,对应300DPI需放大为原来的300/72≈4.17倍
    pdfDoc.setDefaultPageSize(new PageSize(4167f, 7083f));
    
    HtmlConverter.convertToPdf(inputStream, pdfDoc, converterProperties);
    
    // 关闭流资源
    inputStream.close();
    pdfDoc.close();
    outputStream.close();
}

调优说明

  • 若不需要印刷级清晰度,可将分辨率统一设为144DPI,对应ECharts导出pixelRatio设为2,页面尺寸按144/72=2倍换算即可,文件体积会更小
  • 不要随意拉大分辨率和pixelRatio的数值,两者保持比例匹配即可,过高的数值不会带来明显的清晰度提升,反而会导致PDF体积暴涨、生成速度变慢

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:24:21