Search in sources :

Example 1 with Print

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);
    }
}
Also used : ConverterProperties(com.itextpdf.html2pdf.ConverterProperties) AxelorException(com.axelor.exception.AxelorException) PdfWriter(com.itextpdf.kernel.pdf.PdfWriter) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) PdfDocument(com.itextpdf.kernel.pdf.PdfDocument) PdfDocument(com.itextpdf.kernel.pdf.PdfDocument) Print(com.axelor.apps.base.db.Print) ByteArrayInputStream(java.io.ByteArrayInputStream) Model(com.axelor.db.Model) MetaFile(com.axelor.meta.db.MetaFile) File(java.io.File) MetaFile(com.axelor.meta.db.MetaFile) Transactional(com.google.inject.persist.Transactional)

Example 2 with Print

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>&nbsp;</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();
}
Also used : Company(com.axelor.apps.base.db.Company) PrintLine(com.axelor.apps.base.db.PrintLine) File(java.io.File) MetaFile(com.axelor.meta.db.MetaFile) Print(com.axelor.apps.base.db.Print)

Example 3 with Print

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);
    }
}
Also used : Print(com.axelor.apps.base.db.Print) MetaFiles(com.axelor.meta.MetaFiles) MetaFile(com.axelor.meta.db.MetaFile)

Example 4 with 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());
        }
    }
}
Also used : AxelorException(com.axelor.exception.AxelorException) PrintLine(com.axelor.apps.base.db.PrintLine) PrintTemplateLine(com.axelor.apps.base.db.PrintTemplateLine) TemplateContext(com.axelor.apps.message.db.TemplateContext) Print(com.axelor.apps.base.db.Print) AxelorException(com.axelor.exception.AxelorException) IOException(java.io.IOException)

Example 5 with Print

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;
}
Also used : Locale(java.util.Locale) TemplateContext(com.axelor.apps.message.db.TemplateContext) Context(com.axelor.rpc.Context) PrintTemplate(com.axelor.apps.base.db.PrintTemplate) Print(com.axelor.apps.base.db.Print) Print(com.axelor.apps.base.db.Print) MetaModel(com.axelor.meta.db.MetaModel) AppFilter(com.axelor.app.internal.AppFilter) Language(com.axelor.apps.base.db.Language) TemplateMaker(com.axelor.tool.template.TemplateMaker) Model(com.axelor.db.Model) MetaModel(com.axelor.meta.db.MetaModel) Transactional(com.google.inject.persist.Transactional)

Aggregations

Print (com.axelor.apps.base.db.Print)7 AxelorException (com.axelor.exception.AxelorException)4 PrintTemplate (com.axelor.apps.base.db.PrintTemplate)3 Model (com.axelor.db.Model)3 MetaFile (com.axelor.meta.db.MetaFile)3 PrintLine (com.axelor.apps.base.db.PrintLine)2 TemplateContext (com.axelor.apps.message.db.TemplateContext)2 Context (com.axelor.rpc.Context)2 Transactional (com.google.inject.persist.Transactional)2 File (java.io.File)2 IOException (java.io.IOException)2 AppFilter (com.axelor.app.internal.AppFilter)1 Company (com.axelor.apps.base.db.Company)1 Language (com.axelor.apps.base.db.Language)1 PrintTemplateLine (com.axelor.apps.base.db.PrintTemplateLine)1 Wizard (com.axelor.apps.base.db.Wizard)1 PrintTemplateService (com.axelor.apps.base.service.PrintTemplateService)1 MetaFiles (com.axelor.meta.MetaFiles)1 MetaModel (com.axelor.meta.db.MetaModel)1 TemplateMaker (com.axelor.tool.template.TemplateMaker)1