Java實現(xiàn)圖片轉(zhuǎn)換PDF文件的示例代碼
最近因為一些事情,需要將一張簡單的圖片轉(zhuǎn)換為PDF的文件格式,在網(wǎng)上找了一些工具,但是這些工具不是需要注冊賬號,就是需要下載軟件。
而對于只是轉(zhuǎn)換一張圖片的情況下,這些操作顯然是非常繁瑣的,所以作者就直接使用Java寫了一個圖片轉(zhuǎn)換PDF的系統(tǒng),現(xiàn)在將該系統(tǒng)分享在這里。
引入依賴
<!--該項目以SpringBoot為基礎(chǔ)搭建--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> </parent> <dependencies> <!--SpringMVC的依賴,方便我們可以獲取前端傳遞過來的文件信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--ITextPdf,操作PDF文件的工具類--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.2</version> </dependency> </dependencies>
前端頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>圖片轉(zhuǎn)換Pdf</title> <style> .submitButton { margin-top: 20px; margin-left: 150px; background-color: #e37e10; border-radius: 10px; border: 1px solid #ff8300; } </style> </head> <body> <div style="text-align: center"> <h1>圖片轉(zhuǎn)換pdf工具</h1> <form action="/pdf/image/to" enctype="multipart/form-data" method="post" onsubmit="return allowFileType()"> <input type="file" id="file" name="file" placeholder="請選擇圖片" onchange="allowFileType()" style="border: 1px solid black;"><br> <input type="submit" value="一鍵轉(zhuǎn)換pdf文件" class="submitButton"> </form> </div> </body> <script> function allowFileType() { let file = document.getElementById("file").files[0]; let fileName = file.name; console.log(fileName) let fileSize = file.size; console.log(fileSize) let suffix = fileName.substring(fileName.lastIndexOf("."),fileName.length); if('.jpg' != suffix && '.png' != suffix) { alert("目前只允許傳入.jpg或者.png格式的圖片!"); return false; } if(fileSize > 2*1024*1024) { alert("上傳圖片不允許超過2MB!"); return false; } return true; } </script> </html>
控制層接口
package com.hrp.controller; import com.hrp.util.PdfUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; /** * @description: 用于處理Pdf相關(guān)的請求 */ @Controller @RequestMapping("pdf") public class PdfController { @PostMapping("image/to") public void imageToPdf(@RequestParam("file") MultipartFile file,HttpServletResponse response) throws Exception{ PdfUtils.imageToPdf(file,response); } }
PDF工具類
package com.hrp.util; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.PageSize; import com.itextpdf.text.pdf.PdfWriter; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; /** * @description: pdf相關(guān)的工具類 */ @Component public class PdfUtils { /** * 圖片轉(zhuǎn)換PDF的公共接口 * * @param file SpringMVC獲取的圖片文件 * @param response HttpServletResponse * @throws IOException IO異常 * @throws DocumentException PDF文檔異常 */ public static void imageToPdf(MultipartFile file, HttpServletResponse response) throws IOException, DocumentException { File pdfFile = generatePdfFile(file); downloadPdfFile(pdfFile, response); } /** * 將圖片轉(zhuǎn)換為PDF文件 * * @param file SpringMVC獲取的圖片文件 * @return PDF文件 * @throws IOException IO異常 * @throws DocumentException PDF文檔異常 */ private static File generatePdfFile(MultipartFile file) throws IOException, DocumentException { String fileName = file.getOriginalFilename(); String pdfFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".pdf"; Document doc = new Document(PageSize.A4, 20, 20, 20, 20); PdfWriter.getInstance(doc, new FileOutputStream(pdfFileName)); doc.open(); doc.newPage(); Image image = Image.getInstance(file.getBytes()); float height = image.getHeight(); float width = image.getWidth(); int percent = getPercent(height, width); image.setAlignment(Image.MIDDLE); image.scalePercent(percent); doc.add(image); doc.close(); File pdfFile = new File(pdfFileName); return pdfFile; } /** * * 用于下載PDF文件 * * @param pdfFile PDF文件 * @param response HttpServletResponse * @throws IOException IO異常 */ private static void downloadPdfFile(File pdfFile, HttpServletResponse response) throws IOException { FileInputStream fis = new FileInputStream(pdfFile); byte[] bytes = new byte[fis.available()]; fis.read(bytes); fis.close(); response.reset(); response.setHeader("Content-Type", "application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(pdfFile.getName(), "UTF-8")); OutputStream out = response.getOutputStream(); out.write(bytes); out.flush(); out.close(); } /** * 等比壓縮,獲取壓縮百分比 * * @param height 圖片的高度 * @param weight 圖片的寬度 * @return 壓縮百分比 */ private static int getPercent(float height, float weight) { float percent = 0.0F; if (height > weight) { percent = PageSize.A4.getHeight() / height * 100; } else { percent = PageSize.A4.getWidth() / weight * 100; } return Math.round(percent); } }
頁面效果
這就是系統(tǒng)啟動之后的頁面效果,雖然頁面比較簡陋,但是功能卻沒有任何折扣,有興趣或者有需要的同學可以自己搭建一下,試一試圖片轉(zhuǎn)換PDF文件的效果。
注意:作者自己測試了一下,普通圖片基本是沒有問題的,但是遇到一些特殊的圖片可能會出現(xiàn)異常,畢竟只是一個比較簡單的圖片轉(zhuǎn)換PDF系統(tǒng),難以兼容所有圖片。
到此這篇關(guān)于Java實現(xiàn)圖片轉(zhuǎn)換PDF文件的示例代碼的文章就介紹到這了,更多相關(guān)Java 圖片轉(zhuǎn)換PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Dubbo在Spring和Spring Boot中的使用詳解
這篇文章主要介紹了Dubbo在Spring和Spring Boot中的使用詳解,需要的朋友可以參考下2017-10-10java web中的servlet3 upload上傳文件實踐
這篇文章主要介紹了servlet3 upload上傳文件實踐,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11Java多線程編程中易混淆的3個關(guān)鍵字總結(jié)
這篇文章主要介紹了Java多線程編程中易混淆的3個關(guān)鍵字總結(jié),本文總結(jié)了、volatile、ThreadLocal、synchronized等3個關(guān)鍵字,對這幾個容易混淆概念的關(guān)鍵字分別做了講解,需要的朋友可以參考下2015-03-03Java thrift服務(wù)器和客戶端創(chuàng)建實例代碼
Thrift是一個軟件框架,用來進行可擴展且跨語言的服務(wù)的開發(fā)。接下來通過本文給大家介紹Java thrift服務(wù)器和客戶端創(chuàng)建實例代碼,需要的朋友參考下吧2017-04-04Springboot?異步任務(wù)和定時任務(wù)的異步處理
本文介紹了Springboot異步任務(wù)和定時任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時任務(wù)是經(jīng)常遇到的處理問題方式,為了能夠用好這兩項配置,不干擾正常的業(yè)務(wù),需要對其進行異步化配置。怎么設(shè)置合理的異步處理線程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下2022-05-05JDBC數(shù)據(jù)源連接池配置及應(yīng)用
這篇文章主要介紹JDBC建立數(shù)據(jù)庫連接的兩種方式,使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,效率更高,推薦使用,希望能給大家做一個參考。2016-06-06