Java實(shí)現(xiàn)PDF轉(zhuǎn)圖片的三種方法
前言
提示:生成圖片以后需要將文件流關(guān)閉,不然刪除文件會(huì)刪除失敗很多人不知道怎么將pdf的文件轉(zhuǎn)換成圖片格式的,而且網(wǎng)上有很例子是跑不通的,同是也是方便自己在用到該需求的時(shí)候能夠快速度地寫(xiě)出來(lái),所以整理了幾種pdf轉(zhuǎn)換成圖片的方法工具類(lèi)。
一、使用開(kāi)源庫(kù)Apache PDFBox將PDF轉(zhuǎn)換為圖片
1、引入依賴(lài)庫(kù)
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.9</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.9</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
2、實(shí)現(xiàn)pdf轉(zhuǎn)換圖片工具類(lèi)(多頁(yè)pdf會(huì)生成多頁(yè)的圖片,后綴會(huì)生成圖片的位置序號(hào))
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Pdf2Png {
/**
* 使用pdfbox將整個(gè)pdf轉(zhuǎn)換成圖片
*
* @param fileAddress 文件地址 如:C:\\Users\\user\\Desktop\\test
* @param filename PDF文件名不帶后綴名
* @param type 圖片類(lèi)型 png 和jpg
*/
public static void pdf2png(String fileAddress, String filename, String type) {
long startTime = System.currentTimeMillis();
// 將文件地址和文件名拼接成路徑 注意:線上環(huán)境不能使用\\拼接
File file = new File(fileAddress + "\\" + filename + ".pdf");
try {
// 寫(xiě)入文件
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
// dpi為144,越高越清晰,轉(zhuǎn)換越慢
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
// 將圖片寫(xiě)出到該路徑下
ImageIO.write(image, type, new File(fileAddress + "\\" + filename + "_" + (i + 1) + "." + type));
}
long endTime = System.currentTimeMillis();
System.out.println("共耗時(shí):" + ((endTime - startTime) / 1000.0) + "秒"); //轉(zhuǎn)化用時(shí)
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
pdf2png("C:\\Users\\user\\Desktop\\test", "測(cè)試", "png");
}
}使用Apache PDFBox將PDF轉(zhuǎn)換為圖片成功

3、按照固定頁(yè)數(shù)來(lái)將pdf轉(zhuǎn)換成圖片的工具類(lèi)(自由選擇pdf轉(zhuǎn)換圖片的頁(yè)數(shù))
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Pdf2Png {
/**
* 自由確定起始頁(yè)和終止頁(yè)
* @param fileAddress 文件地址 如:C:\\Users\\user\\Desktop\\test
* @param filename PDF文件名不帶后綴名
* @param indexOfStart 開(kāi)始頁(yè) 開(kāi)始轉(zhuǎn)換的頁(yè)碼,從0開(kāi)始
* @param indexOfEnd 結(jié)束頁(yè) 停止轉(zhuǎn)換的頁(yè)碼,-1為全部
* @param type 圖片類(lèi)型 png 和jpg
*/
public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd,String type) {
long startTime = System.currentTimeMillis();
// 將文件地址和文件名拼接成路徑 注意:線上環(huán)境不能使用\\拼接
File file = new File(fileAddress+"\\"+filename+".pdf");
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = indexOfStart; i < indexOfEnd; i++) {
// dpi為144,越高越清晰,轉(zhuǎn)換越慢
BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
// 將圖片寫(xiě)出到該路徑下
ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type));
}
long endTime = System.currentTimeMillis();
System.out.println("共耗時(shí):" + ((endTime - startTime) / 1000.0) + "秒"); // 轉(zhuǎn)換用時(shí)
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
pdf2png("C:\\Users\\user\\Desktop\\test", "思泰得流式檢測(cè)報(bào)告-00420299-任蛆小-RA202302100117",2,3, "png");
}
}自由頁(yè)數(shù)轉(zhuǎn)換成功

二、使用PDF Box將多頁(yè)的pdf轉(zhuǎn)換一張長(zhǎng)圖片的方法
1、引入PDF Box需要的依賴(lài)
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>pdf2dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.12</version>
</dependency>2、編寫(xiě)將多頁(yè)P(yáng)DF轉(zhuǎn)換多張圖片的工具類(lèi)
import com.lowagie.text.pdf.PdfReader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Pdf2Png {
/***
* PDF文件轉(zhuǎn)PNG圖片,全部頁(yè)數(shù)
* @param pdfFilePath pdf完整路徑:C:\\Users\\user\\Desktop\\test\\1234.pdf
* @param dpi dpi越大轉(zhuǎn)換后越清晰,相對(duì)轉(zhuǎn)換速度越慢
*/
public static void pdf2Image(String pdfFilePath, int dpi) {
long startTime = System.currentTimeMillis();
File file = new File(pdfFilePath);
PDDocument pdDocument;
try {
String imgPdfPath = file.getParent();
int dot = file.getName().lastIndexOf('.');
// 獲取圖片文件名
String imagePdfName = file.getName().substring(0, dot);
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
/* dpi越大轉(zhuǎn)換后越清晰,相對(duì)轉(zhuǎn)換速度越慢 */
PdfReader reader = new PdfReader(pdfFilePath);
int pages = reader.getNumberOfPages();
StringBuffer imgFilePath;
for (int i = 0; i < pages; i++) {
String imgFilePathPrefix = imgPdfPath + File.separator + imagePdfName;
imgFilePath = new StringBuffer();
imgFilePath.append(imgFilePathPrefix);
imgFilePath.append("_");
imgFilePath.append((i + 1));
imgFilePath.append(".png");
File dstFile = new File(imgFilePath.toString());
BufferedImage image = renderer.renderImageWithDPI(i, dpi);
ImageIO.write(image, "png", dstFile);
}
long endTime = System.currentTimeMillis();
System.out.println("共耗時(shí):" + ((endTime - startTime) / 1000.0) + "秒"); //轉(zhuǎn)化用時(shí)
} catch (IOException e) {
e.printStackTrace();
}
}
}三、使用文件流整個(gè)pdf轉(zhuǎn)換成圖片 (生成圖片,并將生成的圖片路徑返回)
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
public class Pdf2Png {
/**
* 使用文件流整個(gè)pdf轉(zhuǎn)換成圖片
* @param fileAddress 文件地址 如:C:\\Users\\user\\Desktop\\test
* @param filename PDF文件名不帶后綴名
* @param type 圖片類(lèi)型 png 、jpg
*/
public static List<Map<String, String>> pdfToImage(String fileAddress, String filename, String type) {
long startTime = System.currentTimeMillis();
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> resultMap = null;
PDDocument pdDocument = null;
String fileName = null;
String imgPath = null;
try {
// 將文件地址和文件名拼接成路徑 注意:線上環(huán)境不能使用\\拼接
File FilePath = new File(fileAddress + "\\" + filename + ".pdf");
// 文件流
FileInputStream inputStream = new FileInputStream(FilePath);
int dpi = 296;
pdDocument = PDDocument.load(inputStream);
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pageCount = pdDocument.getNumberOfPages();
/* dpi越大轉(zhuǎn)換后越清晰,相對(duì)轉(zhuǎn)換速度越慢 */
for (int i = 0; i < pageCount; i++) {
resultMap = new HashMap<>();
fileName = filename + "_" + (i + 1) + "." + type;
imgPath = fileAddress + "\\" + fileName;
BufferedImage image = renderer.renderImageWithDPI(i, dpi);
ImageIO.write(image, type, new File(imgPath));
resultMap.put("fileName", fileName);
resultMap.put("filePath", imgPath); // 圖片路徑
list.add(resultMap);
}
long endTime = System.currentTimeMillis();
System.out.println("共耗時(shí):" + ((endTime - startTime) / 1000.0) + "秒"); //轉(zhuǎn)化用時(shí)
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 這里需要關(guān)閉PDDocument,不然如果想要?jiǎng)h除pdf文件時(shí)會(huì)提示文件正在使用,無(wú)法刪除的情況
pdDocument.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
public static void main(String[] args) throws FileNotFoundException {
pdfToImage("C:\\Users\\user\\Desktop\\test", "測(cè)試", "png");
}
}總結(jié)
以上好幾種pdf轉(zhuǎn)圖片的方法,該方法可直接拿過(guò)去用,或者按照自己的邏輯進(jìn)行修改使用。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面就來(lái)一起學(xué)習(xí)學(xué)習(xí)吧!
以上就是Java實(shí)現(xiàn)PDF轉(zhuǎn)圖片的三種方法的詳細(xì)內(nèi)容,更多關(guān)于Java實(shí)現(xiàn)PDF轉(zhuǎn)圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis Plus 代碼生成器的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis Plus 代碼生成器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
淺談maven的jar包和war包區(qū)別 以及打包方法
下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11
java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱(chēng)加密與解密詳解
這篇文章主要給大家介紹了關(guān)于java結(jié)合keytool如何實(shí)現(xiàn)非對(duì)稱(chēng)加密與解密的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Java實(shí)現(xiàn)餅圖旋轉(zhuǎn)角度的代碼詳解
在現(xiàn)代數(shù)據(jù)可視化領(lǐng)域,餅圖因其直觀展示各部分占整體比例而被廣泛采用,為了增強(qiáng)互動(dòng)性和吸引力,常會(huì)賦予餅圖 旋轉(zhuǎn) 動(dòng)畫(huà):自動(dòng)、平滑地旋轉(zhuǎn),讓用戶從不同角度重點(diǎn)查看扇區(qū),本文將從零開(kāi)始,手把手實(shí)現(xiàn)一個(gè) Java2D Swing 版 的 可旋轉(zhuǎn)餅圖組件,需要的朋友可以參考下2025-05-05
java 多態(tài)性詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 多態(tài)性詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問(wèn)題
這篇文章主要介紹了解決SpringBoot中MultipartResolver和ServletFileUpload的沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java利用AlphaComposite類(lèi)合并圖像
這篇文章主要介紹了Java利用AlphaComposite類(lèi)合并圖像,幫助大家更好的利用Java處理圖像,感興趣的朋友可以了解下2020-10-10
Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解
這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java高效實(shí)現(xiàn)合并多個(gè)Word文檔的實(shí)戰(zhàn)指南
在企業(yè)開(kāi)發(fā)和日常辦公自動(dòng)化中,我們經(jīng)常需要處理 Word 文檔,本文將系統(tǒng)講解在 Java 中合并 Word 文檔的常用方法,提供完整示例,幫助你快速掌握文檔合并技巧2026-01-01

