Сохраните изображение SVG с веб-сайта, используя Java (рабочий стол)

Я создаю сайт с помощью JDenticon, используя этот код (test.html):

<!DOCTYPE HTML>

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <script src="https://cdn.jsdelivr.net/jdenticon/1.3.2/jdenticon.min.js" async></script>

        <svg width="200" height="200" data-jdenticon-hash="ff8adece0631821959f443c9d956fc39">
        Fallback text for browsers not supporting inline svg</svg>

    </body>
</html>

Я хочу, чтобы изображение, сгенерированное в этом коде, было доступно для настольного Java-приложения, и хочу, чтобы оно было сохранено на моем ПК. Возможно ли это, а может быть и с изменением hascode (ff8adece0631821959f443c9d956fc39)

И какой код для этого?

Редактировать № 1:

Я нашел кое-что в API JDenticon, которое выглядит так и используется для.NET Framework:

var engine = new Jurassic.ScriptEngine();
engine.ExecuteFile("<path to jdenticon.js>");
engine.SetGlobalValue("size", 200);
engine.SetGlobalValue("hash", "ff8adece0631821959f443c9d956fc39");

var svg = engine.Evaluate<string>("jdenticon.toSvg(hash, size)");
File.WriteAllText("testicon.svg", svg);

Я хотел сделать что-то подобное в Java и нашел Java ScriptEngine (Tutorials: Oracle). Но я не знаю, как его использовать, сейчас мой код выглядит так:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");

engine.put("size", 200);
engine.put("hash", "ff8adece0631821959f443c9d956fc39");

String svg = (String) engine.eval(new java.io.FileReader("C:/jdenticon.js"));

Это, очевидно, не сработает, поскольку не вызывает метод jdenticon.toSvg (hash, size) в файле jdenticon.js. Так что, если у кого-то есть идея, как решить проблему с этим, было бы очень хорошо.

1 ответ

Решение

Ваш обновленный вопрос, включающий интересную идею просто запустить оригинальный код в интерпретаторе JavaScript, который, очевидно, встроен в Java SE, побудил меня продолжить этот подход, в результате чего появился следующий код, который я протестировал для генерации текста документа SVG, который по крайней мере, на моем компьютере генерируется ожидаемое изображение значка SVG.

import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.*;

public class JDenticonClient {
    public static void main(String args[]) throws FileNotFoundException, ScriptException {
        String svgText = new JDenticonClient().getSVGDocumentText("ff8adece0631821959f443c9d956fc39", 200);
        System.out.print(svgText);
    }
    public String getSVGDocumentText(String hash, int size) throws FileNotFoundException, ScriptException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine scriptEngine = factory.getEngineByName("JavaScript");
        scriptEngine.eval(new FileReader("jdenticon.min.js"));
        return scriptEngine.eval("jdenticon.toSvg(\"" + hash + "\", \"" + size + "\")").toString();
    }
}

Несмотря на то, что мы подошли к тому же решению, вы должны учитывать следующее:

  1. put Метод предоставляет дополнительные объекты хоста скрипта для оцениваемых скриптов. Это в основном весь смысл использования скриптовых движков с пользовательским хостом, который не является веб-браузером с определенным набором API или Node.js или чем-то подобным. По сути, вы можете создавать свои собственные API, используя put или имитировать существующие - да, даже копировать весь набор API браузера, делая ваше приложение хостом сценариев, совместимым с современным браузером.
  2. Я сам сочиняю оцененную строку, но это техническая часть - разоблачение нативного hash а также size как String а также int объекты соответственно, к сценарию, используя put работал бы так же хорошо, но тогда у вас есть такие как глобальные, что не всегда разумно делать, учитывая, что это естественные однократные параметры для toSvg процедура.
  3. Даже если вы правильно включили оценку скрипта JDenticon, вы, возможно, не учли, что по умолчанию, просто включив (и выполнив) скрипт просто вызывает jdenticon процедура, которая ищет canvas а также svg элементы внутри дерева DOM, которого в вашем случае даже не существует. На самом деле, я впечатлен, что оценка содержимого файла сценария не прервана на полпути из-за исключения, когда сделаны предположения о DOM. Но это, вероятно, потому, что скрипт создан для работы также с Node.js, который также не имеет DOM.
  4. Приведенный выше код можно оптимизировать, чтобы не создавать новую фабрику и новый обработчик сценариев каждый раз, когда ему нужно создать SVG. Я оставляю все это как упражнение.
  5. getSVGDocumentText возвращает весь сгенерированный документ SVG в виде текста. Вы должны добавить некоторую логику, если хотите, например, сохранить указанный текст в *.svg файл.

PS Спасибо, что указал мне в направлении ScriptEngine, Я даже не знал, что у Java был один. Приятно знать, никогда не знаешь.

Другие вопросы по тегам