这期内容当中小编将会给大家带来有关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转图片出现乱码如何解决了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。