JAVA中pdf轉圖片的幾種方法
阿新 • • 發佈:2021-10-20
JAVA中實現pdf轉圖片可以通過第三方提供的架包,這裡介紹幾種常用的,可以根據自身需求選擇使用。
一、icepdf。有收費版和開源版,幾種方法裡最推薦的。轉換的效果比較好,能識別我手標頭檔案中的中文,就是轉換後可能字型的關係部分字間距有點寬。因為,字型支援是要收費的,所以轉換的圖片會帶有官方的水印。去水印的方法可以檢視另一篇文章:icepdf去水印方法
1、下載icepdf的架包,並匯入專案中,這裡用到4個,如下:
2、附上程式碼例子:
1 String filePath = "c:/test.pdf"; 2 Document document = new Document(); 3 document.setFile(filePath); 4 float scale = 2.5f;//縮放比例 5 float rotation = 0f;//旋轉角度 6 7 for (int i = 0; i < document.getNumberOfPages(); i++) { 8 BufferedImage image = (BufferedImage) 9 document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale); 10 RenderedImage rendImage = image; 11 try { 12 File file = new File("c:/iecPDF_" + i + ".png"); 13 ImageIO.write(rendImage, "png", file); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 image.flush(); 18 } 19 document.dispose();
例子中是pdf轉png格式的,也可以將12、13行改成jpg,轉出jpg格式的,但是從轉換效果來看png的清晰度會相對較高。有個小技巧是12行改成jpg,但13行使用png,也就是轉換成jpg格式但有png清晰度的圖片。
二、pdfbox。轉換效果還可以,能識別我手中檔案大部分內容,有部分內容無法識別。
1、下載pdfbox的架包,並匯入專案,這裡用到2個,如下:
maven獲取jar:
<!--pdf轉圖片-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.0-alpha2</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>3.0.0-alpha2</version>
</dependency>
2、附上程式碼例子:
1 File file = new File("c:\\test.pdf"); 2 try { 3 PDDocument doc = PDDocument.load(file); 4 PDFRenderer renderer = new PDFRenderer(doc); 5 int pageCount = doc.getNumberOfPages(); 6 for(int i=0;i<pageCount;i++){ 7 BufferedImage image = renderer.renderImageWithDPI(i, 296); 8 // BufferedImage image = renderer.renderImage(i, 2.5f); 9 ImageIO.write(image, "PNG", new File("C:\\pdfbox_image.png")); 10 } 11 } catch (IOException e) { 12 e.printStackTrace(); 13 }
例子中rederImageWithDPI的第二個引數為dpi解析度單位,可根據需求調節大小,程式碼第八行提供了架包裡另一種轉圖片的方法,第二個引數為縮放比。
三、jpedal。效果不太理想,貌似對中文支援不太好,下面的lgpl版本是開源版。
1、下載jpedal的架包,並匯入專案中,如下:
2、附上程式碼例子:
1 PdfDecoder decode_pdf = new PdfDecoder(true); 2 try { 3 decode_pdf.openPdfFile("c:\\test.pdf"); //file 4 // decode_pdf.openPdfFile("C:/jpedalPDF.pdf", "password"); //encrypted file 5 // decode_pdf.openPdfArray(bytes); //bytes is byte[] array with PDF 6 // decode_pdf.openPdfFileFromURL("http://www.mysite.com/jpedalPDF.pdf",false); 7 // decode_pdf.openPdfFileFromInputStream(in, false); 8 9 int start = 1, end = decode_pdf.getPageCount(); 10 for(int i = start; i < end+1; i++){ 11 BufferedImage img=decode_pdf.getPageAsImage(i); 12 try { 13 ImageIO.write(img, "png", new File("C:\\jpedal_image.png")); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 } 18 decode_pdf.closePdfFile(); 19 } catch (PdfException e) { 20 e.printStackTrace(); 21 }
例子的3-7行還提供了幾種不同的pdf開啟方式,可以根據自己的需要選擇使用。
我是個雙魚座的小王子,沉浸在自己的程式碼世界裡,去探索這未知的世界,希望遇到更多的小夥伴一起前行!