SpringBoot實(shí)現(xiàn)PDF轉(zhuǎn)圖片的代碼示例
不是單頁(yè)圖片,是多頁(yè)P(yáng)DF轉(zhuǎn)成一張圖片的邏輯。
我這里的場(chǎng)景是PDF轉(zhuǎn)成圖片之后返回給前端,前端再在圖片上實(shí)現(xiàn)簽字,并且可拖拽的邏輯,就是簽訂合同的場(chǎng)景。
但是這里只寫后端多頁(yè)P(yáng)DF轉(zhuǎn)圖片的邏輯。
先說(shuō)邏輯,后面直接上代碼,大致分為以下幾步:
- 讀取PDF文件(我的代碼里是將在線的URL轉(zhuǎn)成InputStream了)
- 按PDF的頁(yè)面循環(huán)計(jì)算圖片的寬度和高度,其中寬度為PDF最寬的那一頁(yè)的寬度(畢竟有的PDF比較騷,可能一頁(yè)是橫的,一頁(yè)是豎的),高度為所有頁(yè)面加起來(lái)的高度
- 用Graphics2D繪制
- 將Graphics2D的繪制結(jié)果輸出為圖片(只要有outputStream都好說(shuō),我這里是輸出成base64給前端了,沒(méi)什么存起來(lái)的必要)
好了,直接上代碼:
先在pom.xml導(dǎo)入依賴:
<!-- pdf讀取 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.1</version>
</dependency>
public String getSinglePicBase64Contracts(String fileUrl) throws IOException {
byte[] pdfBytes = HttpUtil.createGet(fileUrl).execute().bodyBytes();
InputStream inputStream = new ByteArrayInputStream(pdfBytes);
PDDocument doc = PDDocument.load(inputStream);
PDFRenderer pdfRenderer = new PDFRenderer(doc);
List<BufferedImage> imageList = new ArrayList<>(doc.getNumberOfPages());
int maxWidth = 0;
int totalHeight = 0;
for (int i = 0; i < doc.getNumberOfPages(); i++) {
BufferedImage image = pdfRenderer.renderImage(i, 1.25f);
imageList.add(image);
if (image.getWidth() > maxWidth) {
maxWidth = image.getWidth();
}
totalHeight += image.getHeight();
}
// 繪制結(jié)果
BufferedImage result = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = result.createGraphics();
int nowHeight = 0;
for (BufferedImage bufferedImage : imageList) {
// padding 為頁(yè)面的左邊距
int padding = (maxWidth - bufferedImage.getWidth()) / 2;
g2d.drawImage(bufferedImage, padding, nowHeight, null);
nowHeight += bufferedImage.getHeight();
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(result, "png", outputStream);
String singlePicBase64 = "data:image/png;base64," + Base64.encodeBase64String(outputStream.toByteArray());
return singlePicBase64;
}
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)PDF轉(zhuǎn)圖片的代碼示例的文章就介紹到這了,更多相關(guān)SpringBoot PDF轉(zhuǎn)圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
迅速掌握J(rèn)ava容器中常用的ArrayList類與Vector類用法
這篇文章主要介紹了Java容器中常用的ArrayList類與Vector類用法,文中只對(duì)其最基本的功能給出了示例代碼,需要的朋友可以參考下2015-11-11
字節(jié)二面SpringBoot可以同時(shí)處理多少請(qǐng)求
這篇文章主要為大家介紹了字節(jié)二面之SpringBoot可以同時(shí)處理多少請(qǐng)求面試分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Java中的任務(wù)調(diào)度框架quartz詳細(xì)解析
這篇文章主要介紹了Java中的任務(wù)調(diào)度框架quartz詳細(xì)解析,Quartz 是一個(gè)完全由 Java 編寫的開源作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡(jiǎn)單卻強(qiáng)大的機(jī)制,需要的朋友可以參考下2023-11-11
簡(jiǎn)單了解JAVA中類、實(shí)例與Class對(duì)象
這篇文章主要介紹了簡(jiǎn)單了解JAVA中類、實(shí)例與Class對(duì)象,類是面向?qū)ο缶幊陶Z(yǔ)言的一個(gè)重要概念,它是對(duì)一項(xiàng)事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法,需要的朋友可以參考下2019-06-06
java Collection 之List學(xué)習(xí)介紹
本篇文章小編為大家介紹,java Collection 之List學(xué)習(xí)介紹。需要的朋友參考下2013-04-04
MyBatis 動(dòng)態(tài)拼接Sql字符串的問(wèn)題
MyBatis的動(dòng)態(tài)SQL,解決了SQL字符串拼接的痛苦。下文分步驟給大家詳細(xì)介紹了MyBatis 動(dòng)態(tài)拼接Sql字符串的問(wèn)題,非常不錯(cuò),感興趣的朋友一起看下吧2016-08-08
淺談java中math類中三種取整函數(shù)的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java中math類中三種取整函數(shù)的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐
在系統(tǒng)業(yè)務(wù)中,需要想客戶發(fā)送手機(jī)驗(yàn)證碼,進(jìn)行驗(yàn)證后,才能提交,本文主要介紹了springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn)
這篇文章主要介紹了Java使用Freemarker頁(yè)面靜態(tài)化生成的實(shí)現(xiàn),頁(yè)面靜態(tài)化是將原來(lái)的動(dòng)態(tài)網(wǎng)頁(yè)改為通過(guò)靜態(tài)化技術(shù)生成的靜態(tài)網(wǎng)頁(yè),FreeMarker?是一個(gè)用?Java?語(yǔ)言編寫的模板引擎,它基于模板來(lái)生成文本輸,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-06-06
Java CompletableFuture與ForkJoinPool的關(guān)系及說(shuō)明
這篇文章主要介紹了Java CompletableFuture與ForkJoinPool的關(guān)系及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05

