0

我正在使用此代码 ( test.html ) 使用JDenticon生成一个网站:

<!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 桌面应用程序可以访问此代码中生成的图像,并希望将其保存在我的 PC 上。这可能吗,也许还可以更改hascode(ff8adece0631821959f443c9d956fc39

它的代码是什么?

编辑#1:

我在 JDenticon 的 API 中发现了一些看起来像这样并用于 .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.js 文件中的jdenticon.toSvg(hash, size)方法。因此,如果有人对如何解决这个问题有一个想法,那就太好了。

4

1 回答 1

2

您更新的问题,包括仅在显然内置于 Java SE 的 JavaScript 解释器中运行原始代码的有趣想法,使我进一步追求该方法,导致我测试了以下代码以生成 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 或类似内容的 Web 浏览器。put基本上,您可以使用或模拟现有的API 创建自己的 API——是的,甚至复制整个浏览器 API 集,使您的应用程序成为与现代浏览器兼容的脚本主机。
  2. 我自己编写评估的字符串,但这是一个技术性问题——将 nativehashsizeasStringint对象分别暴露给使用脚本的脚本put也可以,但是你将它们作为全局变量,这并不总是一件聪明的事情,考虑到这些是程序的自然一次性参数toSvg
  3. 即使您正确地包含了 JDenticon 脚本评估,您可能还没有考虑到默认情况下,仅包含(并运行)脚本只是调用jdenticon过程,该过程在 DOM 树中查找canvassvg元素,在您的情况下甚至不存在. 事实上,我印象深刻的是脚本文件内容的评估并没有中途中止,因为对 DOM 进行了假设的异常。但这可能是因为该脚本也适用于 Node.js,它也没有 DOM。
  4. 上面的代码可以优化为不必在每次需要生成 SVG 时都创建新工厂和新脚本引擎。我把这一切都留作练习。
  5. getSVGDocumentText整个生成的 SVG 文档作为文本返回。如果您想将所述文本保存到*.svg文件中,则必须添加一些逻辑。

PS感谢您指出我的方向ScriptEngine。我什至不知道Java有一个。很高兴知道,永远不知道。

于 2016-07-04T14:32:40.270 回答