
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