在Spring Boot項目中實現Word轉PDF并預覽

在Spring Boot項目中實現Word轉PDF并進行前端網頁預覽,你可以使用Apache POI來讀取Word文件,iText或Apache PDFBox來生成PDF文件,然后通過Spring Boot控制器提供文件下載或預覽鏈接。以下是一個示例實現步驟和代碼:

1. 添加依賴

pom.xml中添加必要的依賴:

<dependencies><!-- Spring Boot Web 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Apache POI 用于處理 Word 文件 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><!-- iText 用于生成 PDF 文件 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.15</version></dependency><!-- 或者使用 Apache PDFBox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version></dependency>
</dependencies>

2. 創建服務類

創建一個服務類來處理Word到PDF的轉換:

import org.apache.poi.xwpf.usermodel.*;
import org.springframework.stereotype.Service;import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;@Service
public class WordToPdfService {public File convertWordToPdf(File wordFile, String outputPdfPath) throws IOException {XWPFDocument document = new XWPFDocument(new FileInputStream(wordFile));File pdfFile = new File(outputPdfPath);FileOutputStream out = new FileOutputStream(pdfFile);// 使用 iText 或 PDFBox 進行轉換// 這里只是一個示例,實際轉換邏輯需要根據所選庫進行實現// 例如使用 iText 7 的代碼:com.itextpdf.kernel.pdf.PdfWriter pdfWriter = new com.itextpdf.kernel.pdf.PdfWriter(out);com.itextpdf.layout.Document pdfDocument = new com.itextpdf.layout.Document(pdfWriter);for (XWPFParagraph paragraph : document.getParagraphs()) {pdfDocument.add(new com.itextpdf.layout.element.Paragraph(paragraph.getText()));}pdfDocument.close();return pdfFile;}
}

3. 創建控制器

創建一個控制器來處理文件上傳和轉換請求:

import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;@RestController
@RequestMapping("/api")
public class WordToPdfController {private final WordToPdfService wordToPdfService;private final Path uploadDir = Paths.get("uploads");public WordToPdfController(WordToPdfService wordToPdfService) {this.wordToPdfService = wordToPdfService;// 創建上傳目錄uploadDir.toFile().mkdirs();}@PostMapping("/convert")public ResponseEntity<?> convertWordToPdf(@RequestParam("file") MultipartFile file) throws IOException {// 保存上傳的 Word 文件Path wordFilePath = uploadDir.resolve(file.getOriginalFilename());Files.copy(file.getInputStream(), wordFilePath);// 轉換為 PDFString pdfFileName = file.getOriginalFilename().replace(".docx", ".pdf");File pdfFile = wordToPdfService.convertWordToPdf(wordFilePath.toFile(), uploadDir.resolve(pdfFileName).toString());// 返回 PDF 預覽鏈接String pdfUrl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/api/download/").path(pdfFileName).toUriString();return ResponseEntity.ok().body("PDF 文件已生成,可以通過以下鏈接預覽: <a href=\"" + pdfUrl + "\">預覽 PDF</a>");}@GetMapping("/download/{fileName}")public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws IOException {Path pdfPath = uploadDir.resolve(fileName);Resource resource = new UrlResource(pdfPath.toUri());return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").body(resource);}
}

4. 前端實現

在前端,你可以使用HTML表單上傳Word文件并顯示PDF預覽鏈接:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Word to PDF Converter</title>
</head>
<body><h1>Word to PDF Converter</h1><form id="uploadForm" enctype="multipart/form-data"><input type="file" name="file" accept=".docx" required><button type="submit">Convert to PDF</button></form><div id="result"></div><script>document.getElementById('uploadForm').addEventListener('submit', function(e) {e.preventDefault();const formData = new FormData(this);fetch('/api/convert', {method: 'POST',body: formData}).then(response => response.text()).then(data => {document.getElementById('result').innerHTML = data;}).catch(error => {console.error('Error:', error);});});</script>
</body>
</html>

5. 注意事項

以上代碼提供了一個基本的實現框架,你可以根據具體需求進行調整和擴展。

  • 文件存儲:目前示例代碼將上傳的Word文件和生成的PDF文件存儲在項目根目錄下的uploads文件夾中。在實際生產環境中,你可能需要配置持久化存儲或云存儲服務。

  • 文件大小限制:Spring Boot默認有文件上傳大小限制,你可以在application.properties中配置:

    spring.servlet.multipart.max-file-size=10MB
    spring.servlet.multipart.max-request-size=10MB

  • 安全性:在實際應用中,應增加文件類型驗證、防止目錄遍歷攻擊等安全措施。

  • 性能優化:對于較大的Word文件,轉換過程可能比較耗時,可以考慮使用異步處理或任務隊列。

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

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

相關文章

圖解 Redis 事務 ACID特性 |源碼解析|EXEC、WATCH、QUEUE

寫在前面 Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務功能。Redis的事務是將多個命令請求打包&#xff0c;然后一次性、按照順序的執行多個命令的機制&#xff0c;并且在事務執行期間&#xff0c;服務器不會中斷事務而該去執行其他客戶端的命令請求。 就像下面這樣&#…

LeetCode --- 446 周賽

題目列表 3522. 執行指令后的得分 3523. 非遞減數組的最大長度 3524. 求出數組的 X 值 I 3525. 求出數組的 X 值 II 一、執行指令后的得分 照著題目要求進行模擬即可&#xff0c;代碼如下 // C class Solution { public:long long calculateScore(vector<string>&…

山東大學軟件學院項目實訓-基于大模型的模擬面試系統-前端美化滾動條問題

模擬面試界面左側底部 通過檢查工具定位到其所在的位置&#xff1a; 直接對該組件進行美化&#xff1a; <!-- AI面試官列表 --><div class"ai-interviewer-section" v-show"activeTab interviewer"><el-scrollbar class"no-horizont…

git版本回退 | 遠程倉庫的回退 (附實戰Demo)

目錄 前言1. 基本知識2. Demo3. 彩蛋 前言 &#x1f91f; 找工作&#xff0c;來萬碼優才&#xff1a;&#x1f449; #小程序://萬碼優才/r6rqmzDaXpYkJZF 爬蟲神器&#xff0c;無代碼爬取&#xff0c;就來&#xff1a;bright.cn 本身暫存區有多個文件&#xff0c;但手快了&…

什么事Nginx,及使用Nginx部署vue項目(非服務器Nginx壓縮包版)

什么是 Nginx? Nginx(發音為 “engine-x”)是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。它以其高性能、高并發處理能力和低資源消耗而聞名。以下是 Nginx 的主要特性和用途: 主要特性 高性能和高并發 Nginx 能夠處理大量并發連接,適合高…

第十六周藍橋杯2025網絡安全賽道

因為只會web&#xff0c;其他方向都沒碰過&#xff0c;所以只出了4道 做出來的&#xff1a; ezEvtx 找到一個被移動的文件&#xff0c;疑似被入侵 提交flag{confidential.docx}成功解出 flag{confidential.docx} Flowzip 過濾器搜索flag找到flag flag{c6db63e6-6459-4e75-…

高性能的開源網絡入侵檢測和防御引擎:Suricata介紹

一、Debian下使用Suricata 相較于Windows&#xff0c;Linux環境對Suricata的支持更加完善&#xff0c;操作也更為便捷。 1. 安裝 Suricata 在Debian系統上&#xff0c;你可以通過包管理器 apt 輕松安裝 Suricata。 更新軟件包列表: sudo apt update安裝 Suricata: sudo apt …

IP-address-space

導航 (返回頂部) 1. IPv4地址分配表 1.2 IPv4 專用地址注冊表1.3 各國IPv4地址分配列表 2. IPv6地址分配表 2.1 IANA IPv6 專用地址注冊表2.2 IPv6 多播地址分配 1. IPv4地址分配表1.2 IPv4 專用地址注冊表1.3 各國IPv4地址分配列表 2. IPv6地址分配表2.1 IANA IPv6 專用地址…

Ubuntu使用war包部署Jenkins并通過systemcl管理

目錄 一、當前系統環境 二、安裝Java 二、安裝Jenkins 三、使用systemctl管理 一、當前系統環境 操作系統&#xff1a;ubuntu 24.04 Jenkins版本&#xff1a;2.506 格式&#xff1a;war JDK版本&#xff1a;OpenJDK_17 二、安裝Java 1.下載jdk安裝包 # wget下載 wget …

牛客 verilog入門 VIP

1、輸出1 答案&#xff1a; timescale 1ns/1nsmodule top_module(output wire one );assign one 1b1; endmodule 2、wire連線 答案&#xff1a; timescale 1ns/1nsmodule wire0(input wire in0,output wire out1 );assign out1 in0; endmodule 3、多wire連線 timescale 1…

簡易版2D我的世界C++程序(有點BUG,但是可以玩!!!)

1、按空格鍵來切換模式&#xff08;挖掘模式和放置模式&#xff09;&#xff0c;一律用鼠標右鍵來操作&#xff01;&#xff01;&#xff01; 2、按數字1和2鍵來切換放置的方塊&#xff08;1是草&#xff0c;2是木&#xff09;&#xff0c;樹葉不能放置&#xff01;&#xff01…

ubuntu使用dify源碼安裝部署教程+避坑指南

很多人,包括我在最初使用dify的時候都習慣使用docker來部署安裝環境,但在二次開發使用過程中,我們可能希望使用源碼來安裝,那么這篇文章我將給大家分享如何在ubuntu系統下使用源碼安裝,并提供大家遇到的疑難雜癥如下: dify安裝使用過程中報錯:/console/api/workspaces/…

java知識體系結構導航

很全&#xff1a;java知識體系結構 個人筆記鏈接 開發工具IDEA IDEA 插件推薦清單 IDEA快捷鍵大全 Java基礎難點 基礎知識_java動態代理 基礎知識_java反射機制 基礎知識-java流steam 基礎知識-java集合collection Spring 01.Spring 框架的演化&#xff1a;從 XML 配置到…

RabbitMQ 的專業術語

術語定義示例/說明生產者&#xff08;Producer&#xff09;發送消息到 RabbitMQ 的客戶端應用程序。日志系統將錯誤信息發送到 RabbitMQ。消費者&#xff08;Consumer&#xff09;從 RabbitMQ 隊列中接收并處理消息的客戶端應用程序。一個訂單處理服務從隊列中讀取消息并更新數…

mac安裝vm虛擬機安裝包

因為mac安裝虛擬機時&#xff0c;發現下載過程變得不太一樣&#xff0c;會比較麻煩。所以決定發一下我已經下載的安裝包&#xff0c;個人用戶使用免費&#xff0c;商業版請自行去官網下載&#xff01; 百度網盤下載鏈接 百度網盤 請輸入提取碼 提取碼:d4rc

LLama Factory從入門到放棄

目錄 簡介 安裝 LLama Factory界面介紹 數據格式要求 微調訓練 今天在這里介紹一種常用的大模型微調框架——LLama Factory。 簡介 LLama Factory 是一個高效的界面化大語言模型微調工具庫&#xff0c;支持多種參數高效微調技術&#xff0c;提供簡潔接口和豐富示例&#…

如何借助全球動態IP實現多平臺賬號的批量注冊?

無論是社交網絡、在線購物平臺還是專業應用軟件&#xff0c;賬號的創建和使用都是必不可少的。然而&#xff0c;在面對不同平臺各自的注冊限制和策略時&#xff0c;如何高效、安全且合法地進行賬號批量注冊成為了亟待解決的問題。本文將探討全球動態IP在這一過程中的作用及其如…

django admin 添加自定義頁面

在Django中&#xff0c;你可以通過多種方式向Django Admin添加自定義頁面。以下是一些常見的方法&#xff1a; 方法1&#xff1a;使用ModelAdmin的get_urls()方法 如果你只是想添加一個簡單的頁面來展示信息&#xff0c;你可以在你的ModelAdmin類中重寫get_urls()方法。 from…

Docker容器持久化

引言 Docker 容器作為一種輕量級、可移植的虛擬化技術&#xff0c;廣泛應用于開發、測試和生產環境中。然而&#xff0c;容器天生是短暫的&#xff0c;意味著它們在生命周期結束后會被銷毀&#xff0c;而其中的數據也會隨之丟失。為了確保容器中的數據能夠持久化&#xff0c;我…

ShaderToy學習筆記 02.圓

1. 畫圓 1.1. 圓的方程 圓的方程是&#xff1a;(x^2 y^2 r^2)&#xff0c;其中(r)是圓的半徑。 我們可以使用 desmos 來驗證一下。 輸入 x^2 y^2 -10&#xff0c;即可得到圓。 類似下圖 1.2. 畫圓的方式 畫圓&#xff1a;使用圓的方程&#xff0c;判斷每個像素點是否在圓…