All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gutenberg.itext.support.FirstPageRenderer Maven / Gradle / Ivy

package gutenberg.itext.support;

import com.google.common.base.Supplier;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import gutenberg.itext.FontCopier;
import gutenberg.itext.ITextContext;
import gutenberg.itext.SimpleEmitter;
import gutenberg.itext.Styles;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author @aloyer
 */
public class FirstPageRenderer implements SimpleEmitter {

    public static final String FIRST_PAGE_TITLE_FONT = "first-page-title-font";
    public static final String FIRST_PAGE_SUBJECT_FONT = "first-page-subject-font";

    private Logger log = LoggerFactory.getLogger(FirstPageRenderer.class);

    private final String title;
    private final String subject;

    public FirstPageRenderer(String title, String subject) {
        this.title = title;
        this.subject = subject;
    }

    @Override
    public void emit(ITextContext context) {
        try {
            Document document = context.getDocument();
            appendMainPage(context, document);
            document.newPage();
        } catch (DocumentException e) {
            log.warn("Failed to render cover page", e);
        }
    }

    private void appendMainPage(ITextContext context, Document document) throws DocumentException {
        Paragraph mainPage = new Paragraph();
        appendTitle(context, mainPage);
        appendSubject(context, mainPage);
        document.add(mainPage);
    }

    private void appendSubject(ITextContext context, Paragraph preface) {
        if (StringUtils.isEmpty(subject)) {
            return;
        }

        Styles styles = context.styles();
        Font font = styles.getFont(FIRST_PAGE_SUBJECT_FONT).or(subjectFont(styles));
        for (String titlePart : subject.split("[\n\r]+")) {
            Paragraph paragraph = new Paragraph(titlePart, font);
            paragraph.setAlignment(Element.ALIGN_RIGHT);
            paragraph.setSpacingAfter(15.0f);
            preface.add(paragraph);
        }
    }

    private Supplier subjectFont(final Styles styles) {
        return new Supplier() {
            @Override
            public Font get() {
                return FontCopier
                            .copyFont(styles.defaultFont())
                            .color(BaseColor.DARK_GRAY)
                            .size(18f)
                            .get();
            }
        };
    }

    private void appendTitle(ITextContext context, Paragraph preface) {
        if (StringUtils.isEmpty(title)) {
            return;
        }

        Styles styles = context.styles();
        Font font = styles.getFont(FIRST_PAGE_TITLE_FONT).or(titleFont(styles));
        Paragraph paragraph = null;
        for (String titlePart : title.split("[\n\r]+")) {
            paragraph = new Paragraph(titlePart, font);
            paragraph.setAlignment(Element.ALIGN_RIGHT);
            paragraph.setSpacingAfter(15.0f);
            preface.add(paragraph);
        }

        if (paragraph != null) {
            paragraph.setSpacingAfter(30.0f);
        }
    }

    private Supplier titleFont(final Styles styles) {
        return new Supplier() {
            @Override
            public Font get() {
                return FontCopier
                        .copyFont(styles.defaultFont())
                        .color(styles.defaultColor())
                        .size(32f)
                        .get();
            }
        };
    }


}