使用mxCellRenderer将draw.io中的XML渲染为图像

12

我正试图以编程的方式读取由draw.io生成的XML文件,draw.io是一个在线流程图/图表创建服务。 Draw.io的核心使用mxGraph构建,最近已被外部命名为jgraphx(因此这篇文章有这个标签),尽管类名保持不变。

这篇StackOverflow文章展示了如何读取文件中的原始XML数据并将其转换为mxGraph对象,并且mxGraph Javadocs的此页面描述了如何从mxGraph对象转换为可呈现的图像。

然而对于我来说,尽管遵循了两个指南,但“渲染”的图像始终为空,并抛出一个IllegalArgumentException(因为图像为空)。我的代码如下:

String xmlFile = "work/test.xml";
String imageFile = "work/test.png";
mxGraph graph = new mxGraph();

try {
    Document doc = mxXmlUtils.parseXml(mxUtils.readFile(xmlFile));
    mxCodec codec = new mxCodec(doc);
    codec.decode(doc.getDocumentElement(), graph.getModel());
} catch (IOException e) {
    e.printStackTrace();
}

RenderedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, \\
    Color.WHITE, false, null);

try {
    ImageIO.write(image, "png", new File(imageFile));
} catch (IOException e) {
    e.printStackTrace();
}

从这段代码中可以看出,它应该读入XML数据,从该数据创建一个mxGraph对象,然后将该mxGraph对象呈现为当前工作目录中的图像。但是,实际上什么都没有发生,也没有创建任何图像。

有人经历过类似的情况吗?我有没有忽略什么?是否有更好的方式来实现我所尝试做的事情?任何帮助都将不胜感激。

顺便提一下,这里是Pastebin,其中包含一个示例XML文件,以防你想自己尝试。


1
澄清一下,mxGraph和JGraphX是不同的东西。mxGraph是draw.io构建在其上的JavaScript库,而JGraphX是Java Swing库,它们有不同的代码库。 - Frodo Baggins
David,你是正确的,但即使在JGraphX库中,类的名称仍然被命名为mxGraphXYZ,其中XYZ是类的名称。有点不必要的混淆,不幸的是。 - Jamison Bryant
1个回答

16

在得到draw.io支持团队的帮助下,我找到了答案:XML文件已经进行了混淆,但并非无法还原。它只是被压缩了,需要进行解压缩。具体步骤如下:

  1. Base64解码
  2. Inflate解压
  3. URL解码

我找到了一个链接,可以一次性完成上述三个步骤:https://jgraph.github.io/drawio-tools/tools/convert.html

一旦我获得了解压后的XML文件,我的代码就能完美运行,生成预期的输出结果。

这里有一个示例实现: https://github.com/laingsimon/render-diagram/blob/master/drawio-renderer/src/main/java/com/simonlaing/drawiorenderer/models/DiagramDecoder.java


1
当我使用这种方法转换为SVG时,大部分形状信息都会丢失。你有类似的经历吗? - Mykola Golubyev
@MykolaGolubyev 你解决了这个问题吗?如果是的话,请帮帮我,因为我也遇到了类似的问题。 - Nikita
你有完整的示例吗? - rdmueller
如果这解决了@jamison-bryant的问题,那么他标记为已解决会很好。 - Todd Walton
以下是独立脚本的相同代码: https://gist.github.com/jmini/4acd5749543fb70b24242565f4edf6b9 - Jmini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接