欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-01 08:30:41
...

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

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

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

网站可以免费免注册使用,创建一个空的pdf,按需添加页面元素,支持文本、线、下拉框、多选框等
itextpdf 5.5.10使用PdfStamper类时中文不显示问题
装填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;
    }

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

相关标签: java ITEXTPDF