在linux环境下使用icepdf或pdfbox将pdf转化成图片是乱码解决

   在linux环境下使用icepdf或pdfbox将pdf转化成图片是出现乱码,网上查发下是itextpdf生成pdf引用"STSong-Light"字体而linux环境下没有这个字体造成的。

所有要从根源解决问题,就是在生成pdf的时候就给它指定系统存在的字体,这样pdf转化成图片就没问题了。

      pdfbox生成pdf时候默认用的字体为"STSong-Light",但是STSong-Light字体在全网搜索有点坑,都没找到,如果pdf不转换成图片的时候则没问题,如果业务需要,将pdf转化成图片时候,在Windows环境下没问题,放到linux就乱码,通过网上的资料发现,可以引用系统的字体。这样生成的图片就没问题,下面介绍下引用系统的字体的方法(前提是系统存在这些字体,linux下装字体请自行百度,这里不再累述)

     修改itextpdf字体代码如下:

public Font chineseFont(int size) throws Exception {
         // 设置中文
        //BaseFont b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //默认的字体调用
        //获取系统字体的路径
        String prefixFont = "";
        String os = System.getProperties().getProperty("os.name");//获取系统类型
        if (os.startsWith("win") || os.startsWith("Win")) {//win下获取字体的路径
            prefixFont = "C:\\Windows\\Fonts" + File.separator + "STSONG.TTF";
        } else {
            prefixFont = "/usr/share/fonts" + File.separator + "STSONG.TTF"; {//linux下获取字体的路径,注意该目录下如果没有需额外安装,如我用的是STSONG字体
        }
        logger.info("获取到的系统的字体路径为:"+prefixFont);
        BaseFont b = null;
        try {
            b = BaseFont.createFont(prefixFont, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            logger.info("使用系统的宋体字体生成pdf!");
        } catch (Exception e) {
            //如果发生异常执行默认的字体
            b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            logger.info("没有获取系统的STSONG字体,使用pdf默认体字生成pdf!");
        }
        
        return new Font(b, size, Font.NORMAL, BaseColor.BLACK);
    }

 

posted @ 2018-07-21 16:17  搬砖真累  阅读(5964)  评论(1编辑  收藏  举报