把文书模板语法配置、自定义列表标签配置、自定义字符串列表元素拼接分割符提取成docker镜像的环境变量

This commit is contained in:
2025-07-31 15:06:08 +08:00
parent 97ed5d9ed7
commit fa06be4a48
14 changed files with 283 additions and 102 deletions

View File

@@ -2,22 +2,17 @@ package com.optima.document.server.api;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.policy.ListRenderPolicy;
import com.deepoove.poi.policy.PictureRenderPolicy;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.template.run.RunTemplate;
import com.deepoove.poi.xwpf.BodyContainer;
import com.deepoove.poi.xwpf.BodyContainerFactory;
import com.optima.document.api.DocumentService;
import com.optima.document.api.Gramer;
import com.optima.document.server.config.DocumentConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -27,8 +22,6 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -38,53 +31,13 @@ import java.util.UUID;
* @author Elias
* @since 2021-09-28 16:18
*/
@SuppressWarnings("rawtypes")
@Slf4j
@Service
public class DocumentServiceImpl implements DocumentService {
@Resource
private DocumentConfig documentConfig;
/**
* word模版引擎配置
*/
Configure wtlConfig = Configure.builder().buildGramer("${", "}")
.setValidErrorHandler(new Configure.DiscardHandler())
.addPlugin('%', new ListRenderPolicy() {
@Override
public void doRender(RenderContext<List<Object>> context) throws Exception {
XWPFRun run = context.getRun();
List<?> dataList = context.getData();
Iterator<?> var5 = dataList.iterator();
while (var5.hasNext()) {
Object data = var5.next();
if (data instanceof TextRenderData) {
run.setText(((TextRenderData) data).getText());
if (var5.hasNext()) {
run.setText("");
}
} else if (data instanceof PictureRenderData) {
PictureRenderPolicy.Helper.renderPicture(run, (PictureRenderData) data);
}
}
}
})
.setRenderDataComputeFactory(envModel ->
el -> {
Object data = envModel.getRoot();
if ("#this".equals(el)) {
return data;
} else if (data instanceof Map) {
Map dataMap = ((Map) data);
if (dataMap.containsKey(el)) {
return dataMap.get(el);
}
}
return null;
})
.build();
@Resource
private Configure wtlConfig;
public byte[] convert(byte[] source, String sourceExtension, String targetExtension, String targetFormat) {
try {
@@ -188,4 +141,8 @@ public class DocumentServiceImpl implements DocumentService {
public byte[] xlsToXlsx(byte[] source) {
return convert(source, "xls", "xlsx", "xlWorkbookDefault");
}
public Gramer gramer() {
return documentConfig.getGramer();
}
}

View File

@@ -1,12 +1,25 @@
package com.optima.document.server.config;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.policy.ListRenderPolicy;
import com.deepoove.poi.policy.PictureRenderPolicy;
import com.deepoove.poi.render.RenderContext;
import com.optima.document.api.DocumentService;
import com.optima.document.api.Gramer;
import lombok.Data;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* 服务端配置
*
@@ -20,6 +33,60 @@ public class DocumentConfig {
private String docToProgram;
@NestedConfigurationProperty
private Gramer gramer;
/**
* word模版引擎配置
*/
@Bean(name = "wtlConfig")
public Configure wtlConfig() {
return Configure.builder().buildGramer(gramer.getPrefix(), gramer.getSuffix())
.setValidErrorHandler(new Configure.DiscardHandler())
.addPlugin(gramer.getCustomizeList(), new ListRenderPolicy() {
@Override
public void doRender(RenderContext<List<Object>> context) throws Exception {
XWPFRun run = context.getRun();
List<?> dataList = context.getData();
Iterator<?> iterator = dataList.iterator();
while (iterator.hasNext()) {
Object data = iterator.next();
if (data instanceof String) {
// 纯文本类型
run.setText(data.toString());
if (iterator.hasNext()) {
run.setText(gramer.getCustomizeListStringDelimiting());
}
} else if (data instanceof TextRenderData) {
// poi的文本类型
run.setText(((TextRenderData) data).getText());
if (iterator.hasNext()) {
run.setText(gramer.getCustomizeListStringDelimiting());
}
} else if (data instanceof PictureRenderData) {
// poi的图片类型
PictureRenderPolicy.Helper.renderPicture(run, (PictureRenderData) data);
}
}
}
})
.setRenderDataComputeFactory(envModel ->
el -> {
Object data = envModel.getRoot();
if ("#this".equals(el)) {
return data;
} else if (data instanceof Map) {
@SuppressWarnings("rawtypes") Map dataMap = ((Map) data);
if (dataMap.containsKey(el)) {
return dataMap.get(el);
}
}
return null;
})
.build();
}
/**
* 文档接口
*
@@ -33,5 +100,4 @@ public class DocumentConfig {
exporter.setServiceInterface(DocumentService.class);
return exporter;
}
}

View File

@@ -2,4 +2,13 @@ server:
port: 9004
document:
gramer:
default:
prefix: '${'
suffix: '}'
prefix: ${GRAMER_PREFIX:${document.gramer.default.prefix}}
suffix: ${GRAMER_SUFFIX:${document.gramer.default.suffix}}
customize-list: ${GRAMER_CUSTOMIZE_LIST:%}
customize-list-string-delimiting: ${GRAMER_CUSTOMIZE_LIST_STRING_DELIMITING:}
doc-to-program: C:\\DocumentServer\\docto.exe