一、准备工作
jar 下载
1.百度云盘:selenium-server-standalone-3.13.0.jar 提取码: nvuf
2.阿里Maven仓库也有,可以再阿里Maven仓库去下载或直接使用maven引用 阿里Maven仓库传送门
各版本chromedriver下载 (需下载与已安装浏览器相同版本)
注意:FF浏览器很多公式字符不支持
二、Code
之前一直使用的是apache的batik来将svg转为png的,但是batik对svg中的公式不是非常友好,百度、goolge了很久也没有找到决绝方案。
只能退而求其次,使用其它方案了,下面转换的方案是使用浏览器将svg渲染出来,然后进行截图。闲话不多说直接上代码。
附两张图
1.svg图片
2.转换后png图片
自己去试试吧。
//请使用完整的base64
String url = "data:image/svg+xml;base64,PHN...";
public static byte[] chromeSvgToPng(String base64) throws Exception {
/*
* 使用setProperty方式浏览器关闭后,不会关闭进程
*
* System.setProperty("webdriver.chrome.driver", "E:\\driver\\chromedriver.exe");
*/
// chromedriver服务地址
ChromeDriverService service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File("E:\\driver\\chromedriver.exe")).usingAnyFreePort().build();
service.start();
File pngFile = null;
// 新建一个WebDriver 的对象,但是new 的是谷歌的驱动
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless"); // 隐藏窗口
ChromeDriver driver = new ChromeDriver(chromeOptions);
try {
// 打开指定的网站
driver.get(base64);
// 将整个页面转换为图片
pngFile = ((RemoteWebDriver) driver).getScreenshotAs(OutputType.FILE);
// 获取svg元素
WebElement element = driver.findElement(By.tagName("svg"));
// 获取宽高
int height = element.getSize().getHeight();
int width = element.getSize().getWidth();
BufferedImage img = ImageIO.read(pngFile);
// 根据宽高截取图片
BufferedImage dest = img.getSubimage(0, 0, width, height);
// 将白背景透明化
ImageIcon imageIcon = new ImageIcon((Image) dest);
BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(),
BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
int alpha = 0;
for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
int rgb = bufferedImage.getRGB(j2, j1);
int R = (rgb & 0xff0000) >> 16;
int G = (rgb & 0xff00) >> 8;
int B = (rgb & 0xff);
if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {
rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
}
bufferedImage.setRGB(j2, j1, rgb);
}
}
g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
ImageIO.write(bufferedImage, "png", pngFile);
return IOUtils.toByteArray(new FileInputStream(pngFile));
} finally {
driver.close();
if (pngFile != null) {
FileUtils.deleteQuietly(pngFile);
}
service.stop();
}
}