Сохраните изображение 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();
}
}
Несмотря на то, что мы подошли к тому же решению, вы должны учитывать следующее:
put
Метод предоставляет дополнительные объекты хоста скрипта для оцениваемых скриптов. Это в основном весь смысл использования скриптовых движков с пользовательским хостом, который не является веб-браузером с определенным набором API или Node.js или чем-то подобным. По сути, вы можете создавать свои собственные API, используяput
или имитировать существующие - да, даже копировать весь набор API браузера, делая ваше приложение хостом сценариев, совместимым с современным браузером.- Я сам сочиняю оцененную строку, но это техническая часть - разоблачение нативного
hash
а такжеsize
какString
а такжеint
объекты соответственно, к сценарию, используяput
работал бы так же хорошо, но тогда у вас есть такие как глобальные, что не всегда разумно делать, учитывая, что это естественные однократные параметры дляtoSvg
процедура. - Даже если вы правильно включили оценку скрипта JDenticon, вы, возможно, не учли, что по умолчанию, просто включив (и выполнив) скрипт просто вызывает
jdenticon
процедура, которая ищетcanvas
а такжеsvg
элементы внутри дерева DOM, которого в вашем случае даже не существует. На самом деле, я впечатлен, что оценка содержимого файла сценария не прервана на полпути из-за исключения, когда сделаны предположения о DOM. Но это, вероятно, потому, что скрипт создан для работы также с Node.js, который также не имеет DOM. - Приведенный выше код можно оптимизировать, чтобы не создавать новую фабрику и новый обработчик сценариев каждый раз, когда ему нужно создать SVG. Я оставляю все это как упражнение.
getSVGDocumentText
возвращает весь сгенерированный документ SVG в виде текста. Вы должны добавить некоторую логику, если хотите, например, сохранить указанный текст в*.svg
файл.
PS Спасибо, что указал мне в направлении ScriptEngine
, Я даже не знал, что у Java был один. Приятно знать, никогда не знаешь.