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) {
}
}
}
}