use of com.axelor.apps.base.db.Print in project axelor-open-suite by axelor.
the class PrintServiceImpl method generatePDF.
@Override
@Transactional
public Map<String, Object> generatePDF(Print print) throws AxelorException {
try {
print = printRepo.find(print.getId());
String html = generateHtml(print);
ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
try (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(pdfOutputStream))) {
pdfDoc.setDefaultPageSize(print.getDisplayTypeSelect() == PrintRepository.DISPLAY_TYPE_LANDSCAPE ? PageSize.A4.rotate() : PageSize.A4);
if (print.getPrintPdfFooter() != null && !print.getHidePrintSettings()) {
com.itextpdf.layout.Document doc = new com.itextpdf.layout.Document(pdfDoc);
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new TableFooterEventHandler(doc, print));
}
ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setBaseUri(attachmentPath);
HtmlConverter.convertToPdf(html, pdfDoc, converterProperties);
}
String documentName = (StringUtils.notEmpty(print.getDocumentName()) ? print.getDocumentName() : "") + "-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + FILE_EXTENSION_PDF;
InputStream pdfInputStream = new ByteArrayInputStream(pdfOutputStream.toByteArray());
MetaFile metaFile = metaFiles.upload(pdfInputStream, documentName);
File file = MetaFiles.getPath(metaFile).toFile();
String fileLink = PdfTool.getFileLinkFromPdfFile(PdfTool.printCopiesToFile(file, 1), metaFile.getFileName());
if (ObjectUtils.notEmpty(file) && file.exists() && (print.getAttach() || StringUtils.notEmpty(print.getMetaFileField()))) {
Class<? extends Model> modelClass = (Class<? extends Model>) Class.forName(print.getMetaModel().getFullName());
Model objectModel = JPA.find(modelClass, print.getObjectId());
if (ObjectUtils.notEmpty(objectModel)) {
if (print.getAttach()) {
metaFiles.attach(metaFile, documentName, objectModel);
}
if (StringUtils.notEmpty(print.getMetaFileField())) {
saveMetaFileInModel(modelClass, objectModel, metaFile, print.getMetaFileField());
}
}
}
if (CollectionUtils.isNotEmpty(print.getPrintSet())) {
for (Print subPrint : print.getPrintSet()) {
generatePDF(subPrint);
}
}
return ActionView.define(documentName).add("html", fileLink).map();
} catch (IOException | ClassNotFoundException e) {
throw new AxelorException(e, TraceBackRepository.CATEGORY_INCONSISTENCY);
}
}
use of com.axelor.apps.base.db.Print in project axelor-open-suite by axelor.
the class PrintServiceImpl method generateHtml.
protected String generateHtml(Print print) {
StringBuilder htmlBuilder = new StringBuilder();
htmlBuilder.append("<!DOCTYPE html>");
htmlBuilder.append("<html>");
htmlBuilder.append("<head>");
htmlBuilder.append("<title></title>");
htmlBuilder.append("<meta charset=\"utf-8\"/>");
htmlBuilder.append("<style type=\"text/css\">");
htmlBuilder.append("</style>");
htmlBuilder.append("</head>");
htmlBuilder.append("<body>");
if (!print.getHidePrintSettings()) {
Company company = print.getCompany();
Integer logoPosition = print.getLogoPositionSelect();
String pdfHeader = print.getPrintPdfHeader() != null ? print.getPrintPdfHeader() : "";
String imageTag = "";
String logoWidth = print.getLogoWidth() != null ? "width: " + print.getLogoWidth() + ";" : "width: 50%;";
String headerWidth = print.getHeaderContentWidth() != null ? "width: " + print.getHeaderContentWidth() + ";" : "width: 40%;";
if (company != null && company.getLogo() != null && logoPosition != PrintRepository.LOGO_POSITION_NONE && new File(attachmentPath + company.getLogo().getFilePath()).exists()) {
String width = company.getWidth() != 0 ? "width='" + company.getWidth() + "px'" : "";
String height = company.getHeight() != 0 ? company.getHeight() + "px" : "71px";
imageTag = "<img src='" + company.getLogo().getFilePath() + "' height='" + height + "' " + width + "/>";
}
switch(logoPosition) {
case PrintRepository.LOGO_POSITION_LEFT:
htmlBuilder.append("<table style='width: 100%;'><tr><td valign='top' style='text-align: left; " + logoWidth + "'>" + imageTag + "</td><td valign='top' style='width: 10%'></td><td valign='top' style='text-align: left; " + headerWidth + "'>" + pdfHeader + "</td></tr></table>");
break;
case PrintRepository.LOGO_POSITION_CENTER:
htmlBuilder.append("<table style=\"width: 100%;\"><tr><td valign='top' style='width: 33.33%;'></td><td valign='top' style='text-align: center; width: 33.33%;'>" + imageTag + "</td><td valign='top' style='text-align: left; width: 33.33%;'>" + pdfHeader + "</td></tr></table>");
break;
case PrintRepository.LOGO_POSITION_RIGHT:
htmlBuilder.append("<table style='width: 100%;'><tr><td valign='top' style='text-align: left; " + headerWidth + "'>" + pdfHeader + "</td><td valign='top' style='width: 10%'></td><td valign='top' style='text-align: center; " + logoWidth + "'>" + imageTag + "</td></tr></table>");
break;
default:
htmlBuilder.append("<table style='width: 100%;'><tr><td style='width: 60%;'></td><td valign='top' style='text-align: left; width: 40%'>" + pdfHeader + "</td></tr></table>");
break;
}
if (!pdfHeader.isEmpty() || !imageTag.isEmpty()) {
htmlBuilder.append("<hr>");
}
}
if (ObjectUtils.notEmpty(print)) {
List<PrintLine> printLineList = print.getPrintLineList();
if (CollectionUtils.isNotEmpty(printLineList)) {
for (PrintLine printLine : printLineList) {
htmlBuilder.append(printLine.getIsWithPageBreakAfter() ? "<div style=\"page-break-after: always;\">" : "<div>");
htmlBuilder.append("<table>");
htmlBuilder.append("<tr>");
if (printLine.getIsSignature()) {
htmlBuilder.append("<td> </td></tr></table></div>");
continue;
}
Integer nbColumns = printLine.getNbColumns() == 0 ? 1 : printLine.getNbColumns();
for (int i = 0; i < nbColumns; i++) {
htmlBuilder.append("<td style=\"padding: 0px 10px 0px 10px\">");
if (StringUtils.notEmpty(printLine.getTitle())) {
htmlBuilder.append(printLine.getTitle());
}
if (StringUtils.notEmpty(printLine.getContent())) {
htmlBuilder.append(printLine.getContent());
}
htmlBuilder.append("</td>");
}
htmlBuilder.append("</tr>");
htmlBuilder.append("</table>");
htmlBuilder.append("</div>");
}
}
}
htmlBuilder.append("</body>");
htmlBuilder.append("</html>");
return htmlBuilder.toString();
}
use of com.axelor.apps.base.db.Print in project axelor-open-suite by axelor.
the class PrintServiceImpl method attachMetaFiles.
@Override
public void attachMetaFiles(Print print, Set<MetaFile> metaFiles) {
Preconditions.checkNotNull(print.getId());
if (metaFiles == null || metaFiles.isEmpty()) {
return;
}
LOG.debug("Add metafiles to object {} : {}", Print.class.getName(), print.getId());
for (MetaFile metaFile : metaFiles) {
Beans.get(MetaFiles.class).attach(metaFile, metaFile.getFileName(), print);
}
}
use of com.axelor.apps.base.db.Print in project axelor-open-suite by axelor.
the class PrintTemplateServiceImpl method processPrintTemplateLineList.
private void processPrintTemplateLineList(List<PrintTemplateLine> templateLineList, Print print, PrintLine parent, Context scriptContext, TemplateMaker maker, int level) throws AxelorException {
int seq = 1;
if (ObjectUtils.notEmpty(templateLineList.get(0)) && ObjectUtils.notEmpty(templateLineList.get(0).getSequence())) {
seq = templateLineList.get(0).getSequence().intValue();
}
for (PrintTemplateLine printTemplateLine : templateLineList) {
if (printTemplateLine.getIgnoreTheLine()) {
continue;
}
try {
boolean present = true;
if (StringUtils.notEmpty(printTemplateLine.getConditions())) {
Object evaluation = templateContextService.computeTemplateContext(printTemplateLine.getConditions(), scriptContext);
if (evaluation instanceof Boolean) {
present = (Boolean) evaluation;
} else {
throw new AxelorException(TraceBackRepository.CATEGORY_INCONSISTENCY, I18n.get(IExceptionMessage.PRINT_TEMPLATE_CONDITION_MUST_BE_BOOLEAN));
}
}
if (present) {
++rank;
String title = null;
String content = null;
if (StringUtils.notEmpty(printTemplateLine.getTitle())) {
maker.setTemplate(printTemplateLine.getTitle());
addSequencesInContext(maker, level, seq, parent);
title = maker.make();
}
if (StringUtils.notEmpty(printTemplateLine.getContent())) {
maker.setTemplate(printTemplateLine.getContent());
addSequencesInContext(maker, level, seq, parent);
if (CollectionUtils.isNotEmpty(printTemplateLine.getTemplateContextList())) {
for (TemplateContext templateContext : printTemplateLine.getTemplateContextList()) {
Object result = templateContextService.computeTemplateContext(templateContext, scriptContext);
maker.addContext(templateContext.getName(), result);
}
}
content = maker.make();
}
PrintLine printLine = new PrintLine();
printLine.setRank(rank);
printLine.setSequence(seq);
printLine.setTitle(title);
printLine.setContent(content);
printLine.setIsEditable(printTemplateLine.getIsEditable());
printLine.setIsSignature(printTemplateLine.getIsSignature());
printLine.setNbColumns(printTemplateLine.getNbColumns());
printLine.setParent(parent);
printLine.setIsWithPageBreakAfter(printTemplateLine.getIsWithPageBreakAfter());
if (CollectionUtils.isNotEmpty(printTemplateLine.getPrintTemplateLineList())) {
processPrintTemplateLineList(printTemplateLine.getPrintTemplateLineList(), print, printLine, scriptContext, maker, level + 1);
}
print.addPrintLineListItem(printLine);
seq++;
}
} catch (Exception e) {
throw new AxelorException(TraceBackRepository.CATEGORY_INCONSISTENCY, I18n.get(IExceptionMessage.PRINT_TEMPLATE_ERROR_ON_LINE_WITH_SEQUENCE_AND_TITLE), printTemplateLine.getSequence(), printTemplateLine.getTitle());
}
}
}
use of com.axelor.apps.base.db.Print in project axelor-open-suite by axelor.
the class PrintTemplateServiceImpl method generatePrint.
@SuppressWarnings("unchecked")
@Override
@Transactional(rollbackOn = { AxelorException.class, Exception.class })
public Print generatePrint(Long objectId, PrintTemplate printTemplate) throws AxelorException, IOException, ClassNotFoundException {
MetaModel metaModel = printTemplate.getMetaModel();
if (metaModel == null) {
return null;
}
String model = metaModel.getFullName();
String simpleModel = metaModel.getName();
// debug
LOG.debug("");
LOG.debug("model : {}", model);
LOG.debug("simpleModel : {}", simpleModel);
LOG.debug("object id : {}", objectId);
LOG.debug("printTemplate : {}", printTemplate);
LOG.debug("");
Locale locale = Optional.ofNullable(printTemplate.getLanguage()).map(Language::getCode).map(Locale::new).orElseGet(AppFilter::getLocale);
TemplateMaker maker = initMaker(objectId, model, simpleModel, locale);
Print print = new Print();
if (StringUtils.notEmpty(printTemplate.getDocumentName())) {
maker.setTemplate(printTemplate.getDocumentName());
print.setDocumentName(maker.make());
}
print.setMetaModel(metaModel);
print.setObjectId(objectId);
print.setCompany(printTemplate.getCompany());
print.setLanguage(printTemplate.getLanguage());
print.setHidePrintSettings(printTemplate.getHidePrintSettings());
print.setFormatSelect(printTemplate.getFormatSelect());
print.setDisplayTypeSelect(printTemplate.getDisplayTypeSelect());
print.setIsEditable(printTemplate.getIsEditable());
print.setAttach(printTemplate.getAttach());
print.setMetaFileField(printTemplate.getMetaFileField());
if (!printTemplate.getHidePrintSettings()) {
if (StringUtils.notEmpty(printTemplate.getPrintTemplatePdfHeader())) {
maker.setTemplate(printTemplate.getPrintTemplatePdfHeader());
print.setPrintPdfHeader(maker.make());
}
if (StringUtils.notEmpty(printTemplate.getPrintTemplatePdfFooter())) {
maker.setTemplate(printTemplate.getPrintTemplatePdfFooter());
print.setPrintPdfFooter(maker.make());
print.setFooterFontSize(printTemplate.getFooterFontSize());
print.setFooterFontType(printTemplate.getFooterFontType());
print.setFooterTextAlignment(printTemplate.getFooterTextAlignment());
print.setIsFooterUnderLine(printTemplate.getIsFooterUnderLine());
print.setFooterFontColor(printTemplate.getFooterFontColor());
}
print.setLogoPositionSelect(printTemplate.getLogoPositionSelect());
print.setLogoWidth(printTemplate.getLogoWidth());
print.setHeaderContentWidth(printTemplate.getHeaderContentWidth());
}
Context scriptContext = null;
if (StringUtils.notEmpty(model)) {
Class<? extends Model> modelClass = (Class<? extends Model>) Class.forName(model);
Model modelObject = JPA.find(modelClass, objectId);
if (ObjectUtils.notEmpty(modelObject)) {
scriptContext = new Context(Mapper.toMap(modelObject), modelClass);
}
}
rank = 0;
int level = 1;
if (CollectionUtils.isNotEmpty(printTemplate.getPrintTemplateLineList())) {
processPrintTemplateLineList(printTemplate.getPrintTemplateLineList(), print, null, scriptContext, maker, level);
}
if (CollectionUtils.isNotEmpty(printTemplate.getPrintTemplateSet())) {
for (PrintTemplate subPrintTemplate : printTemplate.getPrintTemplateSet()) {
Long subObjectId = objectId;
if (StringUtils.notEmpty(subPrintTemplate.getMetaModelDefaultPath())) {
Object subMetaModelObject = templateContextService.computeTemplateContext(subPrintTemplate.getMetaModelDefaultPath(), scriptContext);
Class<? extends Model> subModelClass = (Class<? extends Model>) Class.forName(subPrintTemplate.getMetaModel().getFullName());
subObjectId = (Long) Mapper.of(subModelClass).get(subMetaModelObject, "id");
}
Print subPrint = generatePrint(subObjectId, subPrintTemplate);
print.addPrintSetItem(subPrint);
}
}
print = printRepo.save(print);
printService.attachMetaFiles(print, getMetaFiles(maker, printTemplate));
return print;
}
Aggregations