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

gutenberg.itext.emitter.SourceCodeLaTeXExtension Maven / Gradle / Ivy

package gutenberg.itext.emitter;

import com.itextpdf.awt.PdfGraphics2D;
import com.itextpdf.text.ImgTemplate;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
import gutenberg.itext.ITextContext;
import gutenberg.itext.PygmentsAdapter;
import gutenberg.itext.model.SourceCode;
import gutenberg.itext.pegdown.JLaTeXmathFontMapper;
import gutenberg.util.Strings;
import gutenberg.util.WrappedRuntimeException;
import org.scilab.forge.jlatexmath.TeXConstants;
import org.scilab.forge.jlatexmath.TeXFormula;
import org.scilab.forge.jlatexmath.TeXIcon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Insets;

import static gutenberg.itext.ITextUtils.scaleToFit;
import static java.util.Arrays.asList;

/**
 * @author @aloyer
 */
public class SourceCodeLaTeXExtension implements SourceCodeEmitterExtension {
    private final Logger log = LoggerFactory.getLogger(SourceCodeLaTeXExtension.class);
    private final PygmentsAdapter pygments;
    private final Color foreground;

    public SourceCodeLaTeXExtension(PygmentsAdapter pygments) {
        this(pygments, Color.DARK_GRAY);
    }

    public SourceCodeLaTeXExtension(PygmentsAdapter pygments, Color foreground) {
        this.pygments = pygments;
        this.foreground = foreground;
    }

    @Override
    public boolean accepts(String lang) {
        return asList("formula", "math", "latex-math").contains(lang.toLowerCase());
    }

    @Override
    public void emit(SourceCode sourceCode, ITextContext context) {
        String lang = sourceCode.lang();
        String code = sourceCode.content();

        try {
            String trimmed = Strings.unindentBlock(code);

            log.debug("Initializing text grid");
            TeXFormula formula = new TeXFormula(trimmed);
            TeXIcon teXIcon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, 14f);
            teXIcon.setInsets(new Insets(1, 1, 1, 1));
            teXIcon.setForeground(foreground);

            PdfWriter pdfWriter = context.getPdfWriter();
            PdfContentByte cb = pdfWriter.getDirectContent();
            float width = (float) teXIcon.getIconWidth();
            float height = (float) teXIcon.getIconHeight();

            PdfTemplate template = cb.createTemplate(width, height);
            Graphics2D g2 = new PdfGraphics2D(template, width, height, new JLaTeXmathFontMapper());

            log.debug("Rendering formula");
            teXIcon.paintIcon(null, g2, 0, 0);
            g2.dispose();

            log.debug("Rendering diagram done");
            ImgTemplate imgTemplate = new ImgTemplate(template);
            scaleToFit(imgTemplate, context.getDocumentArtBox());

            context.append(imgTemplate);

        } catch (Exception e) {
            throw new WrappedRuntimeException(e);
        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy