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

springboot Apache PDFBox 通过路径参数读取文件信息流,并转化为pdf 在网页预览

实现要点说明:
通过@PathVariable接收文件路径参数,动态读取指定文件
使用PDFBox创建PDF文档对象并添加内容流
设置响应头为application/pdf和inline模式实现浏览器直接预览
通过ByteArrayOutputStream将PDF转换为字节数组返回
添加中文字体支持依赖确保中文内容正常显示
使用方式:
启动应用后访问:http://localhost:8080/api/pdf/preview/文件路径
浏览器将自动加载PDF预览界面
支持任意文本文件转换为PDF预览
pom.xml 添加配置

<dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- PDFBox核心库 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.29</version></dependency><!-- 中文字体支持 --><dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.30</version></dependency>
</dependencies>

编写controller

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.*;
import java.nio.file.Files;@RestController
@RequestMapping("/api/pdf")
public class PdfController {@GetMapping("/preview/{filePath:.+}")public ResponseEntity<byte[]> previewPdf(@PathVariable String filePath) throws IOException {File file = new File(filePath);if (!file.exists()) {throw new FileNotFoundException("文件不存在");}try (PDDocument document = new PDDocument()) {PDPage page = new PDPage();document.addPage(page);// 读取文件内容并写入PDFtry (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);contentStream.beginText();contentStream.newLineAtOffset(100, 700);contentStream.showText("文件内容预览: " + file.getName());contentStream.newLineAtOffset(0, -20);// 读取文件内容String content = new String(Files.readAllBytes(file.toPath()));contentStream.showText(content.substring(0, Math.min(content.length(), 1000)));contentStream.endText();}ByteArrayOutputStream outputStream = new ByteArrayOutputStream();document.save(outputStream);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_PDF);headers.setContentDispositionFormData("inline", "preview.pdf");return ResponseEntity.ok().headers(headers).body(outputStream.toByteArray());}}
}

配置文件里面添加:
application.properties

# 允许访问静态资源
spring.mvc.static-path-pattern=/**
spring.web.resources.static-locations=classpath:/static/# 文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
http://www.dtcms.com/a/355100.html

相关文章:

  • 云计算学习100天-第31天
  • vue table 甘特图 vxe-gantt 实现多个表格的任务互相拖拽数据
  • GitHub 热榜项目 - 日榜(2025-08-28)
  • 鸿蒙banner页实现
  • Docker从零学习系列之Docker是什么?
  • Java有几种文件拷贝方式,哪一种效率最高?
  • 【DAB收音机】DAB 信号发生器介绍
  • 从零入门:C 语言操作 MySQL 数据库的完整指南
  • 多模态大模型研究每日简报【2025-08-28】
  • Logstash数据迁移之es-to-kafka.conf详细配置
  • 5G核心网的架构和功能详解
  • 大模型微调技术
  • 自下而上的树形dp
  • Servlet 注解:简化配置的完整指南
  • 隐语Kuscia正式发布 1.0.0 版本,实现支持 Hive 数据源,支持 envoy 日志进行异常分析等功能
  • hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算
  • hive on tez为什么写表时,要写临时文件到hdfs目录
  • 最长连续序列,leetCode热题100,C++实现
  • 解读 AUTOSAR AP R24-11 Manifest 规范 —— 从部署到安全的全流程支撑
  • 可拖拽指令
  • Xray与XPOC工具对比分析
  • 让企业资产管理高效透明——深度解析固定资产管理系统的功能、优势与价值
  • HBase Compaction HFile 可见性和并发安全性分析
  • Docker-compose离线安装
  • 【Canvas与盾牌】“靡不有初,鲜克有终”黄竖条盾牌
  • [ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景
  • 微硕WINSOK高性能MOS管WSF80P04,助力充电宝效能与安全升级
  • 在IAR Embedded Workbench for Arm中实现Infineon TRAVEO™ T2G安全调试
  • 舆情监测系统有哪些功能
  • 省市区三级联动选择器-组件