使用Java从网站下载SVG图像

时间:2014-04-23 17:20:44

标签: java svg web-scraping

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

有没有办法做到这一点?将不胜感激任何指导。谢谢。

2 个答案:

答案 0 :(得分:1)

通常,SVG图像不是文件,而是包含在来自浏览器的GET请求的响应主体中。您可以采取的措施是下载REST客户端,如果您正在使用Chrome,则下载POSTMAN,并向svg的url发出GET请求。响应将是SVG图像。现在考虑Java,您可能必须在代码中进行一些解析才能获取实际的svg元素,因为网站可能会返回包含嵌入式svg的额外垃圾。

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

phantomjs rasterize.js C:\sourceImage.svg C:\outputImage.png

如果你正在进行图像处理,我使用ImageMagick做了很多,因为phantomjs只适用于将svg渲染为栅格化图像格式。

在你的情况下,你想要做的是为url上的每个svg图像,获取svg,将其解析为String,将该String写入文件,然后执行以下操作:

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应用程序获取图像时,让它解析它,格式化它,然后将其POST到phantomjs服务器以进行渲染和上传/存储。

答案 1 :(得分:0)

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