package gutenberg.itext.emitter; import com.itextpdf.awt.PdfGraphics2D; import com.itextpdf.text.BadElementException; 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.ditaa.GraphicsRenderer; import gutenberg.itext.ITextContext; import gutenberg.itext.PygmentsAdapter; import gutenberg.itext.model.SourceCode; import gutenberg.util.Strings; import gutenberg.util.WrappedRuntimeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.stathissideris.ascii2image.core.ConversionOptions; import org.stathissideris.ascii2image.graphics.Diagram; import org.stathissideris.ascii2image.text.TextGrid; import java.awt.Graphics2D; import java.io.UnsupportedEncodingException; import static gutenberg.itext.ITextUtils.scaleToFit; import static java.util.Arrays.asList; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class SourceCodeDitaaExtension implements SourceCodeEmitterExtension { private final Logger log = LoggerFactory.getLogger(SourceCodeDitaaExtension.class); private final PygmentsAdapter pygments; public SourceCodeDitaaExtension(PygmentsAdapter pygments) { this.pygments = pygments; } @Override public boolean accepts(String lang) { return asList("ditaa").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"); TextGrid grid = new TextGrid(); grid.initialiseWithText(trimmed, null); ConversionOptions options = new ConversionOptions(); options.renderingOptions.setRenderDebugLines(false); log.debug("Diagram creation"); Diagram diagram = new Diagram(grid, options); PdfWriter pdfWriter = context.getPdfWriter(); PdfContentByte cb = pdfWriter.getDirectContent(); float width = (float) diagram.getWidth(); float height = (float) diagram.getHeight(); PdfTemplate template = cb.createTemplate(width, height); final Graphics2D g2 = new PdfGraphics2D(template, width, height); log.debug("Rendering diagram"); GraphicsRenderer renderer = new GraphicsRenderer(); renderer.render(diagram, g2, options.renderingOptions); g2.dispose(); log.debug("Rendering diagram done"); ImgTemplate imgTemplate = new ImgTemplate(template); scaleToFit(imgTemplate, context.getDocumentArtBox()); context.append(imgTemplate); } catch (UnsupportedEncodingException e) { throw new WrappedRuntimeException(e); } catch (BadElementException e) { throw new WrappedRuntimeException(e); } } }