在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文件,轉換過程可能比較耗時,可以考慮使用異步處理或任務隊列。