html2image踩坑笔记,解决导出jpg红色底图、中文乱码、letter-space字距样式不能生效的问题

1. 百度了所有的html2image的文章都没找到字距样式设置无效的解决方法,最后追踪调试源码后才找到解决方法。方法是改写xhtmlrenderer的源码:org.xhtmlrenderer.render.AbstractOutputDevice.java

修改drawText方法:

	public void drawText(RenderingContext c,InlineText inlineText){
		InlineLayoutBox iB=inlineText.getParent();
		String text=inlineText.getSubstring();

		if(text!=null&&text.length()>0){
			setColor(iB.getStyle().getColor());
			setFont(iB.getStyle().getFSFont(c));
			if(inlineText.getParent().getStyle().isTextJustify()){
				JustificationInfo info=inlineText.getParent().getLineBox().getJustificationInfo();
				if(info!=null){
					drawString(c,inlineText,iB,text,info);
				}else{
					info=getLetterSpaceInfo(iB,info); //改为调用这个方法
					drawString(c,inlineText,iB,text,info);
				}
			}else{
				JustificationInfo info=getLetterSpaceInfo(iB,null); //改为调用这个方法
				drawString(c,inlineText,iB,text,info);
			}
		}

		if(c.debugDrawFontMetrics()){
			drawFontMetrics(c,inlineText);
		}
	}

//增加这个方法
	private JustificationInfo getLetterSpaceInfo(InlineLayoutBox iB,JustificationInfo info){
		String letterspaceStr=iB.getStyle().asString(CSSName.LETTER_SPACING);
		if(letterspaceStr!=null&&letterspaceStr.matches("[0-9\\.]+px")){
			if(info==null)
				info=new JustificationInfo();
			info.setNonSpaceAdjust(info.getNonSpaceAdjust()+Float.valueOf(letterspaceStr.substring(0,letterspaceStr.length()-2)));
		}
		return info;
	}

2. 解决Html2Image.fromFile(file)和formUrl(url)的中文乱码问题的方法如下:

修改gui.ava.html.parser.HtmlParserImpl.java,把所有InputSource的实例调用:inputSource.setEncoding("utf8"),例如:

3. 解决输出jpg出现红色底图的问题:

修改gui.ava.html.renderer.ImageRendererImpl,jpg只要改为RGB模式就能解决问题:

	private void save(OutputStream outputStream, String filename, boolean closeStream) {
		try {
			final String imageFormat = getImageFormat(filename);
			final FSImageWriter imageWriter = getImageWriter(imageFormat);
//			final boolean isBMP = "bmp".equalsIgnoreCase(imageFormat);
//			final BufferedImage bufferedImage = getBufferedImage(isBMP ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB); //使用ARGB后jpg会底图会变红色
			final BufferedImage bufferedImage = getBufferedImage(BufferedImage.TYPE_INT_RGB); //修复jpg红色底图的问题
			imageWriter.write(bufferedImage, outputStream);
		} catch (IOException e) {
			throw new RenderException("IOException while rendering image", e);
		} finally {
			if (closeStream) {
				try {
					outputStream.close();
				} catch (IOException ignore) {
				}
			}
		}
	}

 


版权声明:本文为ffychina原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。