Java快速實(shí)現(xiàn)PDF轉(zhuǎn)圖片功能實(shí)例代碼
前言
PDFBox是一個(gè)BSD許可下的源碼開放項(xiàng)目,它是一個(gè)專門為開發(fā)人員讀取和創(chuàng)建PDF文檔而準(zhǔn)備的純Java類庫。
- 文本提取:PDFBox可以從PDF文檔中提取文本,包括Unicode字符。
- 表單處理:PDFBox支持從PDF表單中提取數(shù)據(jù),或者是填充PDF表單。
- 加密與解密:可以對PDF文檔進(jìn)行加密和解密操作。
- 合并與分割:可以將多個(gè)PDF文檔合并成一個(gè),也可以將一個(gè)PDF文檔分割成多個(gè)。
- 覆蓋與追加:可以覆蓋PDF文檔的內(nèi)容,或者向已有的PDF文檔中追加內(nèi)容。
- 打印:利用Java的打印API,PDFBox可以將PDF文檔輸出到打印機(jī)。
- 轉(zhuǎn)換:PDFBox可以將PDF文檔轉(zhuǎn)換成映像文件,如PNG或JPEG格式。
- 創(chuàng)建PDF:可以從頭開始創(chuàng)建新的PDF文檔,包括添加圖像和字體。
- 集成Lucene搜索引擎:PDFBox與Jakarta Lucene等文本搜索引擎的整合過程十分簡單,可以用于PDF文檔的索引和搜索。
引入依賴
<!--pdf轉(zhuǎn)圖片-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version>
</dependency>
編寫PdfToImageUtil 工具類
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: 公眾號:知識淺談
* @Description: pdf轉(zhuǎn)圖片工具類
* @Version: 1.0
*/
@Slf4j
public class PdfToImageUtil {
/*dpi 越大圖片越清晰*/
private static final Integer DPI = 100;
/*轉(zhuǎn)換后圖片類型*/
private static final String IMG_TYPE = "jpg";
/**
* PDF轉(zhuǎn)圖片(多頁)
* @param fileContent pdf文件的二進(jìn)制流
* @return 圖片文件的二進(jìn)制流
* @throws Exception
*/
public static List<byte[]> pdfToImage(byte[] fileContent) throws Exception {
List<byte[]> imageList = new ArrayList<byte[]>();
PDDocument document=null;
try{
document = PDDocument.load(fileContent);
PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, DPI);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, IMG_TYPE, out);
imageList.add(out.toByteArray());
}
}finally {
document.close();
}
return imageList;
}
/**
* PDF轉(zhuǎn)圖片(單頁)
* @param fileContent pdf文件的二進(jìn)制流
* @return 圖片文件的二進(jìn)制流
* @throws Exception
*/
public static byte[] pdfToImageOne(byte[] fileContent) throws Exception {
byte[] image = null;
PDDocument document=null;
try{
document = PDDocument.load(fileContent);
PDFRenderer pdfRenderer = new PDFRenderer(document);
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, DPI);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, IMG_TYPE, out);
image = out.toByteArray();
}finally {
document.close();
}
return image;
}
public static Boolean saveImage(byte[] imageBytes, String savePath,String fileName) throws Exception {
try {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
File directory = new File(savePath);
if(!directory.exists()){
directory.mkdirs();
}
File file1 = new File(directory,fileName);
return ImageIO.write(image, IMG_TYPE, file1);
} catch (IOException e) {
log.error("保存文件錯(cuò)誤");
return false;
}
}
}方法實(shí)現(xiàn)
* pdf轉(zhuǎn)圖片
*/
@GetMapping(value = "/pdfToPng")
@Log(title = "證件模板", businessType = BusinessType.OTHER)
public void pdfToPng(HttpServletRequest request,HttpServletResponse response) {
try {
File file = new File("D:\\pdf\\test.pdf");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] pdfBytes = new byte[(int) file.length()];
fileInputStream.read(pdfBytes);
fileInputStream.close();
byte[] bytes = PdfToImageUtil.pdfToImageOne(pdfBytes);
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
response.setContentLength(bytes.length);
outputStream.write(bytes);
}catch (Exception e){
log.error("pdf轉(zhuǎn)圖片異常{}", e.getMessage());
}
}
運(yùn)行之后顯示的結(jié)果如下

總結(jié)
到此這篇關(guān)于Java快速實(shí)現(xiàn)PDF轉(zhuǎn)圖片功能的文章就介紹到這了,更多相關(guān)Java PDF轉(zhuǎn)圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java將一個(gè)目錄下的所有數(shù)據(jù)復(fù)制到另一個(gè)目錄下
這篇文章主要為大家詳細(xì)介紹了java將一個(gè)目錄下的所有數(shù)據(jù)復(fù)制到另一個(gè)目錄下,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Java SpringBoot啟動(dòng)指定profile的8種方式詳解
這篇文章主要介紹了spring boot 如何指定profile啟動(dòng)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot使用開發(fā)環(huán)境application.properties問題
這篇文章主要介紹了SpringBoot使用開發(fā)環(huán)境application.properties問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
詳解IDEA中MAVEN項(xiàng)目打JAR包的簡單方法
本篇文章主要介紹了詳解IDEA中MAVEN項(xiàng)目打JAR包的簡單方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
SpringBoot實(shí)現(xiàn)緩存預(yù)熱的幾種常用方案
緩存預(yù)熱是指在 Spring Boot 項(xiàng)目啟動(dòng)時(shí),預(yù)先將數(shù)據(jù)加載到緩存系統(tǒng)(如 Redis)中的一種機(jī)制,本文給大家介紹了SpringBoot實(shí)現(xiàn)緩存預(yù)熱的幾種常用方案,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-02-02

