Springboot实现doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频在线预览功能,你学“废”了吗?

最近工作中,客户需要生成包含动态内容的word/pdf报告,并且需要在线预览。

刚开始使用后台直接生成word文档,返回文件流给前端,浏览器预览会发生格式错乱问题,特别是文档中的图片有些还不显示。

想到最简单的办法就是后台将docx转换成pdf,前端预览一般就不会出问题。技术栈使用的是java,springboot那一套,所以调研了网上java文件预览相关的技术方案。比较主流的方案有以下几种:

1、Apache POI + Freemarker 或 Thymeleaf

这个算是最底层,最原始的实现方式,可以自定义模板和布局。

示例代码:

    // 加载模板Configuration cfg = new Configuration(Configuration.VERSION_2_3_29);cfg.setClassForTemplateLoading(MyClass.class, "/templates");Template template = cfg.getTemplate("template.ftl");// 数据模型Map<String, Object> dataModel = new HashMap<>();dataModel.put("title", "Report Title");dataModel.put("content", "Report content...");// 渲染模板到字符串StringWriter writer = new StringWriter();template.process(dataModel, writer);// 创建Word文档XWPFDocument document = new XWPFDocument();// 添加内容XWPFParagraph paragraph = document.createParagraph();XWPFRun run = paragraph.createRun();run.setText(writer.toString());// 保存FileOutputStream out = new FileOutputStream("report.docx");document.write(out);out.close();

缺点:使用起来很麻烦,需要熟悉大量API,自己搞定布局和样式,工作量太大

2、Aspose.Words for Java

这个应该是业界功能最强大的类库,有丰富的api和文档,可以轻松地将Word文档转换为PDF或HTML等格式。

示例代码,将docx文档转为pdf:

    private static File docx2Pdf(Long evaluateLogId, File wordFile) throws Exception {File tempPdf = createTempFile(evaluateLogId + "_final", ".pdf");try (ByteArrayInputStream docxIn = new ByteArrayInputStream(FileUtil.readBytes(wordFile))) {String name = "report_" + evaluateLogId + ".pdf";log.info("开始(docx to pdf)转换: {}", name);// 设置许可证License license = new License();license.setLicense("Aspose.Words.License");Document doc = new Document(docxIn);BuiltInDocumentProperties properties = doc.getBuiltInDocumentProperties();// 设置作者properties.setAuthor("xxx");doc.getWatermark().remove();doc.acceptAllRevisions();try (FileOutputStream os = new FileOutputStream(tempPdf)) {doc.save(os, SaveFormat.PDF);}log.info("转换完成: {}", name);}return tempPdf;}

上面代码是我使用的网上找的破解版本,需要设置许可证,可以正常转换,没有水印啥的。

需要破解包,可以扫码关注我回复 240813 aspose-words

但是,由于系统字体问题,再某些环境下可能有中文乱码问题,我在某一台开发服务器,ububtu系统,按照网上说法。加入中文字体,各种设置最后还是没有解决,时间紧任务重,后面也没有再试了,应该是字体相关配置问题。

缺点:功能要收费

3、Jodconverter  + LibreOffice/OpenOffice

jodconverter 是一个 Java 库,用于转换 OpenDocument 和 Microsoft Office 文档格式。它通过与 LibreOffice 或 Apache OpenOffice 连接来完成这些任务。jodconverter 可以在 Java 应用程序中实现自动化文档转换的功能,而无需用户交互。

jodconverter提供了两种模式调用底层Office库:

本地模式(Local Mode)

即在本地直接启动一个 LibreOffice 或 Apache OpenOffice 的实例来进行文档转换,每次转换都需要启动一个新的 LibreOffice 实例,比较耗资源,适合低到中等并发的应用场景。

如果要实现这种模式,需要修改dockerfile,将LibreOffice/OpenOffice集成到自己的应用中,随着容器启动,需要将Office的服务也以无头模式启动起来。

示例如下:

# 使用官方的 Java 运行时作为基础镜像
FROM openjdk:11-jdk-slim# 设置工作目录
WORKDIR /app# 将应用的 jar 包复制到容器中
COPY target/my-app.jar my-app.jar# 下载 LibreOffice
RUN apt-get update && \apt-get install -y wget && \wget https://download.documentfoundation.org/libreoffice/stable/7.4/deb/x86_64/LibreOffice_7.4.2_Linux_x86-64_deb.tar.gz && \tar xzf LibreOffice_7.4.2_Linux_x86-64_deb.tar.gz && \
cd libreoffice* && \dpkg -i *.deb && \rm -rf /app/libreoffice* && \apt-get clean && \rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*# 设置 LibreOffice 无头模式启动命令
RUN echo 'export DISPLAY=:99' >> /etc/environment && \
echo 'export XAUTHORITY=/root/.Xauthority' >> /etc/environment && \
echo 'export HOME=/root' >> /etc/environment && \mkdir -p /root/.local/share/applications && \
echo "[Desktop Entry]" > /root/.local/share/applications/libreoffice-soffice.desktop && \
echo "Name=LibreOffice (soffice)" >> /root/.local/share/applications/libreoffice-soffice.desktop && \
echo "Exec=/usr/bin/soffice --headless --invisible --nologo --nodefaultfirst --norestore --nocrashreport --nofirststartwizard --accept='socket,host=localhost,port=2002;urp;StarOffice.ServiceManager'" >> /root/.local/share/applications/libreoffice-soffice.desktop && \
echo "Type=Application" >> /root/.local/share/applications/libreoffice-soffice.desktop && \
echo "MimeType=application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;" >> /root/.local/share/applications/libreoffice-soffice.desktop# 启动 LibreOffice 服务
CMD ["/usr/bin/soffice", "--headless", "--invisible", "--nologo", "--nodefaultfirst", "--norestore", "--nocrashreport", "--nofirststartwizard", "--accept='socket,host=localhost,port=2002;urp;StarOffice.ServiceManager'"] && java -jar my-app.jar

使用代码示例:

public static void main(String[] args) {
8        // 创建 OfficeManager 实例
9        OfficeManager officeManager = new DefaultOfficeManagerBuilder()
10                .officeHome("/path/to/libreoffice") // 指定 LibreOffice 安装路径
11                .build();
12
13        // 启动 OfficeManager
14        officeManager.start();
15
16        try {
17            // 创建 PdfConverter
18            PdfConverter pdfConverter = new PdfConverter(officeManager);
19
20            // 指定源文件和目标文件
21            File source = new File("path/to/source.docx");
22            File target = new File("path/to/target.pdf");
23
24            // 转换文档
25            pdfConverter.convert(source, target);
26
27            System.out.println("Conversion completed.");
28        } catch (Exception e) {
29            e.printStackTrace();
30        } finally {
31            // 停止 OfficeManager
32            officeManager.stop();
33        }
34    }

缺点:jodconverter只是一个基础的中间库,底层依赖于LibreOffice/OpenOffice完成文档转换,配置麻烦

4、kkfileview

上面的方案都太麻烦,在网上找了好久,终于,kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等。

底层原理 还是基于LibreOffice或OpenOffice,只不过kkfileview帮我们封装好了调用逻辑。

详细介绍,及使用文档,请参考官网地址:https://kkfileview.keking.cn/zh-cn/index.html


# 网络环境方便访问docker中央仓库
docker pull keking/kkfileview:4.1.0# 网络环境不方便访问docker中央仓库
wget https://kkfileview.keking.cn/kkFileView-4.1.0-docker.tar
docker load -i kkFileView-4.1.0-docker.tar
docker run -it -p 8012:8012 keking/kkfileview:4.1.0

项目接入使用

后端返回文件流:

@GetMapping("export-word")@Parameter(name = "id", description = "编号", required = true, example = "1")public void exportToWord(@RequestParam("id") Long id, HttpServletResponse response) throws Exception {wordReportService.exportToWord(id, response);}
    @Overridepublic void exportToWord(Long id, HttpServletResponse response) {try {File doc = generateTmpDoc(id);response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Pragma", "No-cache");ServletUtils.writeAttachment(response, "report.docx", FileUtil.readBytes(doc));FileUtils.deleteQuietly(doc);} catch (Exception e) {log.error(e.getMessage(), e);throw ServiceExceptionUtil.exception(GlobalErrorCodeConstants.UNKNOWN);}}

写一段js脚本测试一下: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>在线预览文件</title><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script><script>document.addEventListener("DOMContentLoaded", function () {var rand = Math.floor(Math.random() * 1000000)var originUrl = 'http://192.168.8.5:80/admin-api/evaluate/log/report-preview?id=80&rand=' + rand; // 要预览文件的访问地址var previewUrl = originUrl + '&fullfilename=report_' + rand + '.docx';window.open('http://192.168.8.7:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(previewUrl)));        });</script>
</head>
<body><h1>test</h1></body>
</html>

预览成功,搞定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403002.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

alibabacloud学习笔记13

微服务Docker镜像打包讲解 父项目怎么springboot版本依赖 每个子模块项目添加依赖 添加构建文件&#xff1a; 微服务Docker镜像打包整合JDK11 服务根目录创建dockerFile文件. dockerFile的内容。 构建镜像( 去到子模块pom文件下)&#xff1a; 要下载这个才能使用本地docker.…

Nginx--简介、安装、常用命令和配置文件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx简介 1、nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰…

RPC 和 HTTP 理解

网上充斥着各类类似于这样的文章&#xff1a;rpc 比 http 快了多少倍&#xff1f;既然有了 http&#xff0c;为什么还要用 rpc 调用等等。遇到这类文章&#xff0c;说明对 http 和 rpc 是由理解误区的。 这里再次重复强调一遍&#xff0c;通信协议不是 rpc 最重要的部分&#x…

【OpenCV 】插值的方法原理,图片缩放,矫正,边界填充

图像旋转 缩放 计算机中的图像是以数组的方式储存&#xff0c;每个位置储存了像素点的像素值。对图像进行旋转缩放&#xff0c;就是对数组进行操作&#xff0c;乘以对应的矩阵&#xff0c;进行空间变换&#xff0c;而矩阵的行列式的值&#xff0c;就是缩放的倍数。 进行缩放旋…

Erupt 项目搭建

创建Spring Boot项目 Maven依赖 Spring Boot版本为 2.7.10&#xff0c;erupt版本为 1.12.14 erupt版本要与Spring Boot版本适配&#xff0c;3.x.x版本Spring Boot暂不适用说是 <properties><erupt.version>1.12.14</erupt.version></properties> <…

AR 眼镜之-开关机定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 开关机定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;开机 Logo 2&#xff09;开机音效 3&#xff09;开机动画 4&#xff09;关机动画 5&#xff09;关机弹窗 2. &#x1f4a0; 开机 Logo…

Java基础——注释

在开发中注释是必不可少的&#xff0c;帮助我们更好的标记阅读代码&#xff0c;下面介绍几种常用的注释方式。 一、注释种类 1. 单行注释 使用//一行代码来进行注释&#xff0c;只能注释一行内容 2. 多行注释 使用斜杠星号的方式 /*注释多行代码*/&#xff0c;注释多行代…

ECharts 数据可视化 入门基本知识 下载安装常用的图表 【1】

ECharts一个基于 JavaScript 的开源可视化图表库&#xff0c;即将数据以图形或图像的方式展现成在屏幕上显示出来&#xff0c;这种方式称为数据可视化。数据可视化有助于我们分析数据&#xff0c;帮助我们更深入更直观的理解数据。今天回顾顺便总结一下echarts的基本知识&#…

C++密码管理器

先问一句 最近有几个关注我的原力等级为0或-1&#xff0c;文章全是转载&#xff0c;转载时间基本都在2021年&#xff0c;而且关注了很多人&#xff0c;这些是僵尸粉吗&#xff1f; 文末有投票&#xff0c;麻烦参与一下谢谢 实现功能列表 暂时还没做加密功能 打算用openssl/a…

HTTPS通讯全过程

HTTPS通讯全过程 不得不说&#xff0c;https比http通讯更加复杂惹。在第一次接触https代码的时候&#xff0c;不知道为什么要用用证书&#xff0c;公钥是什么&#xff1f;私钥是什么&#xff1f;他们作用是什么&#xff1f;非对称加密和对称加密是啥&#xff1f;天&#xff0c;…

可视化大屏入口界面,炫酷科技又不失简洁时尚。

可视化大屏界面&#xff0c;大家见到很多了&#xff0c;当可视化大屏是多个系统的融合&#xff0c;而且彼此又相互独立&#xff0c;就需要设计一个入口页面&#xff0c;便于分流客户&#xff0c;这次我给大家分享一批。 设计可视化大屏入口界面时&#xff0c;可以结合炫酷科技…

startData

某音startData 记得加入学习群&#xff1a; python爬虫&js逆向3 714283180

leetcode算法题之N皇后

N皇后也是一道很经典的问题&#xff0c;问题如下&#xff1a; 题目地址 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

记录Java使用websocket

实现场景&#xff1a;每在小程序中添加一条数据时&#xff0c;后台将主动推送一个标记给PC端&#xff0c;PC端接收到标记将进行自动播放音频。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…

游戏管理系统

目录 Java程序设计课程设计 游戏管理系统 1系统简介 1.1需求分析 1.2 编程环境与工具 2系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 3主要业务流程 &#xff08;1&#xff09;用户及管理员登录流程图 &#xff08;2&#xff09;信息添加流程 &#x…

即插即用的3D神经元注意算法

在快速发展的人工智能领域&#xff0c;科技的进步往往源于对复杂问题的突破性解决方案。如今&#xff0c;我们正站在一种激动人心的技术创新的前沿——即插即用的3D神经元注意算法。这一前沿技术不仅为计算神经科学提供了全新的视角&#xff0c;也为人工智能的未来打开了新的大…

Python教程(十四):Requests模块详解

目录 专栏列表前言&#xff1a;安装 Requests查看包安装情况&#xff1a; RESTful 介绍RESTful API设计原则示例 基本用法1. 查询ID为1的用户&#xff08;GET&#xff09;2. 创建新用户&#xff08;POST&#xff09;3. 更新ID 为 1 的用户&#xff08;PUT&#xff09;4. 删除ID…

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具4. 分词与内置分词4.1 内置分词器(了解即可)4.2 `IK`中文分词器三. 整合SpringCloud1. 基础配置…

计算函数(c语言)

1.描述 //小乐乐学会了自定义函数&#xff0c;BoBo老师给他出了个问题&#xff0c;根据以下公式计算m的值。 // //其中 max3函数为计算三个数的最大值&#xff0c;如&#xff1a; max3(1, 2, 3) 返回结果为3。 //输入描述&#xff1a; //一行&#xff0c;输入三个整数&#xff…

视频汇聚/安防综合管理系统EasyCVR非管理员账户能调用分配给其他用户的通道是什么原因?

视频汇聚/安防综合管理系统EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安…