java實現圖片轉pdf,并通過流的方式進行下載(前后端分離)

首先需要導入相關依賴,由于具體依賴本人也不是記得很清楚了,所以簡短的說一下。

  1. iText:PDF 操作庫,用于創建和操作 PDF 文件。可通過 Maven 或 Gradle 引入 iText 依賴。

  2. MultipartFile:Spring 框架中處理文件上傳的類。通常用于接收前端上傳的文件數據。

  3. HttpServletRequest:Java Servlet API 中的類,用于獲取 HTTP 請求的相關信息,如請求方式、參數等。

  4. BufferedImage:Java 中用于表示圖像的類,通常與 ImageIO 結合使用來讀取圖片文件。

  5. ByteArrayOutputStream:Java 中的字節數組輸出流,用于將數據寫入到字節數組中。

  6. DocumentPdfWriter:iText 庫中的類,分別用于創建 PDF 文檔和寫入 PDF 文件。

  7. Image:iText 庫中的類,用于處理圖像,并將圖像添加到 PDF 文檔中。

  8. Rectangle:iText 庫中的類,用于表示 PDF 頁面的大小。

 <!--ITextPdf,操作PDF文件的工具類--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.2</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.0.3</version></dependency>

以上提供一些依賴,是需要用到的,然后在application.yml中添加以下配置:

web:upload-path: E:/PictureTool/resources:static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
  • 配置web.upload-path為與項目代碼分離的靜態資源路徑,即:文件上傳保存根路徑
  • 配置spring.resources.static-locations,除了帶上Spring Boot默認的靜態資源路徑之外,加上file:${web.upload-path}指向外部的文件資源上傳路徑。該路徑下的靜態資源可以直接對外提供HTTP訪問服務。

然后就需要寫具體的實現邏輯了:

 public R imgToPdf(MultipartFile file, HttpServletRequest request) {// 獲取文件在服務器上的存儲路徑String imagePath = getFilePath(file);// 獲取文件名,去掉文件擴展名String filename = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));// 將文件名賦值給成員變量FileNameFileName = filename;try {// 使用ImageIO讀取文件內容,轉換為BufferedImage對象BufferedImage img = ImageIO.read(new File(imagePath));// 創建一個ByteArrayOutputStream對象,用于存儲轉換后的PDF文件ByteArrayOutputStream baos = new ByteArrayOutputStream();// 創建一個Document對象,用于存儲PDF文檔Document doc = new Document();// 創建一個PdfWriter對象,用于將BufferedImage對象轉換為PDF文件PdfWriter.getInstance(doc, new FileOutputStream(uploadPath + filename + ".pdf"));// 存儲PDF文件的路徑FilePath = uploadPath + filename + ".pdf";System.out.println(uploadPath + filename + ".pdf");// 打開文檔doc.open();// 將BufferedImage對象添加到PDF文檔中Image image = Image.getInstance(imagePath);// 設置文檔的頁面大小為BufferedImage的大小doc.setPageSize(new Rectangle(img.getWidth(), img.getHeight()));// 將BufferedImage對象添加到PDF文檔的第一個頁面doc.add(image);// 關閉文檔doc.close();// 調用addUserOperation方法,記錄用戶操作boolean re = addUserOperation(file, "pdf", 1, request);System.out.println("轉換成功,re為" + re);// 獲取PDF文件的下載鏈接String downloadLink = request.getScheme() + "://" + request.getServerName() + ":" +request.getServerPort() + request.getContextPath() + "/pictureTool/" + filename + ".pdf";// 返回PDF文件的下載鏈接return R.Success("圖片轉pdf轉換成功", downloadLink);} catch (Exception e) {// 如果轉換失敗,記錄用戶操作e.printStackTrace();boolean re = addUserOperation(file, "pdf", 0, request);System.out.println("轉換失敗,re為" + re);// 返回錯誤信息return R.Failed(500, "圖片轉換失敗");}}

以上代碼接受一個文件,然后進行轉換為pdf并保存在本地指定的文件夾中,接下來使用輸出流的方式進行文件下載。

 public R downloadFile(HttpServletRequest request, HttpServletResponse response)throws IOException {// 獲取文件路徑和文件名String filePath = FilePath;String fileName = FileName;// 設置響應頭,指定下載文件的名稱response.setHeader("Content-Disposition","attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));try {// 打開文件File file = new File(filePath);FileInputStream fileInputStream = new FileInputStream(file);// 讀取文件內容到字節數組byte[] fileByte = new byte[(int) file.length()];ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len;while ((len = fileInputStream.read(bytes, 0, bytes.length)) != -1) {byteArrayOutputStream.write(bytes, 0, len);}byteArrayOutputStream.close();fileByte = byteArrayOutputStream.toByteArray();// 將文件內容寫入響應對象OutputStream outputStream = response.getOutputStream();outputStream.write(fileByte);outputStream.flush();outputStream.close();// 返回成功信息return R.Success("文件下載成功");} catch (Exception e) {// 如果下載失敗,返回失敗信息e.printStackTrace();return R.Failed("文件下載失敗");}}

其中R是我自定義的一個響應類,改成你自己的就可以了~

最后,記得放行你存放文件的盤符:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一臺工控機的能量

使用Docker搭建EPICS的IOC記錄 Zstack EPICS Archiver在小課題組的使用經驗 以前電子槍調試&#xff0c;用一臺工控機跑起束測后臺&#xff0c;這次新光源用的電子槍加工回來又是測試&#xff0c;又是用一臺工控機做起重復的事&#xff0c;不過生命在于折騰&#xff0c;重復的…

stm32——hal庫學習筆記(IIC)

一、IIC總線協議介紹&#xff08;掌握&#xff09; 二、AT24C02介紹&#xff08;了解&#xff09; 三、AT24C02讀寫時序&#xff08;掌握&#xff09; 四、AT24C02驅動步驟&#xff08;掌握&#xff09; 五、編程實戰&#xff08;掌握&#xff09; myiic.c #include "./B…

汽車虛擬仿真技術的實現、應用和未來

汽車虛擬仿真技術是一種利用計算機模擬汽車運行的技術&#xff0c;以實現對汽車行為的分析、評估和改進。汽車虛擬仿真技術是汽車工業中重要的開發設計和測試工具&#xff0c;可以大大縮短產品研發周期、降低研發成本和提高產品質量。本文將從汽車虛擬仿真技術的實現過程、應用…

Ubuntu18.04 系統上配置并運行SuperGluePretrainedNetwork(僅使用CPU)

SuperGlue是Magic Leap在CVPR 2020上展示的研究項目&#xff0c;它是一個圖神經網絡&#xff08;Graph Neural Network&#xff09;和最優匹配層&#xff08;Optimal Matching layer&#xff09;的結合&#xff0c;訓練用于對兩組稀疏圖像特征進行匹配。這個項目提供了PyTorch代…

前端的文字的字體應該如何設置

要設置文字的字體&#xff0c;在CSS中使用font-family屬性。這個屬性可以接受一個或多個字體名稱作為其值&#xff0c;瀏覽器會按照列表中的順序嘗試使用這些字體渲染文本。如果第一個字體不可用&#xff0c;瀏覽器會嘗試使用列表中的下一個字體&#xff0c;依此類推。 字體設…

iOS消息發送流程

Objc的方法調用基于消息發送機制。即Objc中的方法調用&#xff0c;在底層實際都是通過調用objc_msgSend方法向對象消息發送消息來實現的。在iOS中&#xff0c; 實例對象的方法主要存儲在類的方法列表中&#xff0c;類方法則是主要存儲在原類中。 向對象發送消息&#xff0c;核心…

推薦一個屏幕上鼠標高亮顯示的小工具

在視頻錄制等特定場景下&#xff0c;很多人希望在點擊鼠標時能夠在屏幕上及時進行顯示&#xff0c;便于別人發現&#xff0c;提高別人的注意力。 因此&#xff0c;很多錄屏軟件中都內含顯示鼠標點擊功能。那如果不支持該怎么辦呢&#xff1f;其實&#xff0c;也是可以通過其他工…

Python 實現Excel自動化辦公(上)

在Python 中你要針對某個對象進行操作&#xff0c;是需要安裝與其對應的第三方庫的&#xff0c;這里對于Excel 也不例外&#xff0c;它也有對應的第三方庫&#xff0c;即xlrd 庫。 什么是xlrd庫 Python 操作Excel 主要用到xlrd和xlwt這兩個庫&#xff0c;即xlrd是讀Excel &am…

算法刷題day20:二分系列

目錄 引言概念一、借教室二、分巧克力三、管道四、技能升級五、冶煉金屬六、數的范圍七、最佳牛圍欄 引言 這幾天一直在做二分的題&#xff0c;都是上了難度的題目&#xff0c;本來以為自己的二分水平已經非常熟悉了&#xff0c;沒想到還是糊涂了一兩天才重新想清楚&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩識別系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發口罩識別系統對于提升公共衛生安全和疫情防控具有重要意義。本篇博客詳細介紹了如何利用深度學習構建一個口罩識別系統&#xff0c;并提供了完整的實現代碼。該系統基于強大的YOLOv8算法&#xff0c;并結合了YOLOv7、YOLOv6、YOLOv5的對比&#xff0c;給出…

Linux:syslog()的使用和示例

man手冊 命令行man openlog即可查看;寫的非常詳細&#xff0c;看完其實就懂了。 NAME closelog, openlog, syslog, vsyslog - send messages to the system logger SYNOPSIS #include <syslog.h> void openlog(const char *ident, int option, int facili…

刷題筆記day27-回溯算法2

216. 組合總和 III 這個思路還是&#xff0c;三部曲&#xff1a; 終止條件處理單層節點回溯節點 題中說的是&#xff0c;1到9的數&#xff0c;不能有重復。 k個數&#xff0c;和為n。 那么只要 len(path) k 的時候&#xff0c;判斷 n 為0&#xff0c;就可以入切片了。 fun…

如何更好的引導大語言模型進行編程的高效開發流程?

這張圖片展示了一種如何更好地引導大語言模型進行編程的方法。 首先&#xff0c;最簡單也是最有效的方法是讓大語言模型重復運行多次&#xff0c;每次增加一些額外的信息&#xff0c;直到獲得想要的結果。這種方法雖然簡單&#xff0c;但可能需要多次嘗試才能得到滿意的結果。…

2024綠色能源、城市規劃與環境國際會議(ICGESCE 2024)

2024綠色能源、城市規劃與環境國際會議(ICGESCE 2024) 一、【會議簡介】 隨著全球氣候變化和環境問題日益嚴重&#xff0c;綠色能源和可持續發展已成為全球關注的焦點。本次會議旨在匯聚全球在綠色能源、城市規劃與環境領域的專家、學者和實踐者&#xff0c;共同探討和分享關于…

Vue.js大師: 構建動態Web應用的全面指南

VUE ECMAScript介紹什么是ECMAScriptECMAScript 和 JavaScript 的關系ECMAScript 6 簡介 ES6新特性let基本使用const不定參數箭頭函數對象簡寫模塊化導出導入a.jsb.jsmain.js Vue簡介MVVM 模式的實現者——雙向數據綁定模式 Vue環境搭建在頁面引入vue的js文件即可。創建div元素…

1、jQuery介紹、css()、選擇器、事件、動畫

一、jQuery介紹&#xff1f; 1、什么是jQuery&#xff1f; 是一個JavaScript函數庫 2、jQuery特點 寫的少&#xff0c;做的多 3、jQuery的安裝 直接下載引入 <script src"jquery-1.10.2.min.js"></script>通過cdn引入 <script src"https…

python自動化之項目架構搭建與思路講解(第二天)

1.自動化測試的概念 自動化測試是指使用自動化工具和腳本來執行測試任務,以驗證軟件或系統的正確性和穩定性。它可以提高測試的效率和準確性,并節約時間和成本。 2.自動化腳本編寫的思路 xmind文檔如有需要,可在資源里自行下載 3.項目代碼工程創建 lib :基本代碼庫包 …

[滲透教程]-013-嗅探工具-wireshark操作

文章目錄 tor下載wireshark抓包類型啟動場景實戰tor下載 tor下載鏈接 zlibary暗網地址 2681506@gmail.com YanErrol123@wireshark Wireshark是網絡封包分析軟件,可以抓包.可以 使用winpcap與網卡直接進行數據交換.作用: 網絡管理員使用wireshark來檢測網絡問題,網絡工程師使用…

瑞_Redis_Redis命令

文章目錄 1 Redis命令Redis數據結構Redis 的 key 的層級結構1.0 Redis通用命令1.0.1 KEYS1.0.2 DEL1.0.3 EXISTS1.0.4 EXPIRE1.0.5 TTL 1.1 String類型1.1.0 String類型的常見命令1.1.1 SET 和 GET1.1.2 MSET 和 MGET1.1.3 INCR和INCRBY和DECY1.1.4 SETNX1.1.5 SETEX 1.2 Hash類…

Android 12.0 framework關于systemUI定制之導航欄透明背景的功能實現

1.概述 在12.0的系統rom產品定制化開發中,在對于系統原生SystemUI的導航欄背景在沉浸式導航欄的 情況下默認是會隨著背景顏色的變化而改變的,在一些特定背景下導航欄的背景也是會改變的,所以由于產品開發需要 要求需要設置導航欄背景為透明的,所以就需要在Activity創建的時…