Compare commits

..

6 Commits

Author SHA1 Message Date
62d62811fc Merge remote-tracking branch 'origin/master' 2025-11-24 11:13:37 +08:00
2aadb288c0 修复导出镜像失败问题 2025-11-24 11:13:22 +08:00
268769c02c 更新 README.md 2025-11-19 12:48:21 +08:00
837028762b 增加网络图片示例 2025-11-17 16:21:50 +08:00
7f1c9af201 增加图片列表渲染示例 2025-11-17 16:00:21 +08:00
434a751575 增加镜像创建人 2025-11-17 12:39:04 +08:00
4 changed files with 167 additions and 162 deletions

312
README.md
View File

@@ -1,159 +1,155 @@
# document-server 文书服务 # document-server 文书服务
+ api下为调用的接口在需要处理文书的项目中引用`Http Invoker`配置Service后进行调用 + api下为调用的接口在需要处理文书的项目中引用`Http Invoker`配置Service后进行调用
+ 参考[在Spring Boot中使用Http Invoker](https://codeleading.com/article/15413828287/) 的`Client`部分 + 参考[在Spring Boot中使用Http Invoker](https://codeleading.com/article/15413828287/) 的`Client`部分
+ [jod-document-server](document-server/jod-document-server)下使用poi-tl处理word文件使用jacob处理调用[LibreOffice](https://zh-cn.libreoffice.org/)来进行格式转换,`java -jar xxx.jar`启动 + [jod-document-server](document-server/jod-document-server)下使用poi-tl处理word文件使用jacob处理调用[LibreOffice](https://zh-cn.libreoffice.org/)来进行格式转换,`java -jar xxx.jar`启动
+ 参考:[springboot整合libreoffice两种方式使用本地和远程的libreofficedocker中同时部署应用和libreoffice](https://blog.csdn.net/qq_42882229/article/details/140917550) + 参考:[springboot整合libreoffice两种方式使用本地和远程的libreofficedocker中同时部署应用和libreoffice](https://blog.csdn.net/qq_42882229/article/details/140917550)
+ 在Linux下需要注意word文件的字体必须在Linux中存在 + 在Linux下需要注意word文件的字体必须在Linux中存在
+ 若出现格式问题需先使用LibreOffice打开修复后在进行转换 + 若出现格式问题需先使用LibreOffice打开修复后在进行转换
+ [docto-document-server](document-server/docto-document-server)下使用poi-tl处理word文件使用docto调用`Microsoft Office`来转换格式,`java -jar xxx.jar`启动 + [docto-document-server](document-server/docto-document-server)下使用poi-tl处理word文件使用docto调用`Microsoft Office`来转换格式,`java -jar xxx.jar`启动
+ 仅能运行在Windows兼容性最好比较慢 + 仅能运行在Windows兼容性最好比较慢
+ [document-fonts](document-fonts)为linux下需要安装的中文字体 + [document-fonts](document-fonts)为linux下需要安装的中文字体
--- ---
## linux下使用[jodconverter-document-server](document-server/jodconverter-document-server) ## linux下使用[jodconverter-document-server](document-server/jodconverter-document-server)
linux下后台运行方法假设在/root/document-server linux下后台运行方法假设在/root/document-server
1. `document-server-2.0.0.jar`所在位置创建`start-server.sh`脚本 1. `document-server-2.0.0.jar`所在位置创建`start-server.sh`脚本
```shell ```shell
#!/bin/bash #!/bin/bash
# 设置终端标题 # 设置终端标题
echo -ne "\033]0;文书转换服务\007" echo -ne "\033]0;文书转换服务\007"
# 自动获取脚本所在绝对目录(兼容软链接) # 自动获取脚本所在绝对目录(兼容软链接)
SCRIPT_DIR=$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" &>/dev/null && pwd) SCRIPT_DIR=$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" &>/dev/null && pwd)
# 进入脚本目录并启动服务 # 进入脚本目录并启动服务
cd "$SCRIPT_DIR" || exit 1 cd "$SCRIPT_DIR" || exit 1
exec java -jar ./document-server-2.0.0.jar --spring.config.location=./application.yml exec java -jar ./document-server-2.0.0.jar --spring.config.location=./application.yml
``` ```
2.创建`document-server.service` 2.创建`document-server.service`
```shell ```shell
sudo vim /etc/systemd/system/document-server.service sudo vim /etc/systemd/system/document-server.service
``` ```
`document-server.service`内容 `document-server.service`内容
```ini ```ini
[Unit] [Unit]
Description=Document Server Service Description=Document Server Service
After=network.target After=network.target
[Service] [Service]
Type=simple Type=simple
User=root User=root
ExecStart=/root/document-server/start-server.sh ExecStart=/root/document-server/start-server.sh
StandardOutput=file:/root/document-server/document-server.log StandardOutput=file:/root/document-server/document-server.log
StandardError=inherit StandardError=inherit
Restart=on-failure Restart=on-failure
RestartSec=5s RestartSec=5s
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
``` ```
3.启动服务并开机自启 3.启动服务并开机自启
```shell ```shell
sudo systemctl daemon-reload sudo systemctl daemon-reload
sudo systemctl enable document-server sudo systemctl enable document-server
sudo systemctl start document-server sudo systemctl start document-server
``` ```
--- ---
## 构建Docker镜像以便于通过Docker容器运行 ## 构建Docker镜像以便于通过Docker容器运行
1.先通过maven打包[jodconverter-document-server](document-server/jodconverter-document-server) 1.先通过maven打包[jodconverter-document-server](document-server/jodconverter-document-server)
2.执行[build.sh](document-docker/build.sh) 2.执行[build.sh](document-docker/build.sh)
3.通过`docker load -i document-server-1.0.tar.gz`导入镜像,通过`docker ps | grep document-server`查看镜像版本 3.通过`docker load -i document-server-1.0.tar.gz`导入镜像,通过`docker ps | grep document-server`查看镜像版本
4.编写`docker-compose.yml`,在其中指定镜像启动 4.编写`docker-compose.yml`,在其中指定镜像启动
```yml ```yml
version: '3.8' version: '3.8'
services: services:
document-server: document-server:
image: document-server:1.0 image: document-server:1.0
container_name: document-server container_name: document-server
environment: environment:
- DISABLE_IPV6=true - DISABLE_IPV6=true
- CUSTOM_PORT=3000 - CUSTOM_PORT=3000
- CUSTOM_HTTPS_PORT=3001 - CUSTOM_HTTPS_PORT=3001
- DOCUMENT_SERVER_PORT=9004 - DOCUMENT_SERVER_PORT=9004
- PORT_NUMBERS=2001,2002,2003 - PORT_NUMBERS=2001,2002,2003
- MAX_TASKS_PER_PROCESS=100 - MAX_TASKS_PER_PROCESS=100
# 传递环境变量时,$ 是特殊符号,需要 $$ 来表示 # 传递环境变量时,$ 是特殊符号,需要 $$ 来表示
# linux 命令中,$ 也是特殊符号,需要在前面增加 \ 表示转义特殊符号 # linux 命令中,$ 也是特殊符号,需要在前面增加 \ 表示转义特殊符号
# 如果需要传递 ${ ,则需要写成 \$${ 。其首先被 docker 解析为 \${ \${ 作为linux命令的一部分$转义后,相当于字符串 ${ # 如果需要传递 ${ ,则需要写成 \$${ 。其首先被 docker 解析为 \${ \${ 作为linux命令的一部分$转义后,相当于字符串 ${
# 如果不是类似 ${ ,如 {{ ,则无需转义 # 如果不是类似 ${ ,如 {{ ,则无需转义
- GRAMER_PREFIX="\$${" - GRAMER_PREFIX="\$${"
- GRAMER_SUFFIX="}" - GRAMER_SUFFIX="}"
- GRAMER_CUSTOMIZE_LIST="%" - GRAMER_CUSTOMIZE_LIST="%"
- GRAMER_CUSTOMIZE_LIST_STRING_DELIMITING="" - GRAMER_CUSTOMIZE_LIST_STRING_DELIMITING=""
ports: ports:
# 用于通过http访问libreoffice # 文书转换服务端口用于document-api远程调用document-server
- 3000:3000 - 9004:9004
# 用于通过https访问libreoffice volumes:
- 3001:3001 # libreoffice的配置保存路径
# 文书转换服务端口用于document-api远程调用document-server - ./config:/config
- 9004:9004 # document-server的配置如不指定则以默认为准。建议通过环境变量修改关键配置
volumes: - ./application.yml:/app/application.yml
# libreoffice的配置保存路径 restart: unless-stopped
- ./config:/config # 如果要使用现有网络而不创建新网络,则取消下面的注释
# document-server的配置如不指定则以默认为准。建议通过环境变量修改关键配置 # networks:
- ./application.yml:/app/application.yml # # 现有网络的名称
restart: unless-stopped # - exist_network
# 如果要使用现有网络而不创建新网络,则取消下面的注释
# networks: # 如果要使用现有网络而不创建新网络,则取消下面的注释
# # 现有网络的名称 #networks:
# - exist_network # # 现有网络的名称
# exist_network:
# 如果要使用现有网络而不创建新网络,则取消下面的注释 # external: true
#networks: ```
# # 现有网络的名称
# exist_network: `application.yml`默认内容如下:
# external: true ```yml
``` server:
port: ${DOCUMENT_SERVER_PORT:9004}
`application.yml`默认内容如下:
```yml document:
server: gramer:
port: ${DOCUMENT_SERVER_PORT:9004} default:
prefix: '${'
document: suffix: '}'
gramer: prefix: ${GRAMER_PREFIX:${document.gramer.default.prefix}}
default: suffix: ${GRAMER_SUFFIX:${document.gramer.default.suffix}}
prefix: '${' customize-list-tag: ${GRAMER_CUSTOMIZE_LIST:%}
suffix: '}' customize-list-tag-string-delimiting: ${GRAMER_CUSTOMIZE_LIST_STRING_DELIMITING:}
prefix: ${GRAMER_PREFIX:${document.gramer.default.prefix}}
suffix: ${GRAMER_SUFFIX:${document.gramer.default.suffix}} jodconverter:
customize-list-tag: ${GRAMER_CUSTOMIZE_LIST:%} local:
customize-list-tag-string-delimiting: ${GRAMER_CUSTOMIZE_LIST_STRING_DELIMITING:} # 启动本地转换
enabled: true
jodconverter: # macOS下program/soffice 的 program 所在目录 或 MacOS/soffice 的 MacOS 所在目录
local: # windows下program/soffice.exe 的 program 所在目录
# 启动本地转换 # linux下program/soffice.bin 的 program 所在目录
enabled: true # 如果不配置,则自动查找
# macOS下program/soffice 的 program 所在目录 或 MacOS/soffice 的 MacOS 所在目录 #office-home: /Applications/LibreOffice.app/Contents
# windows下program/soffice.exe 的 program 所在目录 # 一个端口表示一个常驻进程默认只有一个进程端口为2002
# linux下program/soffice.bin 的 program 所在目录 port-numbers: ${PORT_NUMBERS:2002}
# 如果不配置,则自动查找 # 每个进程最多处理多个任务默认为200
#office-home: /Applications/LibreOffice.app/Contents max-tasks-per-process: ${MAX_TASKS_PER_PROCESS:200}
# 一个端口表示一个常驻进程默认只有一个进程端口为2002 ```
port-numbers: ${PORT_NUMBERS:2002}
# 每个进程最多处理多个任务默认为200 ---
max-tasks-per-process: ${MAX_TASKS_PER_PROCESS:200}
``` ## windows下才用[docto-document-server](document-server/docto-document-server)
---
## windows下才用[docto-document-server](document-server/docto-document-server)
通过`java -jar ./document-server-2.0.0.jar --spring.config.location=./application.yml`执行 通过`java -jar ./document-server-2.0.0.jar --spring.config.location=./application.yml`执行

View File

@@ -18,16 +18,16 @@ cp ../document-server/jodconverter-document-server/target/application.yml app/
#amd64 #amd64
echo 开始构建amd64镜像... echo 开始构建amd64镜像...
docker buildx build --platform linux/amd64 -t document-server:1.0 ./ docker buildx build --platform linux/amd64 -t yhl452493373/document-server:1.0 ./
rm -rf document-server-1.0.tar.gz rm -rf document-server-1.0.tar.gz
docker save document-server:1.0 | gzip > document-server-1.0.tar.gz docker save yhl452493373/document-server:1.0 | gzip > document-server-1.0.tar.gz
echo amd64镜像构建成功. echo amd64镜像构建成功.
#arm64 #arm64
echo 开始构建arm64镜像... echo 开始构建arm64镜像...
docker buildx build --platform linux/arm64 -t document-server:1.0.arm64 ./ docker buildx build --platform linux/arm64 -t yhl452493373/document-server:1.0.arm64 ./
rm -rf document-server-1.0.arm64.tar.gz rm -rf document-server-1.0.arm64.tar.gz
docker save document-server:1.0.arm64 | gzip > document-server-1.0.arm64.tar.gz docker save yhl452493373/document-server:1.0.arm64 | gzip > document-server-1.0.arm64.tar.gz
echo arm64镜像构建成功. echo arm64镜像构建成功.
# 清理临时文件 # 清理临时文件

View File

@@ -1,5 +1,6 @@
package com.optima.document.test.bean; package com.optima.document.test.bean;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures; import com.deepoove.poi.data.Pictures;
import com.optima.document.api.DocumentService; import com.optima.document.api.DocumentService;
import com.optima.document.test.config.DocumentServiceConfig; import com.optima.document.test.config.DocumentServiceConfig;
@@ -45,8 +46,16 @@ public class DocumentConverter {
params.put("departmentList", departmentList); params.put("departmentList", departmentList);
byte[] bytes = Files.readAllBytes(Paths.get("/Users/yanghuanglin/Downloads/02.png")); byte[] bytes = Files.readAllBytes(Paths.get("/Users/yanghuanglin/Downloads/02.png"));
params.put("img", Pictures.ofBytes(bytes).size(48, 27).create()); params.put("img", Pictures.ofBytes(bytes).size(48, 27).create());
List<PictureRenderData> imgList = new ArrayList<>();
imgList.add(Pictures.ofBytes(bytes).size(48, 27).create());
imgList.add(Pictures.ofBytes(bytes).size(48, 27).create());
params.put("imgList", imgList);
params.put("urlImg",Pictures.ofUrl("https://xct.cdhncy.cn/file/city/2025/10/28/fa03c40bdfc64a4f9e1241ebda6b3fda_1761641676690.jpeg").create());
// 生成word并转为pdf // 生成word并转为pdf
byte[] generatedWord = documentService.generateWord(Files.readAllBytes(sourceFile.toPath()), params); byte[] generatedWord = documentService.generateWord(Files.readAllBytes(sourceFile.toPath()), params);
byte[] wordedToPdf = documentService.wordToPdf(generatedWord, true); byte[] wordedToPdf = documentService.wordToPdf(generatedWord, true);