Рендеринг XML из draw.io в виде изображения с помощью mxCellRenderer

Я пытаюсь программно прочитать файл XML, сгенерированный draw.io, онлайн-службой создания блок-схем/диаграмм. Draw.io построен с использованием mxGraph в своей основе, который недавно получил внешнее имя jgraphx (отсюда тег в этом посте), хотя имена классов остались прежними.

В этом сообщении StackOverflow показано, как читать необработанные XML-данные из файла и преобразовать его в объект mxGraph, и эта страница документации mxGraph Javadocs описывает как преобразовать объект mxGraph в отображаемое изображение.

Однако, к сожалению для меня, несмотря на то, что я следую обоим руководствам, изображение, которое «рендерится», всегда имеет значение null, и выдается IllegalArgumentException (поскольку изображение равно null). Мой код выглядит следующим образом:

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-файла на случай, если вы захотите попробовать его сами.


person Jamison Bryant    schedule 08.02.2016    source источник
comment
Чтобы уточнить, mxGraph и JGraphX ​​- это разные вещи. mxGraph — это библиотека JavaScript, на которой построен draw.io, JGraphX ​​— это библиотека Java Swing, разные кодовые базы.   -  person Thomas the Tank Engine    schedule 09.02.2016
comment
Дэвид, вы правы, однако даже в библиотеке JGraphX ​​классы по-прежнему называются mxGraphXYZ, где XYZ — имя класса. Немного ненужной путаницы, к сожалению.   -  person Jamison Bryant    schedule 10.02.2016


Ответы (1)


С некоторой помощью парней из службы поддержки draw.io я нашел ответ: XML запутан, да, но не безвозвратно. Он просто сжат и его нужно распаковать. Для этого:

  1. Декодирование Base64
  2. Надувать
  3. декодирование URL

Я нашел эту ссылку, которая выполняет все 3 вышеуказанных шага одним махом: 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

person Jamison Bryant    schedule 10.02.2016
comment
Когда я конвертирую в SVG с помощью этого метода, большая часть информации о фигурах теряется. Испытывали ли вы подобные эффекты? - person Mykola Golubyev; 25.05.2017
comment
@MykolaGolubyev Вы решили эту проблему, если это правда, пожалуйста, помогите мне, потому что у меня тоже есть похожая проблема. - person Nikita; 08.07.2018
comment
у вас есть полный пример? - person rdmueller; 27.12.2018