2013-05-13 115 views
0

我想從動態html佈局呈現圖像。我如何根據html中表格的高度和寬度動態設置圖片的寬度和高度。 我的意思是如何從html找到表width(x)height(y)動態呈現圖像

JLabel label = new JLabel(html); 
    label.setSize(x, y); 
    BufferedImage image = new BufferedImage(label.getWidth(),label.getHeight(),BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = (Graphics2D)image.getGraphics(); 
    g2d.setColor(Color.WHITE); 
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    label.paint(g2d); 
    g2d.dispose(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     ImageIO.write(image, "png", baos); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

下面是html的概要。

<html> 
<head>....</head> 
<body topmargin="0" leftmargin="0"><table border=0 cellpadding=0 cellspacing=0 width=700 style='border-collapse:collapse;table-layout:fixed;width:684pt'> 
...... 
...... 
</body></html> 
+1

您可能需要使用標籤的首選大小。現在,問題是你強制標籤的大小爲'(x,y)'。發佈一個[SSCCE](http://sscce.org)以獲得更好的幫助 – 2013-05-13 16:35:42

回答

3

以下代碼有效。這個想法是,如果您不將渲染JLabel放在一個容器中,且容器的內部爲LayoutManager,則需要自行設置JLabel的大小。通過getPreferredSize()可以輕鬆找到合適的尺寸。這應該完全在這種情況下完成。在所有其他情況下,您不應自己撥打setSize(),您應該將所有內容保留至LayoutManager

結果圖像:

enter image description here

import java.awt.Color; 
import java.awt.Desktop; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

class TestPaint { 

    protected void initUI() { 
     StringBuilder sb = new StringBuilder("<html>"); 
     sb.append("<table>"); 
     for (int i = 0; i < 5; i++) { 
      sb.append("<tr>"); 
      for (int j = 0; j < 5; j++) { 
       sb.append("<td>"); 
       sb.append("Cell ").append(i + 1).append(' ').append(j + 1); 
       sb.append("</td>"); 
      } 
      sb.append("</tr>"); 
     } 
     sb.append("</table>"); 
     JLabel label = new JLabel(sb.toString()); 
     label.setSize(label.getPreferredSize()); 
     BufferedImage image = new BufferedImage(label.getWidth(), label.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = (Graphics2D) image.getGraphics(); 
     g2d.setColor(Color.WHITE); 
     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     label.paint(g2d); 
     g2d.dispose(); 
     File file = new File("/tmp/test.png"); 
     if (!file.getParentFile().exists()) { 
      file.getParentFile().mkdirs(); 
     } 
     FileOutputStream baos = null; 
     try { 
      baos = new FileOutputStream(file); 
      ImageIO.write(image, "png", baos); 


     Desktop.getDesktop().open(file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (baos != null) { 
       try { 
        baos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestPaint().initUI(); 
      } 

     }); 
    } 
} 
+0

這正是我想要的,謝謝:) – 2013-05-13 18:08:38

+0

雖然有一個問題,我發現所有的表格單元格邊框在圖像中消失了,有什麼想法? – 2013-05-13 18:10:55