您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。