Как я могу оптимизировать батик SVG, чтобы он мог генерировать файл небольшого размера - PullRequest
0 голосов
/ 23 апреля 2020
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.apache.batik.dom.GenericDOMImplementation;
import org.apache.batik.svggen.SVGGeneratorContext;
import org.apache.batik.svggen.SVGGraphics2D;
import org.scilab.forge.jlatexmath.TeXConstants;
import org.scilab.forge.jlatexmath.TeXFormula;
import org.scilab.forge.jlatexmath.TeXFormula.TeXIconBuilder;
import org.scilab.forge.jlatexmath.TeXIcon;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;

public class jlatexmath {

    private final static String SVG_NS = "http://www.w3.org/2000/svg";
    private final static String SVG_ROOT = "svg";
    private final static float FONT_SIZE = 20;

    private String renderLatex(String source) {
        DOMImplementation DOMImpl = GenericDOMImplementation.getDOMImplementation();
        Document document = DOMImpl.createDocument(SVG_NS, SVG_ROOT, null);
        SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document);
        SVGGraphics2D g = new SVGGraphics2D(ctx, true);

        TeXFormula formula = new TeXFormula(source);
        TeXFormula.TeXIconBuilder builder = formula.new TeXIconBuilder();
                builder.setStyle(TeXConstants.STYLE_DISPLAY);
        builder.setSize(FONT_SIZE);
                TeXIcon icon = builder.build();              
        icon.setInsets(new Insets(0, 0, 0, 0));
        g.setSVGCanvasSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
        g.setColor(new Color(0, 0, 0, 0));
        g.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight());
        icon.paintIcon(null, g, 0, 0);
        StringWriter out = new StringWriter();
        try {
            g.stream(out, true);
            out.flush();
            out.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return out.toString();
    } 
    public static void main(String[] args) throws IOException {

        String latex = "(a+b)^{2}=a^{2}+2ab+b^{2}";
        jlatexmath j = new jlatexmath();
        String svgString = j.renderLatex(latex);
        Files.write(Paths.get("D:/latex.svg"), svgString.getBytes());
        System.out.println(svgString);
    }
}

Я использую jlatexmath-1.0.7 для генерации латексных изображений, которые работают нормально. но мне нужен svg, так что я использую батик apache для того же самого и выше кода генерирует файл ~ 17 КБ. Некоторые онлайн-инструменты, такие как codecogs.com, генерируют svg ~ 7 КБ для того же самого латексного ввода. Как я могу удалить ненужную информацию из SVG в java, чтобы он мог генерировать изображение меньшего размера.

...