温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中PDF转图片出现乱码如何解决

发布时间:2021-06-30 17:49:48 来源:亿速云 阅读:1965 作者:Leah 栏目:编程语言

这期内容当中小编将会给大家带来有关Java中PDF转图片出现乱码如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

第一种就是在服务器字体库添加STSong-Light添字体(理论,因为没找到STSong-Light.ttf文件)

   下载好STSong-Light.ttf文件之后把他复制到系统的字体库

    windows字体库路径:C:\Windows\Fonts,直接把文件复制到该目录下就能自动安装该字体

    linux字体库路径: /usr/share/fonts ,把文件复制过来之后需要该目录下执行以下命令,字体文件可以在Windows的字体库上找

        #将字体文件拷贝到这个文件夹下,在cd /usr/share/fonts/目录下执行以下命令        #mkfontscale   
        #mkfontdir
        #fc-cache -fv           //刷新字体缓存        #fc-list    // 查看系统中所有的字体,可用于查看是否安装字体成功

系统拥有这种字体后就不会乱码了。

第二种就是创建PDF文件的时候使用系统已有的字体

这是使用默认字体创建的Font对象,这种字体创建的PDF转的图片会乱码

public static Font getFont(float size) throws Exception {// 使用默认字体生成PDF    BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);    Font font = new Font(baseFont, size, 0);    return font;}

由这个Font对象所用的字体 STSong-Light 系统里面没有造成乱码,并且STSong-Light的坑太多(例如没有STSong-Light.ttf文件),所以我们换一种字体

下面的方案有2点需要注意

1.路径后面必须加上“,0”,否在路径会报错
2.linux包上面如果不存在指定的字体文件,需要从windows复制到linux的字体库上,流程和第一种方案的linux复制字体流程一致

public static Font getFont(float size) throws Exception {//获取系统字体的路径    String fontPath = "";    String os = System.getProperties().getProperty("os.name");//获取系统类型    if (os.startsWith("win") || os.startsWith("Win")) { //win下获取字体的路径, fontPath = "C:" + File.separator + "Windows" + File.separator + "Fonts" + File.separator + "simsun.ttc,0";    } else {   // linux下获取字体的路径,linux如果没有该fontPath = File.separator + "usr" + File.separator + "share" + File.separator + "fonts" + File.separator + "simsun.ttc,0";    }logger.info("获取到的系统的字体路径为:" + fontPath);    BaseFont b = null;    try {
        b = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);        logger.info("使用系统的宋体字体生成pdf!");    } catch (Exception e) {
        e.printStackTrace();        //如果发生异常执行默认的字体        b = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);        logger.info("没有获取系统的simsun字体,使用pdf默认体字生成pdf!");    }return new Font(b, size, Font.NORMAL, BaseColor.BLACK);}

理论上上面2种方案都可以解决我这个场景下的问题,但是没找到STSong-Light.ttf文件,所以只能使用第二种方案了,下面展示下成功转换的效果

<!-- PDF转图片 --><dependency>   <groupId>org.apache.pdfbox</groupId>   <artifactId>pdfbox</artifactId>   <version>2.0.12</version></dependency><dependency>   <groupId>org.apache.pdfbox</groupId>   <artifactId>fontbox</artifactId>   <version>2.0.12</version></dependency>
public static void createQrCodeImage(){
    File pdfFile = new File("PDF文件路径");    try {//设置存储路径        String fileAdd = DateUtils.getDateFormatToString(new Date(), "yyyyMMdd");        //读取pdf文件        PDDocument doc = PDDocument.load(pdfFile);        PDFRenderer renderer = new PDFRenderer(doc);        int pageCount = doc.getNumberOfPages();        for (int i = 0; i < pageCount; i++) {// 方式2,第二个参数是设置缩放比(即像素)            BufferedImage image = renderer.renderImage(i, 1f);  //第二个参数越大生成图片分辨率越高,转换时间也就越长            //文件路径            File img = new File("图片输入路径");            // 如果不包含文件夹则创建            if(!img.getParentFile().exists()) img.getParentFile().mkdirs();            ImageIO.write(image, "JPG", img);        }
    } catch (IOException e) {
        e.printStackTrace();    }
}

上述就是小编为大家分享的Java中PDF转图片出现乱码如何解决了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI