jasper模板支持动态生僻字显示

jasper模板支持动态生僻字显示
包引用

jasperreports 5.5.1
itextAsian.jar
ireport3.1.0.jar(报错就引入)
如果包找不到字体,可以添加配置文件在项目根路径下 jasperreports.properties(里面内容如下)

net.sf.jasperreports.awt.ignore.missing.font=true

主要思路如下:
替换JRPdfExporter 成MyJrPdfExport
重写exportText方法替换模板的PdfFontName和PdfEncoding(如下方法)
如果使用的是JasperExportManager 也是一样的意思,复制JasperExportManager,然后把里面的JRPdfExporter 改成MyJrPdfExport 。

//主要思路如下,可自行优化
public class MyJrPdfExport extends JRPdfExporter {

    @Override
    public void exportText(JRPrintText text) throws DocumentException {
        String value = (String) text.getValue();
        //判断填充的内容是否包含生僻字,如果包含生僻字,则修改字体,不包含就不修改字体hasSpecialWord-方法按照字体公司给的适当调整
        if (!StringUtils.isEmpty(value) && hasSpecialWord(value)) {
            if (text instanceof JRTemplatePrintText) {
                JRTemplatePrintText printText = (JRTemplatePrintText) text;
                JRTemplateElement template = printText.getTemplate();
                if (template instanceof JRTemplateText) {
                    JRTemplateText templateTxt = (JRTemplateText) template;
                    //深克隆新的字体对象 templateNew  避免修改一个框的字体,影响整个页面的字体
                    JRTemplateText templateNew = deepClone(template);
                    templateNew.setPdfEncoding("Identity-H");
                    templateNew.setPdfFontName("远程获取的ttf文件或地址");
                    //新的字体对象赋值进去
                    printText.setTemplate(templateNew);
                }
            }
        }
        super.exportText(text);
    }
}

你可能感兴趣的:(java基本知识,jasper,生僻字)