From ef654aee65e24e047eacccad96b974622e4910b6 Mon Sep 17 00:00:00 2001 From: okxlin Date: Mon, 4 Sep 2023 01:45:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0kkfileview=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8(=E6=84=9F=E8=B0=A2=E7=BD=91=E5=8F=8B?= =?UTF-8?q?=E5=8C=85=E5=AD=90=E5=8F=94=E7=9A=84=E6=8A=95=E7=A8=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kkfileview/4.1.0/.env.sample | 2 + apps/kkfileview/4.1.0/data.yml | 10 ++ apps/kkfileview/4.1.0/docker-compose.yml | 16 ++ apps/kkfileview/README.md | 173 ++++++++++++++++++++++ apps/kkfileview/data.yml | 20 +++ apps/kkfileview/latest/.env.sample | 2 + apps/kkfileview/latest/data.yml | 10 ++ apps/kkfileview/latest/docker-compose.yml | 16 ++ apps/kkfileview/logo.png | Bin 0 -> 5959 bytes 9 files changed, 249 insertions(+) create mode 100644 apps/kkfileview/4.1.0/.env.sample create mode 100644 apps/kkfileview/4.1.0/data.yml create mode 100644 apps/kkfileview/4.1.0/docker-compose.yml create mode 100644 apps/kkfileview/README.md create mode 100644 apps/kkfileview/data.yml create mode 100644 apps/kkfileview/latest/.env.sample create mode 100644 apps/kkfileview/latest/data.yml create mode 100644 apps/kkfileview/latest/docker-compose.yml create mode 100644 apps/kkfileview/logo.png diff --git a/apps/kkfileview/4.1.0/.env.sample b/apps/kkfileview/4.1.0/.env.sample new file mode 100644 index 00000000..b5493d0d --- /dev/null +++ b/apps/kkfileview/4.1.0/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="kkfileview" +PANEL_APP_PORT_HTTP="40145" diff --git a/apps/kkfileview/4.1.0/data.yml b/apps/kkfileview/4.1.0/data.yml new file mode 100644 index 00000000..60234e58 --- /dev/null +++ b/apps/kkfileview/4.1.0/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40145 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/kkfileview/4.1.0/docker-compose.yml b/apps/kkfileview/4.1.0/docker-compose.yml new file mode 100644 index 00000000..c55b893b --- /dev/null +++ b/apps/kkfileview/4.1.0/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + kkfileview: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8012" + image: keking/kkfileview:4.1.0 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/kkfileview/README.md b/apps/kkfileview/README.md new file mode 100644 index 00000000..af05c8af --- /dev/null +++ b/apps/kkfileview/README.md @@ -0,0 +1,173 @@ +# kkFileView +文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览,如: +1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla ,pages 等 Office 办公文档 +2. 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档 +3. 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档 +4. 支持 vsd, vsdx 等 Visio 流程图文件 +5. 支持 wmf, emf 等 Windows 系统图像文件 +6. 支持 psd ,eps 等 Photoshop 软件模型文件 +7. 支持 pdf ,ofd, rtf 等文档 +8. 支持 xmind 软件模型文件 +9. 支持 bpmn 工作流文件 +10. 支持 eml 邮件文件 +11. 支持 epub 图书文档 +12. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件 +13. 支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件 +14. 支持 txt, xml(渲染), xbrl(渲染), md(渲染), java, php, py, js, css 等所有纯文本 +15. 支持 zip, rar, jar, tar, gzip, 7z 等压缩包 +16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像) +17. 支持 tif, tiff 图信息模型文件 +18. 支持 tga 图像格式文件 +19. 支持 svg 矢量图像格式文件 +20. 支持 mp3,wav,mp4,flv 等音视频格式文件 +21. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览 +22. 支持 dcm 等医疗数位影像预览 +23. 支持 drawio 绘图预览 + +> 基于当前良好的架构模式,支持的文件类型在进一步丰富中 +### 项目特性 + +- 使用 spring-boot 开发,预览服务搭建部署非常简便 +- rest 接口提供服务,跨语言、跨平台特性(java,php,python,go,php,....)都支持,应用接入简单方便 +- 抽象预览服务接口,方便二次开发,非常方便添加其他类型文件预览支持 +- 最最重要 Apache 协议开源,代码 pull 下来想干嘛就干嘛 + +### 官网及文档 + +地址:[https://kkview.cn](https://kkview.cn/) + +### 在线体验 +> 请善待公共服务,会不定时停用 + +地址:[https://file.kkview.cn](https://file.kkview.cn) + +### 项目文档(Project documentation) +1. 详细使用文档:https://kkview.cn/zh-cn/docs/home.html + +### 联系我们,加入组织 +> 我们会用心回答解决大家在项目使用中的问题,也请大家在提问前至少 Google 或 baidu 过,珍爱生命远离无效的交流沟通 + + + +### 文档预览效果 +#### 1. 文本预览 +支持所有类型的文本文档预览, 由于文本文档类型过多,无法全部枚举,默认开启的类型如下 txt,html,htm,asp,jsp,xml,xbrl,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd +文本预览效果如下 +![文本预览效果如下](https://kkview.cn/img/preview/preview-text.png) + +#### 2. 图片预览 +支持jpg,jpeg,png,gif等图片预览(翻转,缩放,镜像),预览效果如下 +![图片预览](https://kkview.cn/img/preview/preview-image.png) + +#### 3. word文档预览 +支持doc,docx文档预览,word预览有两种模式:一种是每页word转为图片预览,另一种是整个word文档转成pdf,再预览pdf。两种模式的适用场景如下 +* 图片预览:word文件大,前台加载整个pdf过慢 +* pdf预览:内网访问,加载pdf快 +图片预览模式预览效果如下 +![word文档预览1](https://kkview.cn/img/preview/preview-doc-image.png) +pdf预览模式预览效果如下 +![word文档预览2](https://kkview.cn/img/preview/preview-doc-pdf.png) + +#### 4. ppt文档预览 +支持ppt,pptx文档预览,和word文档一样,有两种预览模式 +图片预览模式预览效果如下 +![ppt文档预览1](https://kkview.cn/img/preview/preview-ppt-image.png) +pdf预览模式预览效果如下 +![ppt文档预览2](https://kkview.cn/img/preview/preview-ppt-pdf.png) + +#### 5. pdf文档预览 +支持pdf文档预览,和word文档一样,有两种预览模式 +图片预览模式预览效果如下 +![pdf文档预览1](https://kkview.cn/img/preview/preview-pdf-image.png) +pdf预览模式预览效果如下 +![pdf文档预览2](https://kkview.cn/img/preview/preview-pdf-pdf.png) + +#### 6. excel文档预览 +支持xls,xlsx文档预览,预览效果如下 +![excel文档预览](https://kkview.cn/img/preview/preview-xls.png) + +#### 7. 压缩文件预览 +支持zip,rar,jar,tar,gzip等压缩包,预览效果如下 +![压缩文件预览1](https://kkview.cn/img/preview/preview-zip.png) +可点击压缩包中的文件名,直接预览文件,预览效果如下 +![压缩文件预览2](https://kkview.cn/img/preview/preview-zip-inner.png) + +#### 8. 多媒体文件预览 +理论上支持所有的视频、音频文件,由于无法枚举所有文件格式,默认开启的类型如下 +mp3,wav,mp4,flv +视频预览效果如下 +![多媒体文件预览1](https://kkview.cn/img/preview/preview-video.png) +音频预览效果如下 +![多媒体文件预览2](https://kkview.cn/img/preview/preview-audio.png) + +#### 9. CAD文档预览 +支持CAD dwg文档预览,和word文档一样,有两种预览模式 +图片预览模式预览效果如下 +![cad文档预览1](https://kkview.cn/img/preview/preview-cad-image.png) +pdf预览模式预览效果如下 +![cad文档预览2](https://kkview.cn/img/preview/preview-cad-pdf.png) +考虑说明篇幅原因,就不贴其他格式文件的预览效果了,感兴趣的可以参考下面的实例搭建下 + +#### 10. Excel文件纯前端渲染效果 + +![Excel文件纯前端渲染效果](https://kkview.cn/img/preview/preview-xlsx-web.png) + +#### 11. 流程图bpmn文件预览效果 + +![流程图bpmn文件预览效果](https://kkview.cn/img/preview/preview-bpmn.png) + +#### 12. 3D模型文件预览效果: + +![3D模型文件预览效果](https://kkview.cn/img/preview/preview-3ds.png) + +#### 13. dcm医疗数位影像文件预览效果: + +![dcm医疗数位影像文件预览效果](https://kkview.cn/img/preview/preview-dcm.png) + +#### 14. drawio流程图预览效果: + +![dcdrawio流程图预览效果](https://kkview.cn/img/preview/preview-drawio.png) + +### 快速开始 +> 项目使用技术 +- spring boot: [spring boot开发参考指南](http://www.kailing.pub/PdfReader/web/viewer.html?file=springboot) +- freemarker +- redisson +- jodconverter + +> 依赖外部环境 +- redis (可选,默认不用) +- OpenOffice 或者 LibreOffice( Windows 下已内置,Linux 脚本启动模式会自动安装,Mac OS 下需要手动安装) + +1. 第一步:pull 项目 https://github.com/kekingcn/file-online-preview.git + +3. 第二步:运行 ServerMain 的 main 方法,服务启动后,访问 http://localhost:8012/ +会看到如下界面,代表服务启动成功 + +![输入图片说明](https://gitee.com/uploads/images/2017/1213/100221_ea15202e_492218.png "屏幕截图.png") + +### 关于引用 +ofd 引用于 [ofdview ](https://gitee.com/cnofd/ofdview ) 开源协议 Apache-2.0 +CAD 引用于 aspose-cad 测试版本 商用请自行购买 +xmind 引用于 [ xmind-embed-viewer](https://github.com/xmindltd/xmind-embed-viewer) 开源协议 MIT +epub 引用于 [ epub.js](https://github.com/futurepress/epub.js) 开源协议 BSD许可证 +压缩包 引用于 [sevenzipjbinding](https://github.com/borisbrodski/sevenzipjbinding )开源协议LGPL +3D 引用于 [Online3DViewer](https://github.com/kovacsv/Online3DViewer )开源协议MIT +drawio 引用于 [drawio](https://github.com/jgraph/drawio )开源协议 Apache-2.0 +bpmn流程图 引用于 [bpmn-js](https://github.com/bpmn-io/bpmn-js ) 自定义协议 保留水印 具体自行查看 +dcm医疗数位影像 引用于 [dcmjs](https://github.com/dcmjs-org/dcmjs )开源协议MIT + +### 使用登记 +如果这个项目解决了你的实际问题,可在 https://gitee.com/kekingcn/file-online-preview/issues/IGSBV +登记下,如果节省了你的三方预览服务费用,也愿意支持下的话,可点击下方【捐助】请作者喝杯咖啡,也是非常感谢 + +### Stars + +#### GitHub + +[![Stargazers over time](https://starchart.cc/kekingcn/kkFileView.svg)](https://starchart.cc/kekingcn/kkFileView) + +### 鸣谢 +- 本项目诞生于[凯京集团],在取得公司高层同意后以 Apache 协议开源出来反哺社区,在此特别感谢凯京集团,以及集团领导[@唐老大](https://github.com/tangshd)的支持、@端木详笑的贡献。 +- 本项目已脱离公司由[KK开源社区]维护发展壮大,感谢所有给 kkFileView 提 Issue 、Pr 开发者 +- 本项目引入的第三方组件已在 '关于引用' 列表列出,感谢这些项目,让 kkFileView 更出色 diff --git a/apps/kkfileview/data.yml b/apps/kkfileview/data.yml new file mode 100644 index 00000000..bf238c85 --- /dev/null +++ b/apps/kkfileview/data.yml @@ -0,0 +1,20 @@ +name: kkFileView +tags: + - 工具 +title: 一款文件文档在线预览解决方案 +type: 工具 +description: 一款文件文档在线预览解决方案 +additionalProperties: + key: kkfileview + name: kkFileView + tags: + - Tool + shortDescZh: 一款文件文档在线预览解决方案 + shortDescEn: A online preview solution for documents + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://kkview.cn/zh-cn/index.html + github: https://github.com/kekingcn/kkFileView + document: https://kkfileview.keking.cn/zh-cn/docs/home.html diff --git a/apps/kkfileview/latest/.env.sample b/apps/kkfileview/latest/.env.sample new file mode 100644 index 00000000..b5493d0d --- /dev/null +++ b/apps/kkfileview/latest/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="kkfileview" +PANEL_APP_PORT_HTTP="40145" diff --git a/apps/kkfileview/latest/data.yml b/apps/kkfileview/latest/data.yml new file mode 100644 index 00000000..60234e58 --- /dev/null +++ b/apps/kkfileview/latest/data.yml @@ -0,0 +1,10 @@ +additionalProperties: + formFields: + - default: 40145 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number diff --git a/apps/kkfileview/latest/docker-compose.yml b/apps/kkfileview/latest/docker-compose.yml new file mode 100644 index 00000000..4a124b64 --- /dev/null +++ b/apps/kkfileview/latest/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + kkfileview: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8012" + image: keking/kkfileview:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/kkfileview/logo.png b/apps/kkfileview/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e12e7f78f43e120315d2021bd06a2bb5d8e1e624 GIT binary patch literal 5959 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 JtK_Z2{~z^!Vg&#I literal 0 HcmV?d00001