Javascript 使用Java(桌面)从网站保存SVG图像

Javascript 使用Java(桌面)从网站保存SVG图像,javascript,java,svg,javax.script,identicon,Javascript,Java,Svg,Javax.script,Identicon,我正在使用以下代码生成一个网站(test.html): 试验 不支持内联svg的浏览器的回退文本 您更新的问题,包括在Java SE内置的JavaScript解释器中运行原始代码的有趣想法,使我进一步研究了这种方法,产生了以下代码,我已经测试过这些代码以生成SVG文档文本,它至少在我的计算机上生成预期的SVG图标图像 import java.io.FileNotFoundException; import java.io.FileReader; import javax.script.*;

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


试验
不支持内联svg的浏览器的回退文本

您更新的问题,包括在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();
    }
}
尽管我们提出了相同的解决方案,但你必须考虑如下:

  • put
    方法向正在评估的脚本公开其他脚本主机对象。这基本上就是使用脚本引擎和自定义主机的全部要点,该主机不是带有特定API集或Node.js或类似内容的web浏览器。基本上,您可以使用
    put
    创建自己的API或模拟现有的API——是的,甚至可以复制整个浏览器API集,使您的应用程序成为与现代浏览器兼容的脚本主机
  • 我自己编写经过计算的字符串,但这是一个技术性问题——将本机
    散列
    大小
    分别作为
    string
    int
    对象暴露在脚本中,使用
    put
    也可以,但这样做并不明智,考虑到这些参数是如何在
    toSvg
    过程中自然一次性使用的参数
  • 尽管正确地包含了jDeticon脚本评估,但默认情况下,您可能没有考虑到这一点,只包含(并运行)脚本只是调用
    jDeticon
    过程,该过程在DOM树中查找
    canvas
    svg
    元素,而在您的情况下,这些元素甚至不存在。事实上,令我印象深刻的是,对脚本文件内容的评估并没有中途中止,因为有一个关于DOM的假设。但这可能是因为脚本也是为了与Node.js一起工作,Node.js也没有DOM
  • 上面的代码可以优化为不必在每次需要生成SVG时创建新工厂和新脚本引擎。我把这一切都当作练习
  • getSVGDocumentText
    将整个生成的SVG文档作为文本返回。如果要将所述文本保存到
    *.svg
    文件中,则必须添加一些逻辑

  • 另外,感谢您为我指出
    ScriptEngine
    的方向。我甚至不知道Java有一个。很高兴知道,永远不知道。

    您更新的问题,包括在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();
        }
    }
    
    尽管我们提出了相同的解决方案,但你必须考虑如下:

  • put
    方法向正在评估的脚本公开其他脚本主机对象。这基本上就是使用脚本引擎和自定义主机的全部要点,该主机不是带有特定API集或Node.js或类似内容的web浏览器。基本上,您可以使用
    put
    创建自己的API或模拟现有的API——是的,甚至可以复制整个浏览器API集,使您的应用程序成为与现代浏览器兼容的脚本主机
  • 我自己编写经过计算的字符串,但这是一个技术性问题——将本机
    散列
    大小
    分别作为
    string
    int
    对象暴露在脚本中,使用
    put
    也可以,但这样做并不明智,考虑到这些参数是如何在
    toSvg
    过程中自然一次性使用的参数
  • 尽管正确地包含了jDeticon脚本评估,但默认情况下,您可能没有考虑到这一点,只包含(并运行)脚本只是调用
    jDeticon
    过程,该过程在DOM树中查找
    canvas
    svg
    元素,而在您的情况下,这些元素甚至不存在。事实上,令我印象深刻的是,对脚本文件内容的评估并没有中途中止,因为有一个关于DOM的假设。但这可能是因为脚本也是为了与Node.js一起工作,Node.js也没有DOM
  • 上面的代码可以优化为不必在每次需要生成SVG时创建新工厂和新脚本引擎。我把这一切都当作练习
  • getSVGDocumentText
    将整个生成的SVG文档作为文本返回。如果要将所述文本保存到
    *.svg
    文件中,则必须添加一些逻辑

  • 另外,感谢您为我指出
    ScriptEngine
    的方向。我甚至不知道Java有一个。很高兴知道,永远不知道。

    你读过
    JDenticon
    的文档吗?@amn嗯,我想我已经找到了,但还没有找到Java.Java的解决方案?jDeticon是一个JavaScript库——它在客户端工作。也就是说,我认为您可以通过Node.js在服务器端渲染一个图标。您可能需要将JDenticon移植到Java源代码中,以便将其作为Java应用程序呈现图标。另外,请记住,您不必对图标使用SVG——您可以使用
    canvas
    ,这也记录在JDenticon页面上。@amn生成canvas会更容易吗?我不在乎它是画布还是svg,我只想最终通过Java获得图像。您需要向我解释Java在哪里适合您的JDON应用程序。否则很难说。看