itextpdf 5.5.10使用PdfStamper类时中文不显示问题

itextpdf 5.5.10使用PdfStamper类时中文不显示问题

最近做了一个业务场景,生成支付的电子回单,业务逻辑为根据银行方的接口返回的电子回单数据,填充PDF模板,生成PDF文件。遇到了中文不显示或者只显示中文的问题,研究了三四个小时终于解决了,其实特别简单,只是网上相关的资料太少了,itextpdf的代码注释也一言难尽,所以特此记录下解决方法。

生成PDF模板:https://www.pdfescape.com/

网站可以免费免注册使用,创建一个空的pdf,按需添加页面元素,支持文本、线、下拉框、多选框等
itextpdf 5.5.10使用PdfStamper类时中文不显示问题_第1张图片
装填PDF模板并生成PDF的代码如下:

    /**
     * 根据模板装填并生成pdf文件
     * @author zhangt
     */
    public static File generatePdfFile2Local(String templatePath,
                                      String templateName ,
                                      String filePath ,
                                      String fileName ,
                                      Consumer<AcroFields> consumer) throws IOException, DocumentException {
        //填充pdf
        PdfReader reader = null;
        PdfStamper stamper = null;
        File generateFile = null;
         try {
            reader = new PdfReader(templatePath+"/"+templateName);
            if(!new File(filePath).exists()){
                new File(filePath).mkdirs();
            }
            generateFile = new File(filePath,fileName);
            if(!generateFile.exists() || !generateFile.isFile()){
                generateFile.createNewFile();
            }
            stamper = new PdfStamper(reader,new FileOutputStream(generateFile));
            //取出模板中的属性字段
            AcroFields fields = stamper.getAcroFields();
            //填充数据
            consumer.accept(fields);
            stamper.setFormFlattening(false);
            return generateFile;
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }finally {
            if(stamper != null){
                stamper.close();
            }
            if(reader != null){
                reader.close();
            }
        }
        return generateFile;
    }

打开生成的PDF文件,发现里面的中文字段都不显示(或者点一下才能显示),看了itextpdf的源码,注释实在是太少了,研究了一会决定百度下。尝试了几个都不对,后来在一个博主的文章中找到了一行代码:

//中文字体
BaseFont baseFont = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1",BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);

form.AddSubstitutionFont(baseFont);

果断尝试下,发现确实能显示中文了,只不过其他的数字都不显示了 。。。
之前试的时候其实遇到了这种情况,只需要设置一个属性就好了

 stamper.setFormFlattening(false);

完整代码如下:

  /**
     * 根据模板装填并生成pdf文件
     * @author zhangt
     */
    public static File generatePdfFile2Local(String templatePath,
                                      String templateName ,
                                      String filePath ,
                                      String fileName ,
                                      Consumer<AcroFields> consumer) throws IOException, DocumentException {
        //填充pdf
        PdfReader reader = null;
        PdfStamper stamper = null;
        File generateFile = null;
        //中文字体
        BaseFont baseFont = BaseFont.createFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1",BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED);
        try {
            reader = new PdfReader(templatePath+"/"+templateName);
            if(!new File(filePath).exists()){
                new File(filePath).mkdirs();
            }
            generateFile = new File(filePath,fileName);
            if(!generateFile.exists() || !generateFile.isFile()){
                generateFile.createNewFile();
            }
            stamper = new PdfStamper(reader,new FileOutputStream(generateFile));
            //取出模板中的属性字段
            AcroFields fields = stamper.getAcroFields();
            fields.addSubstitutionFont(baseFont);
            //填充数据
            consumer.accept(fields);
            stamper.setFormFlattening(false);
            return generateFile;
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }finally {
            if(stamper != null){
                stamper.close();
            }
            if(reader != null){
                reader.close();
            }
        }
        return generateFile;
    }

遇到这种代码注释和相关文档都很少的包真的难受,还是要多多阅读源码,提升代码思想,也许遇到这种小问题思路就开阔多了 。

你可能感兴趣的:(itextpdf 5.5.10使用PdfStamper类时中文不显示问题)