【问题标题】:Converting HTML to image using java使用java将HTML转换为图像
【发布时间】:2016-08-24 07:16:23
【问题描述】:

我在使用 java 将 html 转换为图像时遇到了一些问题 我正在使用 html2image[java]

它创建一个图像,但问题是它只在 html 的一小部分上创建一个图像。我怎样才能制作整个 html 的图像。谢谢

这是我的代码

import gui.ava.html.image.generator.HtmlImageGenerator;
import java.io.File;


public class test {
    public static void main(String[] args) {
        HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
        String uri = new File("C:\\cover.html").toURI().toString();
        imageGenerator.loadUrl(uri);
        imageGenerator.saveAsImage("hello-world.png");
        imageGenerator.saveAsHtmlWithMap("hello-world.html", "hello-world.png");
    }
}

我还使用 saveAsHtmlWithMap 来保存 html 文件。而且程序写入硬盘的那个html文件也很小。

这是cover.thml的html代码

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="***">
    <head>
        <title></title>
        <meta charset="utf-8"/>
        <meta name="viewport" content="width=1200, height=1200"/>
        <link rel="stylesheet" type="text/css" href="main.css"/>
    </head>
    <body id="cover_page">
        <nav id="cover" >
            <ol>
                <li id="nav1">
                    <a>cover</a>
                </li>
            </ol>
        </nav>
    </body>
</html>

【问题讨论】:

  • 能否包含 HTML 和生成的图像?
  • 我更新了问题。并且生成的图片是html的一小部分。
  • 可能与您在 html 中定义的视口有关吗?所以只有页面的(默认?)可见部分呈现为图像。

标签: java


【解决方案1】:

我对 html2image 没有经验,但也许它只能解析内联 CSS,这就是原因,因为生成的图像与在浏览器中呈现的图像不同。

尝试将内容为 main.css 的内联样式添加到您的 HTML 并再次保存图像。

【讨论】:

    【解决方案2】:

    HtmlImageGenerator 默认创建并设置一个 java.awt.Dimension 对象 (800,800)。 您可以使用以下 HtmlImageGenerator 类的设置器传递您自己的自定义尺寸的新 Dimension(x, y):

     public void setSize(Dimension dimension);
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      @Pralay,很遗憾,

      imageGenerator.setSize(new Dimension(1024, 768));

      imageGenerator.getDefaultSize().setSize(1024, 768);

      没有帮助。

      无论如何,html2image 使用的ImageRenderer 中的默认大小是 1024x768。看ImageRendereImpl类的摘录:

      public class ImageRendererImpl implements ImageRenderer {
          public static final int DEFAULT_WIDTH = 1024;
          public static final int DEFAULT_HEIGHT = 768;   
          ...
          private int width = DEFAULT_WIDTH;
          private int height = DEFAULT_HEIGHT;
          private boolean autoHeight = true;
          ...
      

      但请注意autoHeight 字段。在ImageRendererImpl类下面你可以看到:

      if (autoHeight) {
          // do layout with temp buffer
          Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
          renderer.layout(graphics2D, new Dimension(width, height));
          graphics2D.dispose();
      
          Rectangle size = renderer.getMinimumSize();
          final int autoWidth = (int) size.getWidth();
          final int autoHeight = (int) size.getHeight();
          bufferedImage = new BufferedImage(autoWidth, autoHeight, imageType);
          dimension = new Dimension(autoWidth, autoHeight);
      

      如果authHeight 为真(实际上默认为true),将调用org.xhtmlrenderer.simple.Graphics2DRenderer 类的getMinimumSize() 方法。从corresponding Javadoc 可以得出结论,将使用最小的可能区域。这就是图像太少的原因。

      autoHeight 设置为false 可以解决问题:

      public class Test {
          public static void main(String[] args) throws {
              File inputFile = new File("/home/me/Temp/cover.html");
              Html2Image imageGenerator = new Html2Image();
              imageGenerator.getParser().load(inputFile);
              imageGenerator.getImageRenderer().setAutoHeight(false);
              imageGenerator.getImageRenderer().saveImage("/home/me/Temp/hello-world.png");
          }
      }
      

      所以我有

      PS:我已经在 html2image v. 2.0-SNAPSHOT 的帮助下调查并解决了这个问题。至于 v. 0.9(在 Maven Central 中),您需要修改源代码(v. 0.9 旧且不灵活)。

      PS2 在纯 Java 中,您可以尝试以下操作:

      public class Example1 {
      
          private static final int WIDTH = 1204;
          private static final int HEIGHT = 768;
      
          public static void main(String[] args) throws IOException {
              // open HTML page
              JEditorPane editorPane = new JEditorPane();
              editorPane.setEditable(false);
              URL urlToPage = new File("/home/me/Temp/cover.html").toURI().toURL();
              editorPane.setPage(urlToPage);
              editorPane.setSize(WIDTH, HEIGHT);
      
              // render the page
              BufferedImage renderedImage = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB);
              editorPane.print(renderedImage.getGraphics());
      
              // write result to file
              ImageIO.write(renderedImage, "PNG", new File("/home/me/Temp/hello-world.png"));
          }
      }
      

      PS3 我看到 html2image 现在没有维护(为了使用 v. 2.0,您需要下载并编译它你自己)。也许,这个图书馆有一些活的叉子。或者只是尝试另一个 HTML 呈现库。

      【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多