org.geomajas.plugin.printing.command.print.PrintGetTemplateCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.geomajas.plugin.printing.command.print.PrintGetTemplateCommand.java

Source

/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2013 Geosparc nv, http://www.geosparc.com/, Belgium.
 *
 * The program is available in open source according to the GNU Affero
 * General Public License. All contributions in this program are covered
 * by the Geomajas Contributors License Agreement. For full licensing
 * details, see LICENSE.txt in the project root.
 */
package org.geomajas.plugin.printing.command.print;

import org.geomajas.command.Command;
import org.geomajas.plugin.printing.command.dto.PrintGetTemplateRequest;
import org.geomajas.plugin.printing.command.dto.PrintGetTemplateResponse;
import org.geomajas.plugin.printing.command.dto.PrintTemplateInfo;
import org.geomajas.plugin.printing.component.PageComponent;
import org.geomajas.plugin.printing.component.PrintComponent;
import org.geomajas.plugin.printing.component.impl.LabelComponentImpl;
import org.geomajas.plugin.printing.component.impl.LegendComponentImpl;
import org.geomajas.plugin.printing.component.impl.LegendItemComponentImpl;
import org.geomajas.plugin.printing.component.impl.MapComponentImpl;
import org.geomajas.plugin.printing.component.service.PrintDtoConverterService;
import org.geomajas.plugin.printing.configuration.PrintTemplate;
import org.geomajas.plugin.printing.document.Document.Format;
import org.geomajas.plugin.printing.document.SinglePageDocument;
import org.geomajas.plugin.printing.service.PrintService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.lowagie.text.PageSize;
import com.lowagie.text.Rectangle;

/**
 * <p>
 * This command returns a link to a generated template-based pdf file of the current view.
 * </p>
 * 
 * @author Oliver May
 */
@Component()
public class PrintGetTemplateCommand implements Command<PrintGetTemplateRequest, PrintGetTemplateResponse> {

    private final Logger log = LoggerFactory.getLogger(PrintGetTemplateCommand.class);

    @Autowired
    private PrintDtoConverterService converterService;

    @Autowired
    private PrintService printService;

    public PrintGetTemplateResponse getEmptyCommandResponse() {
        return new PrintGetTemplateResponse();
    }

    public void execute(PrintGetTemplateRequest request, PrintGetTemplateResponse response) throws Exception {
        // you dirty hack you...
        PrintTemplateInfo template = request.getTemplate();
        PageComponent page = (PageComponent) converterService.toInternal(template.getPage());
        MapComponentImpl mapComponent = (MapComponentImpl) page.getChild(PrintTemplate.MAP);
        if (mapComponent != null) {
            LegendComponentImpl legendComponent = (LegendComponentImpl) mapComponent.getChild(PrintTemplate.LEGEND);
            if (legendComponent != null) {
                LabelComponentImpl lab = (LabelComponentImpl) legendComponent.getChild(PrintTemplate.TITLE);
                if (lab != null) {
                    lab.setText(legendComponent.getTitle());
                }
                // need to do this before setSizeAndFit
                adjustLegendFontSizeForSmallPageSizes(request, legendComponent);
            }
        }

        if (request.getPageSize() != null) {
            page.setSize(request.getPageSize(), true);
        }
        SinglePageDocument pdfDoc = new SinglePageDocument(page, null);
        // layout the document
        pdfDoc.layout(Format.PDF);
        // Add document to container
        String documentId = printService.putDocument(pdfDoc);
        response.setDocumentId(documentId);
    }

    private void adjustLegendFontSizeForSmallPageSizes(PrintGetTemplateRequest request, LegendComponentImpl lc) {
        // adjust fontsize legend for small pagesizes
        float relPSize = getPageSizeRelativeToA3(request); // A3 == 100% fontsize
        if (relPSize < 1) {
            java.awt.Font newFont = lc.getFont().deriveFont(lc.getFont().getSize() * 0.8f);
            lc.setFont(newFont);
            log.debug("PDF: changed fontsize to: {}", lc.getFont().getSize());
            for (PrintComponent<?> pc : lc.getChildren()) {
                if (pc instanceof LabelComponentImpl) {
                    ((LabelComponentImpl) pc).setFont(newFont.deriveFont(newFont.getSize() * 1.25f));
                } else if (pc instanceof LegendItemComponentImpl) {
                    for (PrintComponent<?> pc2 : pc.getChildren()) {
                        if (pc2 instanceof LabelComponentImpl) {
                            ((LabelComponentImpl) pc2).setFont(newFont);
                        }
                    }
                }
            }
        }
    }

    private float getPageSizeRelativeToA3(PrintGetTemplateRequest request) {
        Rectangle r;
        if (request.getPageSize() != null) {
            r = PageSize.getRectangle(request.getPageSize());
        } else {
            float width = request.getTemplate().getPage().getLayoutConstraint().getWidth();
            float height = request.getTemplate().getPage().getLayoutConstraint().getHeight();
            r = new Rectangle(0, 0, width, height);
        }
        return (r.getWidth() / PageSize.A3.getWidth() + r.getHeight() / PageSize.A3.getHeight()) / 2;
    }

}