java + Selenium svg转png(支持转公式)

一、准备工作
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图片
java + Selenium svg转png(支持转公式)_第1张图片
2.转换后png图片
java + Selenium svg转png(支持转公式)_第2张图片

自己去试试吧。

//请使用完整的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();
		}
	}

你可能感兴趣的:(java,svg,png,公式,java,selenium)