459 lines
24 KiB
Java
459 lines
24 KiB
Java
package org.opencdmp.filetransformer.docx.service.wordfiletransformer;
|
|
|
|
import org.opencdmp.commonmodels.enums.DescriptionStatus;
|
|
import org.opencdmp.commonmodels.enums.DmpAccessType;
|
|
import org.opencdmp.commonmodels.enums.DmpBlueprintSystemFieldType;
|
|
import org.opencdmp.commonmodels.enums.DmpStatus;
|
|
import org.opencdmp.commonmodels.models.dmp.DmpBlueprintValueModel;
|
|
import org.opencdmp.commonmodels.models.dmp.DmpModel;
|
|
import org.opencdmp.commonmodels.models.FileEnvelopeModel;
|
|
import org.opencdmp.commonmodels.models.description.DescriptionModel;
|
|
import org.opencdmp.commonmodels.models.descriptiotemplate.DescriptionTemplateModel;
|
|
import org.opencdmp.commonmodels.models.dmpblueprint.*;
|
|
import org.opencdmp.commonmodels.models.dmpreference.DmpReferenceModel;
|
|
import org.opencdmp.commonmodels.models.reference.ReferenceModel;
|
|
import org.opencdmp.filetransformerbase.enums.FileTransformerEntityType;
|
|
import org.opencdmp.filetransformerbase.interfaces.FileTransformerClient;
|
|
import org.opencdmp.filetransformerbase.interfaces.FileTransformerConfiguration;
|
|
import org.opencdmp.filetransformer.docx.model.enums.FileFormats;
|
|
import org.opencdmp.filetransformerbase.models.misc.FileFormat;
|
|
import org.opencdmp.filetransformer.docx.service.pdf.PdfService;
|
|
import org.opencdmp.filetransformer.docx.model.enums.ParagraphStyle;
|
|
import org.opencdmp.filetransformer.docx.service.storage.FileStorageService;
|
|
import org.opencdmp.filetransformer.docx.service.wordfiletransformer.visibility.VisibilityServiceImpl;
|
|
import org.opencdmp.filetransformer.docx.service.wordfiletransformer.word.WordBuilder;
|
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
|
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
|
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
|
import org.springframework.context.annotation.Scope;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.util.ResourceUtils;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
import java.io.*;
|
|
import java.math.BigInteger;
|
|
import java.time.Instant;
|
|
import java.util.*;
|
|
|
|
@Component
|
|
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
|
public class WordFileTransformerService implements FileTransformerClient {
|
|
private final static Logger logger = LoggerFactory.getLogger(WordFileTransformerService.class);
|
|
|
|
private final static List<FileFormat> FILE_FORMATS = List.of(
|
|
new FileFormat(FileFormats.PDF.getValue(), true, "fa-file-pdf-o"),
|
|
new FileFormat(FileFormats.DOCX.getValue(), true, "fa-file-word-o"));
|
|
|
|
private final static List<FileTransformerEntityType> FILE_TRANSFORMER_ENTITY_TYPES = List.of(
|
|
FileTransformerEntityType.Dmp, FileTransformerEntityType.Description);
|
|
|
|
private final WordFileTransformerServiceProperties wordFileTransformerServiceProperties;
|
|
private final PdfService pdfService;
|
|
private final WordBuilder wordBuilder;
|
|
private final FileStorageService storageService;
|
|
@Autowired
|
|
public WordFileTransformerService(
|
|
WordFileTransformerServiceProperties wordFileTransformerServiceProperties,
|
|
PdfService pdfService, WordBuilder wordBuilder, FileStorageService storageService) {
|
|
this.wordFileTransformerServiceProperties = wordFileTransformerServiceProperties;
|
|
this.pdfService = pdfService;
|
|
this.wordBuilder = wordBuilder;
|
|
this.storageService = storageService;
|
|
}
|
|
|
|
@Override
|
|
public FileEnvelopeModel exportDmp(DmpModel dmp, String variant) throws IOException, InvalidApplicationException {
|
|
FileFormats fileFormat = FileFormats.of(variant);
|
|
byte[] bytes = this.buildDmpWordDocument(dmp);
|
|
String filename = switch (fileFormat) {
|
|
case DOCX -> this.getDmpFileName(dmp, ".docx");
|
|
case PDF -> {
|
|
bytes = this.pdfService.convertToPDF(bytes);
|
|
yield this.getDmpFileName(dmp, ".pdf");
|
|
}
|
|
default -> throw new InvalidApplicationException("Invalid type " + fileFormat);
|
|
};
|
|
|
|
FileEnvelopeModel wordFile = new FileEnvelopeModel();
|
|
if (this.getConfiguration().isUseSharedStorage()) {
|
|
String fileRef = this.storageService.storeFile(bytes);
|
|
wordFile.setFileRef(fileRef);
|
|
} else {
|
|
wordFile.setFile(bytes);
|
|
}
|
|
wordFile.setFilename(filename);
|
|
return wordFile;
|
|
}
|
|
|
|
@Override
|
|
public FileEnvelopeModel exportDescription(DescriptionModel descriptionModel, String variant) throws InvalidApplicationException, IOException {
|
|
FileFormats fileFormat = FileFormats.of(variant);
|
|
byte[] bytes = this.buildDescriptionWordDocument(descriptionModel);
|
|
String filename = switch (fileFormat) {
|
|
case DOCX -> this.getDescriptionFileName(descriptionModel, ".docx");
|
|
case PDF -> {
|
|
bytes = this.pdfService.convertToPDF(bytes);
|
|
yield this.getDescriptionFileName(descriptionModel, ".pdf");
|
|
}
|
|
default -> throw new InvalidApplicationException("Invalid type " + fileFormat);
|
|
};
|
|
|
|
FileEnvelopeModel wordFile = new FileEnvelopeModel();
|
|
if (this.getConfiguration().isUseSharedStorage()) {
|
|
String fileRef = this.storageService.storeFile(bytes);
|
|
wordFile.setFileRef(fileRef);
|
|
} else {
|
|
wordFile.setFile(bytes);
|
|
}
|
|
wordFile.setFilename(filename);
|
|
return wordFile;
|
|
}
|
|
|
|
|
|
@Override
|
|
public DmpModel importDmp(FileEnvelopeModel envelope) {
|
|
throw new UnsupportedOperationException("import not supported");
|
|
}
|
|
|
|
@Override
|
|
public DescriptionModel importDescription(FileEnvelopeModel envelope) {
|
|
throw new UnsupportedOperationException("import not supported");
|
|
}
|
|
|
|
@Override
|
|
public FileTransformerConfiguration getConfiguration() {
|
|
FileTransformerConfiguration configuration = new FileTransformerConfiguration();
|
|
configuration.setFileTransformerId(this.wordFileTransformerServiceProperties.getTransformerId());
|
|
configuration.setExportVariants(FILE_FORMATS);
|
|
configuration.setImportVariants(null);
|
|
configuration.setExportEntityTypes(FILE_TRANSFORMER_ENTITY_TYPES);
|
|
configuration.setUseSharedStorage(this.wordFileTransformerServiceProperties.isUseSharedStorage());
|
|
return configuration;
|
|
}
|
|
|
|
private List<ReferenceModel> getReferenceModelOfTypeCode(DmpModel dmp, String code, UUID blueprintId){
|
|
List<ReferenceModel> response = new ArrayList<>();
|
|
if (dmp.getReferences() == null) return response;
|
|
for (DmpReferenceModel dmpReferenceModel : dmp.getReferences()){
|
|
if (dmpReferenceModel.getReference() != null && dmpReferenceModel.getReference().getType() != null && dmpReferenceModel.getReference().getType().getCode() != null && dmpReferenceModel.getReference().getType().getCode().equals(code)){
|
|
if (blueprintId == null || (dmpReferenceModel.getData() != null && blueprintId.equals(dmpReferenceModel.getData().getBlueprintFieldId()))) response.add(dmpReferenceModel.getReference());
|
|
|
|
}
|
|
}
|
|
return response;
|
|
}
|
|
|
|
|
|
private byte[] buildDmpWordDocument(DmpModel dmpEntity) throws IOException, InvalidApplicationException {
|
|
if (dmpEntity == null) throw new IllegalArgumentException("DmpEntity required");
|
|
DmpBlueprintModel dmpBlueprintModel = dmpEntity.getDmpBlueprint();
|
|
if (dmpBlueprintModel == null) throw new IllegalArgumentException("DmpBlueprint required");
|
|
if (dmpBlueprintModel.getDefinition() == null) throw new IllegalArgumentException("DmpBlueprint Definition required");
|
|
if (dmpBlueprintModel.getDefinition().getSections() == null) throw new IllegalArgumentException("DmpBlueprint Section required");
|
|
|
|
XWPFDocument document = new XWPFDocument(new FileInputStream(ResourceUtils.getFile(this.wordFileTransformerServiceProperties.getWordDmpTemplate())));
|
|
|
|
this.wordBuilder.fillFirstPage(dmpEntity, null, document, false);
|
|
|
|
int powered_pos = this.wordBuilder.findPosOfPoweredBy(document);
|
|
XWPFParagraph powered_par = null;
|
|
XWPFParagraph argos_img_par = null;
|
|
if (powered_pos != -1) {
|
|
powered_par = document.getParagraphArray(powered_pos);
|
|
argos_img_par = document.getParagraphArray(powered_pos + 1);
|
|
}
|
|
|
|
for (SectionModel sectionModel : dmpBlueprintModel.getDefinition().getSections()) {
|
|
buildDmpSection(dmpEntity, sectionModel, document);
|
|
}
|
|
|
|
if (powered_pos != -1) {
|
|
document.getLastParagraph().setPageBreak(false);
|
|
document.createParagraph();
|
|
document.setParagraph(powered_par, document.getParagraphs().size() - 1);
|
|
|
|
document.createParagraph();
|
|
document.setParagraph(argos_img_par, document.getParagraphs().size() - 1);
|
|
|
|
document.removeBodyElement(powered_pos + 1);
|
|
document.removeBodyElement(powered_pos + 1);
|
|
}
|
|
|
|
this.wordBuilder.fillFooter(dmpEntity, null, document);
|
|
|
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
document.write(out);
|
|
byte[] bytes = out.toByteArray();
|
|
out.close();
|
|
|
|
return bytes;
|
|
}
|
|
|
|
private void buildDmpSection(DmpModel dmpEntity, SectionModel sectionModel, XWPFDocument document) throws InvalidApplicationException {
|
|
this.wordBuilder.addParagraphContent(sectionModel.getOrdinal() + ". " + sectionModel.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO, 0);
|
|
|
|
if (sectionModel.getFields() != null) {
|
|
sectionModel.getFields().sort(Comparator.comparingInt(FieldModel::getOrdinal));
|
|
for (FieldModel fieldModel : sectionModel.getFields()) {
|
|
buildDmpSectionField(dmpEntity, document, fieldModel);
|
|
}
|
|
}
|
|
|
|
final boolean isFinalized = dmpEntity.getStatus() != null && dmpEntity.getStatus().equals(DmpStatus.Finalized);
|
|
final boolean isPublic = dmpEntity.getPublicAfter() != null && dmpEntity.getPublicAfter().isAfter(Instant.now());
|
|
|
|
List<DescriptionModel> descriptions = dmpEntity.getDescriptions().stream()
|
|
.filter(item -> item.getStatus() != DescriptionStatus.Canceled)
|
|
.filter(item -> !isPublic && !isFinalized || item.getStatus() == DescriptionStatus.Finalized)
|
|
.filter(item -> item.getSectionId().equals(sectionModel.getId()))
|
|
.sorted(Comparator.comparing(DescriptionModel::getCreatedAt)).toList();
|
|
|
|
if (!descriptions.isEmpty()) {
|
|
buildSectionDescriptions(document, descriptions);
|
|
}
|
|
}
|
|
|
|
private void buildSectionDescriptions(XWPFDocument document, List<DescriptionModel> descriptions) {
|
|
if (document == null) throw new IllegalArgumentException("Document required");
|
|
if (descriptions == null) throw new IllegalArgumentException("Descriptions required");
|
|
|
|
List<DescriptionTemplateModel> descriptionTemplateModels = descriptions.stream().map(DescriptionModel::getDescriptionTemplate).toList();
|
|
if (descriptionTemplateModels.isEmpty()) return;
|
|
|
|
wordBuilder.addParagraphContent("Descriptions", document, ParagraphStyle.HEADER2, BigInteger.ZERO, 0);
|
|
// for (DescriptionTemplateModel descriptionTemplateModelEntity : descriptionTemplateModels) {
|
|
// XWPFParagraph templateParagraph = document.createParagraph();
|
|
// XWPFRun runTemplateLabel = templateParagraph.createRun();
|
|
// runTemplateLabel.setText("• " + descriptionTemplateModelEntity.getLabel());
|
|
// runTemplateLabel.setColor("116a78");
|
|
// }
|
|
|
|
for (DescriptionModel descriptionModel : descriptions){
|
|
buildSectionDescription(document, descriptionModel);
|
|
}
|
|
}
|
|
|
|
private void buildSectionDescription(XWPFDocument document, DescriptionModel descriptionModel) {
|
|
if (document == null) throw new IllegalArgumentException("Document required");
|
|
if (descriptionModel == null) throw new IllegalArgumentException("DescriptionModel required");
|
|
|
|
DescriptionTemplateModel descriptionTemplateModelFileModel = descriptionModel.getDescriptionTemplate();
|
|
|
|
// Dataset Description custom style.
|
|
XWPFParagraph datasetDescriptionParagraph = document.createParagraph();
|
|
datasetDescriptionParagraph.setStyle("Heading4");
|
|
datasetDescriptionParagraph.setSpacingBetween(1.5);
|
|
XWPFRun datasetDescriptionRun = datasetDescriptionParagraph.createRun();
|
|
datasetDescriptionRun.setText(descriptionModel.getLabel());
|
|
datasetDescriptionRun.setFontSize(15);
|
|
|
|
XWPFParagraph descriptionParagraph = document.createParagraph();
|
|
wordBuilder.addParagraphContent(descriptionModel.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
|
|
|
|
|
XWPFParagraph datasetTemplateParagraph = document.createParagraph();
|
|
XWPFRun runDatasetTemplate1 = datasetTemplateParagraph.createRun();
|
|
runDatasetTemplate1.setText("Template: ");
|
|
runDatasetTemplate1.setColor("000000");
|
|
XWPFRun runDatasetTemplate = datasetTemplateParagraph.createRun();
|
|
runDatasetTemplate.setText(descriptionTemplateModelFileModel != null ? descriptionTemplateModelFileModel.getLabel() : "");
|
|
runDatasetTemplate.setColor("116a78");
|
|
|
|
|
|
XWPFParagraph datasetDescParagraph = document.createParagraph();
|
|
XWPFRun runDatasetDescription1 = datasetDescParagraph.createRun();
|
|
runDatasetDescription1.setText("Type: ");
|
|
runDatasetDescription1.setColor("000000");
|
|
XWPFRun runDatasetDescription = datasetDescParagraph.createRun();
|
|
runDatasetDescription.setText(descriptionTemplateModelFileModel != null && descriptionTemplateModelFileModel.getType() != null ? descriptionTemplateModelFileModel.getType().getName() : "");
|
|
runDatasetDescription.setColor("116a78");
|
|
|
|
document.createParagraph();
|
|
|
|
try {
|
|
this.wordBuilder.build(document, descriptionModel.getDescriptionTemplate(), descriptionModel.getProperties(), new VisibilityServiceImpl(descriptionModel.getVisibilityStates()));
|
|
} catch (IOException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
// Page break at the end of the Dataset.
|
|
XWPFParagraph parBreakDataset = document.createParagraph();
|
|
parBreakDataset.setPageBreak(true);
|
|
}
|
|
|
|
|
|
private void buildDmpSectionField(DmpModel dmpEntity, XWPFDocument document, FieldModel fieldModel) throws InvalidApplicationException {
|
|
if (fieldModel == null) throw new IllegalArgumentException("Field required");
|
|
if (fieldModel.getCategory() == null) throw new IllegalArgumentException("Field is required" + fieldModel.getId() + " " + fieldModel.getLabel());
|
|
switch (fieldModel.getCategory()){
|
|
case System -> {
|
|
buildDmpSectionSystemField(dmpEntity, document, (SystemFieldModel) fieldModel);
|
|
}
|
|
case Extra -> buildDmpSectionExtraField(dmpEntity, document, (ExtraFieldModel) fieldModel);
|
|
case ReferenceType -> {
|
|
buildDmpSectionReferenceTypeField(dmpEntity, document, (ReferenceTypeFieldModel) fieldModel);
|
|
}
|
|
default -> throw new InvalidApplicationException("Invalid type " + fieldModel.getCategory());
|
|
}
|
|
}
|
|
|
|
private void buildDmpSectionReferenceTypeField(DmpModel dmpEntity, XWPFDocument document, ReferenceTypeFieldModel referenceField) {
|
|
if (referenceField == null) throw new IllegalArgumentException("ReferenceField required");
|
|
if (dmpEntity == null) throw new IllegalArgumentException("DmpEntity required");
|
|
if (document == null) throw new IllegalArgumentException("Document required");
|
|
if (referenceField.getReferenceType() == null) throw new IllegalArgumentException("ReferenceField type required");
|
|
if (referenceField.getReferenceType().getCode() == null && !referenceField.getReferenceType().getCode().isBlank()) throw new IllegalArgumentException("ReferenceField type code required");
|
|
|
|
XWPFParagraph systemFieldParagraph = document.createParagraph();
|
|
XWPFRun runSyStemFieldTitle = systemFieldParagraph.createRun();
|
|
runSyStemFieldTitle.setText(referenceField.getLabel() + ": ");
|
|
runSyStemFieldTitle.setColor("000000");
|
|
|
|
List<ReferenceModel> referenceModels = this.getReferenceModelOfTypeCode(dmpEntity, referenceField.getReferenceType().getCode(), referenceField.getId());
|
|
for (ReferenceModel reference : referenceModels) {
|
|
XWPFRun runResearcher = systemFieldParagraph.createRun();
|
|
if (this.wordFileTransformerServiceProperties.getResearcherReferenceCode().equalsIgnoreCase(referenceField.getReferenceType().getCode()) ||
|
|
this.wordFileTransformerServiceProperties.getOrganizationReferenceCode().equalsIgnoreCase(referenceField.getReferenceType().getCode())
|
|
) runResearcher.addBreak();
|
|
if (this.wordFileTransformerServiceProperties.getLicenceReferenceCode().equalsIgnoreCase(referenceField.getReferenceType().getCode())) runResearcher.setText(reference.getReference());
|
|
else runResearcher.setText(reference.getLabel());
|
|
runResearcher.setColor("116a78");
|
|
}
|
|
}
|
|
|
|
private void buildDmpSectionSystemField(DmpModel dmpEntity, XWPFDocument document, SystemFieldModel systemField) throws InvalidApplicationException {
|
|
if (systemField == null) throw new IllegalArgumentException("SystemField required");
|
|
if (dmpEntity == null) throw new IllegalArgumentException("DmpEntity required");
|
|
if (document == null) throw new IllegalArgumentException("Document required");
|
|
|
|
if (DmpBlueprintSystemFieldType.Language.equals(systemField.getSystemFieldType()) || DmpBlueprintSystemFieldType.User.equals(systemField.getSystemFieldType())) return;
|
|
|
|
|
|
XWPFParagraph systemFieldParagraph = document.createParagraph();
|
|
XWPFRun runSyStemFieldTitle = systemFieldParagraph.createRun();
|
|
runSyStemFieldTitle.setText(systemField.getLabel() + ": ");
|
|
runSyStemFieldTitle.setColor("000000");
|
|
|
|
switch (systemField.getSystemFieldType()) {
|
|
case Title:
|
|
XWPFRun runTitle = systemFieldParagraph.createRun();
|
|
runTitle.setText(dmpEntity.getLabel());
|
|
runTitle.setColor("116a78");
|
|
break;
|
|
case Description:
|
|
wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
|
break;
|
|
case AccessRights:
|
|
if (dmpEntity.getAccessType() != null) {
|
|
XWPFRun runAccessRights = systemFieldParagraph.createRun();
|
|
runAccessRights.setText(dmpEntity.getAccessType().equals(DmpAccessType.Public) ? "Public" : "Restricted"); //TODO
|
|
runAccessRights.setColor("116a78");
|
|
}
|
|
break;
|
|
case Contact:
|
|
if (dmpEntity.getCreator() != null) {
|
|
XWPFRun runContact = systemFieldParagraph.createRun();
|
|
runContact.setText(dmpEntity.getCreator() == null ? "" : dmpEntity.getCreator().getName());
|
|
runContact.setColor("116a78");
|
|
}
|
|
break;
|
|
case User:
|
|
case Language:
|
|
break;
|
|
default:
|
|
throw new InvalidApplicationException("Invalid type " + systemField.getSystemFieldType());
|
|
}
|
|
}
|
|
|
|
private void buildDmpSectionExtraField(DmpModel dmpEntity, XWPFDocument document, ExtraFieldModel extraFieldModel) throws InvalidApplicationException {
|
|
if (extraFieldModel == null) throw new IllegalArgumentException("ExtraFieldModel required");
|
|
XWPFParagraph extraFieldParagraph = document.createParagraph();
|
|
extraFieldParagraph.setSpacingBetween(1.0);
|
|
XWPFRun runExtraFieldLabel = extraFieldParagraph.createRun();
|
|
runExtraFieldLabel.setText(extraFieldModel.getLabel() + ": ");
|
|
runExtraFieldLabel.setColor("000000");
|
|
|
|
XWPFRun runExtraFieldInput = extraFieldParagraph.createRun();
|
|
DmpBlueprintValueModel dmpBlueprintValueModel = dmpEntity.getProperties() != null && dmpEntity.getProperties().getDmpBlueprintValues() != null ? dmpEntity.getProperties().getDmpBlueprintValues().stream().filter(x -> extraFieldModel.getId().equals(x.getFieldId())).findFirst().orElse(null) : null;
|
|
if (dmpBlueprintValueModel != null && dmpBlueprintValueModel.getValue() != null) {
|
|
switch (extraFieldModel.getDataType()) {
|
|
case RichTex:
|
|
wordBuilder.addParagraphContent(dmpBlueprintValueModel.getValue(), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
|
break;
|
|
case Number:
|
|
case Text:
|
|
case Date:
|
|
runExtraFieldInput.setText(dmpBlueprintValueModel.getValue());
|
|
runExtraFieldInput.setColor("116a78");
|
|
break;
|
|
default:
|
|
throw new InvalidApplicationException("Invalid type " + extraFieldModel.getDataType());
|
|
}
|
|
}
|
|
}
|
|
|
|
private String getDmpFileName(DmpModel dmpModel, String extension){
|
|
if (dmpModel == null) throw new IllegalArgumentException("DmpEntity required");
|
|
|
|
List<ReferenceModel> grants = this.getReferenceModelOfTypeCode(dmpModel, this.wordFileTransformerServiceProperties.getGrantReferenceCode(), null);
|
|
String fileName;
|
|
if (!grants.isEmpty() && grants.getFirst().getLabel() != null) {
|
|
fileName = "DMP_" + grants.getFirst().getLabel();
|
|
}
|
|
else {
|
|
fileName = "DMP_" + dmpModel.getLabel();
|
|
}
|
|
fileName += "_" + dmpModel.getVersion();
|
|
return fileName + extension;
|
|
}
|
|
|
|
private byte[] buildDescriptionWordDocument(DescriptionModel descriptionModel) throws IOException {
|
|
if (descriptionModel == null) throw new IllegalArgumentException("DmpEntity required");
|
|
DmpModel dmpEntity = descriptionModel.getDmp();
|
|
if (dmpEntity == null) throw new IllegalArgumentException("Dmp is invalid");
|
|
XWPFDocument document = new XWPFDocument(new FileInputStream(ResourceUtils.getFile(this.wordFileTransformerServiceProperties.getWordDescriptionTemplate())));
|
|
|
|
this.wordBuilder.fillFirstPage(dmpEntity, descriptionModel, document, true);
|
|
this.wordBuilder.fillFooter(dmpEntity, descriptionModel, document);
|
|
|
|
int powered_pos = this.wordBuilder.findPosOfPoweredBy(document);
|
|
XWPFParagraph powered_par = null;
|
|
XWPFParagraph argos_img_par = null;
|
|
if(powered_pos != -1) {
|
|
powered_par = document.getParagraphArray(powered_pos);
|
|
argos_img_par = document.getParagraphArray(powered_pos + 1);
|
|
}
|
|
|
|
this.wordBuilder.build(document, descriptionModel.getDescriptionTemplate(), descriptionModel.getProperties(), new VisibilityServiceImpl(descriptionModel.getVisibilityStates()));
|
|
|
|
if(powered_pos != -1) {
|
|
document.getLastParagraph().setPageBreak(false);
|
|
document.createParagraph();
|
|
document.setParagraph(powered_par, document.getParagraphs().size() - 1);
|
|
|
|
document.createParagraph();
|
|
document.setParagraph(argos_img_par, document.getParagraphs().size() - 1);
|
|
|
|
document.removeBodyElement(powered_pos + 1);
|
|
document.removeBodyElement(powered_pos + 1);
|
|
}
|
|
|
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
document.write(out);
|
|
byte[] bytes = out.toByteArray();
|
|
out.close();
|
|
|
|
return bytes;
|
|
}
|
|
|
|
private String getDescriptionFileName(DescriptionModel descriptionModel, String extension){
|
|
if (descriptionModel == null) throw new IllegalArgumentException("DmpEntity required");
|
|
String fileName = descriptionModel.getLabel().replaceAll("[^a-zA-Z0-9+ ]", "");
|
|
|
|
return fileName + extension;
|
|
}
|
|
}
|