8 Commits

Author SHA1 Message Date
杨黄林
461564a615 增加CESI、国标(GB)、WPS字体 2026-01-08 15:08:55 +08:00
b0082a57c7 调整说明 2025-12-01 11:03:10 +08:00
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
70 changed files with 178 additions and 164 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-docker/fonts](document-docker/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

@@ -44,7 +44,10 @@ COPY app/document-server-*.jar /app/application.jar
COPY app/application.yml /app/application.yml COPY app/application.yml /app/application.yml
# 拷贝字体文件并刷新字体缓存 # 拷贝字体文件并刷新字体缓存
COPY fonts /usr/share/fonts/truetype COPY fonts/truetype /usr/share/fonts/truetype
COPY fonts/cesi /usr/share/fonts/cesi
COPY fonts/gb /usr/share/fonts/gb
COPY fonts/wps-office /usr/share/fonts/wps-office
RUN fc-cache -fv RUN fc-cache -fv
# 入口 # 入口

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镜像构建成功.
# 清理临时文件 # 清理临时文件

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,12 @@
#!/bin/bash #!/bin/bash
echo installing fonts echo installing fonts
sudo mkdir -p /usr/share/fonts/truetype sudo mkdir -p /usr/share/fonts/truetype
sudo cp -r ./fonts/* /usr/share/fonts/truetype/ sudo mkdir -p /usr/share/fonts/cesi
sudo mkdir -p /usr/share/fonts/gb
sudo mkdir -p /usr/share/fonts/wps-office
sudo cp -r ./fonts/truetype/* /usr/share/fonts/truetype/
sudo cp -r ./fonts/cesi/* /usr/share/fonts/cesi/
sudo cp -r ./fonts/gb/* /usr/share/fonts/gb/
sudo cp -r ./fonts/wps-office/* /usr/share/fonts/wps-office/
sudo fc-cache -fv sudo fc-cache -fv
echo fonts installed echo fonts installed

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);