Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java从网站下载SVG图像_Java_Svg_Web Scraping - Fatal编程技术网

使用Java从网站下载SVG图像

使用Java从网站下载SVG图像,java,svg,web-scraping,Java,Svg,Web Scraping,我想从网站上下载一些图片。我一直在使用Jsoup进行一些抓取,并在之前成功下载了给定url的图像,但该网站上的图像是svg格式的。没有指向svg文件所在位置的链接,图像嵌入在svg标记中。我见过Batik用于将svg文件转换为其他图像格式,但我没有svg文件可用 有没有办法做到这一点?希望您能给予指导。谢谢。通常,SVG图像不是文件,而是包含在浏览器GET请求的响应体中。要测试这一点,您可以下载一个REST客户机,如果您使用的是Chrome,则发送一个GET请求到svg的url。响应将是SVG图

我想从网站上下载一些图片。我一直在使用Jsoup进行一些抓取,并在之前成功下载了给定url的图像,但该网站上的图像是svg格式的。没有指向svg文件所在位置的链接,图像嵌入在svg标记中。我见过Batik用于将svg文件转换为其他图像格式,但我没有svg文件可用


有没有办法做到这一点?希望您能给予指导。谢谢。

通常,SVG图像不是文件,而是包含在浏览器GET请求的响应体中。要测试这一点,您可以下载一个REST客户机,如果您使用的是Chrome,则发送一个GET请求到svg的url。响应将是SVG图像。现在从Java的角度考虑,您可能需要在代码中进行一些解析,以获取实际的svg元素,因为网站可能会返回包装嵌入式svg的额外垃圾

我用过蜡染,我认为这不是一个好的解决方案,因为很多原因,你正在尝试做什么。在过去,我最终编写了执行第三方图像转换程序的Java代码。它基本上是一个包装phantomjs执行的命令类。下载phantomjs,并使用examples文件夹中的rasterize.js文件实现从.svg到.png或.jpg的快速轻松的图像转换。在命令行中,phantomjs的命令类似于:

phantomjs rasterize.js C:\sourceImage.svg C:\outputImage.png
String command = "C:\\phantomjs\\phantomjs.exe C:\\phantomjs\\rasterize.js C:\\source.svg C:\\output.png"
Process process = Runtime.getRuntime().exec(command);
如果您正在进行图像处理,我经常使用ImageMagick,因为phantomjs只适用于将svg渲染为光栅化图像格式

在您的例子中,您希望对url上的每个svg图像执行以下操作:获取svg,将其解析为字符串,将该字符串写入文件,然后执行以下操作:

phantomjs rasterize.js C:\sourceImage.svg C:\outputImage.png
String command = "C:\\phantomjs\\phantomjs.exe C:\\phantomjs\\rasterize.js C:\\source.svg C:\\output.png"
Process process = Runtime.getRuntime().exec(command);
显然,要使代码更通用,用可恢复变量替换命令字符串中的值


如果这是在商业平台的上下文中,那么您可以在单个服务器上安装phantomjs和java应用程序,然后通过REST端点将此应用程序连接到获取图像的svg finder应用程序。当您的svg finder应用程序获取图像时,让它对其进行解析、格式化,然后将其发布到phantomjs服务器进行渲染和上载/存储

只需将HTML文件的一部分保存在
标记之间(包括
)。给它一个
.svg
扩展名。然后,您应该能够在浏览器中打开它,或者将其传递给Batik、ImageMagick或其他转换器。

嗨,Logan,很遗憾,您必须登录才能查看页面。如果有帮助的话,我可以提供一段html代码,但我不知道您需要查看html的哪一部分。如果你能告诉我要找什么,我可以提供给你。谢谢。所以有一个
svg
标签,里面有一堆绘图元素?与Hi Logan类似,它实际上是svg标记中的一组路径标记。我在第一篇文章中提供了一个html代码示例。希望有帮助。谢谢。您是否无法提取此svg标记?请将其导出到扩展名为.svg的文件,然后在其上使用蜡染?与此类似,谢谢,我认为这是一个很好的方法。但是,当我尝试您建议的方法时,我无法通过web浏览器打开文件(Internet Explorer显示纯文本,Firefox给出了一个或另一个解析错误)。我只是想保存svg标记中包含的所有内容(包括svg标记)还是遗漏了什么?对于独立svg,
标记将需要一个
xmlns
属性。看看这个例子:检查一下你的答案。谢谢,你是正确的。我得到了一个适当的显示,并注意到这个文件有2个额外的XLMNS元素。对不起,我在编辑我的评论中。正确显示的文件有3个xmlns标记,而没有显示的文件只有1个。我只是想知道是否需要保存svg标记之间的内容,因为网站在没有xmlns元素的情况下正确显示这些图像。我目前正在为每个文件添加2个额外的xmlns元素,但我希望有更好的解决方案。主要的是“xmlns”,它为SVG元素定义了XML名称空间。另一个常见的是“xmlns:xlink”,如果文件使用href属性(通常是
元素),则需要使用该属性。如果您还有其他人在那里,它们可能供创建它们的编辑器使用。例如,Inkscape使用“xmlns:sodipodi”。为了安全起见,将前两个添加到所有文件中。