当前位置: 首页 > news >正文

在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文件,转换过程可能比较耗时,可以考虑使用异步处理或任务队列。

相关文章:

  • 路由交换网络专题 | 第八章 | GVRP配置 | 端口安全 | 端口隔离 | Mux-VLAN | Hybrid
  • 数字孪生:从概念验证到产业革命的十年征程
  • 【Castle-X机器人】三、紫外消杀模块安装与调试
  • 前端节流、防抖函数
  • LVGL模拟器:NXP GUIDER+VSCODE
  • 深度学习-学习笔记
  • 字节跳动开源数字人模型latentsync1.5,性能、质量进一步优化~
  • 同世堂:让中医梦想照进职业星河
  • 搭建基于火灾风险预测与防范的消防安全科普小程序
  • 华为OD机试真题——素数之积RSA加密算法(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • ‌MySQL 事务隔离级别详解
  • 【蓝桥杯省赛真题56】Scratch抓不住的蜜蜂 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • LiveCharts.WPF图表模块封装
  • 前端面试宝典---vue原理
  • arduino显示数码管1~9
  • 如何解决IDE项目启动报错 error:0308010C:digital envelope routines::unsupported 问题
  • 【SwitchyOmega安装教程】
  • 案例速成GO+redis 个人笔记
  • Llama factory如何全参数微调 Qwen2.5-7B-Instruct 模型并导入Ollama推理(详细版)
  • spark总结
  • 第二艘国产大型邮轮实现坞内起浮,重点强化邮轮供应链本土化建设
  • 外交部回应涉长江和记出售巴拿马运河港口交易:望有关各方审慎行事,充分沟通
  • 李祥翔评《孔子哲学思微》︱理性秩序与美学秩序的碰撞
  • 2025年“畅游江淮 合肥等侬”文旅推介会在沪成功举办
  • 大家聊中国式现代化|周冯琦:转角见美,让“绿意”触手可及
  • 新华时评·首季中国经济观察丨用好用足更加积极的财政政策