();
11 | private static final String DEFAULT_FORMAT = "png";
12 |
13 | static {
14 | types.put("gif", "gif");
15 | types.put("jpg", "jpg");
16 | types.put("jpeg", "jpg");
17 | types.put("png", "png");
18 | types.put("bmp", "bmp");
19 | }
20 |
21 | public static String formatForExtension(String extension) {
22 | final String type = types.get(extension);
23 | if (type == null) {
24 | return DEFAULT_FORMAT;
25 | }
26 | return type;
27 | }
28 |
29 | public static String getDefaultFormat() {
30 | return DEFAULT_FORMAT;
31 | }
32 |
33 | public static String formatForFilename(String fileName) {
34 | final int dotIndex = fileName.lastIndexOf('.');
35 | if (dotIndex < 0) {
36 | return DEFAULT_FORMAT;
37 | }
38 | final String ext = fileName.substring(dotIndex + 1);
39 | return formatForExtension(ext);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/html2image/src/main/java/gui/ava/html/renderer/ImageRenderer.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.renderer;
2 |
3 | import java.awt.image.BufferedImage;
4 | import java.io.File;
5 | import java.io.OutputStream;
6 |
7 | /**
8 | * @author Yoav Aharoni
9 | */
10 | public interface ImageRenderer extends LayoutHolder {
11 | int getWidth();
12 |
13 | ImageRenderer setWidth(int width);
14 |
15 | int getHeight();
16 |
17 | ImageRenderer setHeight(int height);
18 |
19 | boolean isAutoHeight();
20 |
21 | ImageRenderer setAutoHeight(boolean autoHeight);
22 |
23 | String getImageFormat();
24 |
25 | ImageRenderer setImageType(String imageType);
26 |
27 | BufferedImage getBufferedImage(int imageType);
28 |
29 | BufferedImage getBufferedImage();
30 |
31 | void saveImage(OutputStream outputStream, boolean closeStream);
32 |
33 | void saveImage(String filename);
34 |
35 | void saveImage(File file);
36 |
37 | ImageRendererImpl clearCache();
38 |
39 | float getWriteCompressionQuality();
40 |
41 | ImageRenderer setWriteCompressionQuality(float writeCompressionQuality);
42 |
43 | int getWriteCompressionMode();
44 |
45 | ImageRenderer setWriteCompressionMode(int writeCompressionMode);
46 |
47 | String getWriteCompressionType();
48 |
49 | ImageRenderer setWriteCompressionType(String writeCompressionType);
50 | }
51 |
--------------------------------------------------------------------------------
/html2image/src/main/java/gui/ava/html/renderer/ImageRendererImpl.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.renderer;
2 |
3 | import gui.ava.html.exception.RenderException;
4 | import gui.ava.html.parser.DocumentHolder;
5 | import org.w3c.dom.Document;
6 | import org.xhtmlrenderer.render.Box;
7 | import org.xhtmlrenderer.simple.Graphics2DRenderer;
8 | import org.xhtmlrenderer.util.FSImageWriter;
9 |
10 | import javax.imageio.ImageWriteParam;
11 | import java.awt.*;
12 | import java.awt.image.BufferedImage;
13 | import java.io.*;
14 |
15 | /**
16 | * @author Yoav Aharoni
17 | */
18 | public class ImageRendererImpl implements ImageRenderer {
19 | public static final int DEFAULT_WIDTH = 1024;
20 | public static final int DEFAULT_HEIGHT = 768;
21 |
22 | private DocumentHolder documentHolder;
23 |
24 | private int width = DEFAULT_WIDTH;
25 | private int height = DEFAULT_HEIGHT;
26 | private boolean autoHeight = true;
27 |
28 | private String imageFormat = null;
29 | private float writeCompressionQuality = 1.0f;
30 | private int writeCompressionMode = ImageWriteParam.MODE_COPY_FROM_METADATA;
31 | private String writeCompressionType = null;
32 | private Box rootBox;
33 |
34 | private BufferedImage bufferedImage;
35 | private int cacheImageType = -1;
36 | private Document cacheDocument;
37 |
38 | public ImageRendererImpl(DocumentHolder documentHolder) {
39 | this.documentHolder = documentHolder;
40 | }
41 |
42 | @Override
43 | public int getWidth() {
44 | return width;
45 | }
46 |
47 | @Override
48 | public ImageRenderer setWidth(int width) {
49 | this.width = width;
50 | return this;
51 | }
52 |
53 | @Override
54 | public int getHeight() {
55 | return height;
56 | }
57 |
58 | @Override
59 | public ImageRenderer setHeight(int height) {
60 | this.height = height;
61 | return this;
62 | }
63 |
64 | @Override
65 | public boolean isAutoHeight() {
66 | return autoHeight;
67 | }
68 |
69 | @Override
70 | public ImageRenderer setAutoHeight(boolean autoHeight) {
71 | this.autoHeight = autoHeight;
72 | return this;
73 | }
74 |
75 | public String getImageFormat() {
76 | return imageFormat;
77 | }
78 |
79 | public ImageRenderer setImageType(String imageType) {
80 | this.imageFormat = imageType;
81 | return this;
82 | }
83 |
84 | @Override
85 | public float getWriteCompressionQuality() {
86 | return writeCompressionQuality;
87 | }
88 |
89 | @Override
90 | public ImageRenderer setWriteCompressionQuality(float writeCompressionQuality) {
91 | this.writeCompressionQuality = writeCompressionQuality;
92 | return this;
93 | }
94 |
95 | @Override
96 | public int getWriteCompressionMode() {
97 | return writeCompressionMode;
98 | }
99 |
100 | @Override
101 | public ImageRenderer setWriteCompressionMode(int writeCompressionMode) {
102 | this.writeCompressionMode = writeCompressionMode;
103 | return this;
104 | }
105 |
106 | @Override
107 | public String getWriteCompressionType() {
108 | return writeCompressionType;
109 | }
110 |
111 | @Override
112 | public ImageRenderer setWriteCompressionType(String writeCompressionType) {
113 | this.writeCompressionType = writeCompressionType;
114 | return this;
115 | }
116 |
117 | @Override
118 | public BufferedImage getBufferedImage(int imageType) {
119 | final Document document = documentHolder.getDocument();
120 | if (bufferedImage != null || cacheImageType != imageType || cacheDocument != document) {
121 | cacheImageType = imageType;
122 | cacheDocument = document;
123 | Graphics2DRenderer renderer = new Graphics2DRenderer();
124 | renderer.setDocument(document, document.getDocumentURI());
125 | Dimension dimension = new Dimension(width, height);
126 | bufferedImage = new BufferedImage(width, height, imageType);
127 |
128 | if (autoHeight) {
129 | // do layout with temp buffer
130 | Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
131 | renderer.layout(graphics2D, new Dimension(width, height));
132 | graphics2D.dispose();
133 |
134 | Rectangle size = renderer.getMinimumSize();
135 | final int autoWidth = (int) size.getWidth();
136 | final int autoHeight = (int) size.getHeight();
137 | bufferedImage = new BufferedImage(autoWidth, autoHeight, imageType);
138 | dimension = new Dimension(autoWidth, autoHeight);
139 | }
140 |
141 | Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
142 | renderer.layout(graphics2D, dimension);
143 | renderer.render(graphics2D);
144 | rootBox = renderer.getPanel().getRootBox();
145 | graphics2D.dispose();
146 | }
147 | return bufferedImage;
148 | }
149 |
150 | @Override
151 | public Box getRootBox() {
152 | if (rootBox == null) {
153 | getBufferedImage();
154 | }
155 | return rootBox;
156 | }
157 |
158 | @Override
159 | public ImageRendererImpl clearCache() {
160 | bufferedImage = null;
161 | rootBox = null;
162 | cacheDocument = null;
163 | cacheImageType = -1;
164 | return this;
165 | }
166 |
167 | public BufferedImage getBufferedImage() {
168 | return getBufferedImage(BufferedImage.TYPE_INT_ARGB);
169 | }
170 |
171 | @Override
172 | public void saveImage(OutputStream outputStream, boolean closeStream) {
173 | save(outputStream, null, closeStream);
174 | }
175 |
176 | @Override
177 | public void saveImage(File file) {
178 | try {
179 | BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
180 | save(outputStream, file.getName(), true);
181 | } catch (IOException e) {
182 | throw new RenderException("IOException while rendering image to " + file.getAbsolutePath(), e);
183 | }
184 | }
185 |
186 | @Override
187 | public void saveImage(String filename) {
188 | saveImage(new File(filename));
189 | }
190 |
191 | private void save(OutputStream outputStream, String filename, boolean closeStream) {
192 | try {
193 | final String imageFormat = getImageFormat(filename);
194 | final FSImageWriter imageWriter = getImageWriter(imageFormat);
195 | final boolean isBMP = "bmp".equalsIgnoreCase(imageFormat);
196 | final BufferedImage bufferedImage = getBufferedImage(isBMP ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB);
197 | imageWriter.write(bufferedImage, outputStream);
198 | } catch (IOException e) {
199 | throw new RenderException("IOException while rendering image", e);
200 | } finally {
201 | if (closeStream) {
202 | try {
203 | outputStream.close();
204 | } catch (IOException ignore) {
205 | }
206 | }
207 | }
208 | }
209 |
210 | private FSImageWriter getImageWriter(String imageFormat) {
211 | FSImageWriter imageWriter = new FSImageWriter(imageFormat);
212 | imageWriter.setWriteCompressionMode(writeCompressionMode);
213 | imageWriter.setWriteCompressionQuality(writeCompressionQuality);
214 | imageWriter.setWriteCompressionType(writeCompressionType);
215 | return imageWriter;
216 | }
217 |
218 | private String getImageFormat(String filename) {
219 | if (this.imageFormat != null) {
220 | return imageFormat;
221 | }
222 | if (filename != null) {
223 | return FormatNameUtil.formatForFilename(filename);
224 | }
225 | return FormatNameUtil.getDefaultFormat();
226 | }
227 | }
--------------------------------------------------------------------------------
/html2image/src/main/java/gui/ava/html/renderer/LayoutHolder.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.renderer;
2 |
3 | import org.xhtmlrenderer.render.Box;
4 |
5 | /**
6 | * @author Yoav Aharoni
7 | */
8 | public interface LayoutHolder {
9 | Box getRootBox();
10 | }
11 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/BaseTest.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html;
2 |
3 | import org.springframework.util.ResourceUtils;
4 |
5 | import java.io.FileNotFoundException;
6 | import java.net.URL;
7 |
8 | /**
9 | * @author Yoav Aharoni
10 | */
11 | public class BaseTest {
12 | public static final String TEST1_PATH = "classpath:test1.html";
13 |
14 | public static URL getTest1Url() {
15 | try {
16 | return ResourceUtils.getURL(TEST1_PATH);
17 | } catch (FileNotFoundException e) {
18 | throw new RuntimeException(e);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/Example.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html;
2 |
3 | import gui.ava.html.image.*;
4 |
5 | /**
6 | * Created by hki on 07-01-2016.
7 | */
8 | public class Example {
9 |
10 | public static void main(String[] args) {
11 | HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
12 | imageGenerator.loadHtml("Hello World! Please goto Google.");
13 | imageGenerator.saveAsImage("hello-world.png");
14 | imageGenerator.saveAsImage("hello-world.jpeg");
15 | //imageGenerator.saveAsHtmlWithMap("hello-world.html", "hello-world.png");
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/WordWrapExample.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html;
2 |
3 | import gui.ava.html.image.HtmlImageGenerator;
4 |
5 | import java.awt.*;
6 |
7 | /**
8 | * Created by hki on 12-01-2016.
9 | */
10 | public class WordWrapExample {
11 | public static void main(String[] args) {
12 | HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
13 | imageGenerator.loadHtml("\n" +
14 | "\n" +
15 | "Hello World! Please goto Google.\n" +
16 | "" +
17 | "word wrap all " +
18 | "" +
19 | "llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll" +
20 | "" +
21 | "
" +
22 |
23 | "" +
24 | "word wrap word " +
25 | "" +
26 | "wwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwww wwwwwwwwwwwwwww w wwwwwwwwwwwwwwwwwwww w wwwwwwwwwwwwwwww w wwwwwwwwwwwwwwwwwwwwww w w w wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwww wwwwwwwwwwwwwww w wwwwwwwwwwwwwwwwwwww w wwwwwwwwwwwwwwww w wwwwwwwwwwwwwwwwwwwwww w w w wwwwwwwwwwwwwwwwwwwwwww" +
27 | "" +
28 | "
" +
29 |
30 | "\n" +
31 | "\n" +
32 | "");
33 | //imageGenerator.saveAsImage("hello-form.png");
34 | //imageGenerator.setSize(new Dimension(150, 600));
35 | //imageGenerator.saveAsImage("word-wrap.jpeg");
36 | imageGenerator.show();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/imagemap/HtmlImageMapImplTest.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.imagemap;
2 |
3 | import gui.ava.html.BaseTest;
4 | import gui.ava.html.Html2Image;
5 | import org.junit.Test;
6 |
7 | import java.net.URL;
8 |
9 | /**
10 | * @author Yoav Aharoni
11 | */
12 | public class HtmlImageMapImplTest extends BaseTest {
13 | @Test
14 | public void test1ImageMapDocument() throws Exception {
15 | final Html2Image html2Image = Html2Image.fromURL(getTest1Url());
16 | html2Image.getImageRenderer().saveImage("test1.png");
17 | html2Image.getHtmlImageMap().saveImageMapDocument("test1.html", "test1.png");
18 | }
19 |
20 |
21 | @Test
22 | public void googleImageMapDocument() throws Exception {
23 | final Html2Image html2Image = Html2Image.fromURL(new URL("http://www.google.com"));
24 | html2Image.getImageRenderer().saveImage("google.png");
25 | html2Image.getHtmlImageMap().saveImageMapDocument("google.html", "google.png");
26 | }
27 |
28 | @Test
29 | public void hebImageMapDocument() throws Exception {
30 | final Html2Image html2Image = Html2Image.fromHtml("");
31 | html2Image.getImageRenderer().saveImage("heb.png");
32 | html2Image.getHtmlImageMap().saveImageMapDocument("heb.html", "heb.png");
33 | }
34 |
35 | @Test
36 | public void imageImageMapDocument() throws Exception {
37 | final Html2Image html2Image = Html2Image.fromHtml("HELLO!

");
38 | html2Image.getImageRenderer().saveImage("image.png");
39 | html2Image.getHtmlImageMap().saveImageMapDocument("image.html", "heb.png");
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/parser/HtmlParserImplTest.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.parser;
2 |
3 | import gui.ava.html.BaseTest;
4 | import org.junit.Before;
5 | import org.junit.Test;
6 | import org.springframework.util.ResourceUtils;
7 | import org.w3c.dom.Document;
8 |
9 | import java.io.FileInputStream;
10 | import java.io.FileReader;
11 | import java.net.URL;
12 |
13 | import static org.junit.Assert.assertEquals;
14 | import static org.junit.Assert.assertTrue;
15 |
16 | /**
17 | * @author Yoav Aharoni
18 | */
19 | public class HtmlParserImplTest extends BaseTest {
20 | private HtmlParserImpl parser;
21 |
22 | @Before
23 | public void createParser() {
24 | parser = new HtmlParserImpl();
25 | }
26 |
27 | @Test
28 | public void testLoadURI() throws Exception {
29 | parser.load(getTest1Url().toURI());
30 | assertTest1();
31 | }
32 |
33 | @Test
34 | public void testLoadExternalURL() throws Exception {
35 | parser.load(new URL("http://www.google.co.il"));
36 | assertTrue(getDocument().getElementsByTagName("div").getLength() > 0);
37 | }
38 |
39 | @Test
40 | public void testLoadFile() throws Exception {
41 | parser.load(ResourceUtils.getFile(TEST1_PATH));
42 | assertTest1();
43 | }
44 |
45 | @Test
46 | public void testLoadReader() throws Exception {
47 | parser.load(new FileReader(ResourceUtils.getFile(TEST1_PATH)));
48 | assertTest1();
49 | }
50 |
51 | @Test
52 | public void testLoadInputStream() throws Exception {
53 | parser.load(new FileInputStream(ResourceUtils.getFile(TEST1_PATH)));
54 | assertTest1();
55 | }
56 |
57 | @Test
58 | public void testLoadHtml() throws Exception {
59 | parser.loadHtml("Hello");
60 | assertEquals(getDocument().getElementsByTagName("b").item(0).getTextContent(), "Hello");
61 | }
62 |
63 | private void assertTest1() {
64 | assertEquals(getDocument().getElementsByTagName("strong").item(0).getTextContent(), "Hello");
65 | }
66 |
67 | private Document getDocument() {
68 | return parser.getDocument();
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/pdf/PdfRendererImplTest.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.pdf;
2 |
3 | import gui.ava.html.BaseTest;
4 | import gui.ava.html.Html2Image;
5 | import org.junit.Test;
6 |
7 | /**
8 | * @author Yoav Aharoni
9 | */
10 | public class PdfRendererImplTest extends BaseTest {
11 | @Test
12 | public void testSaveToPDF() throws Exception {
13 | Html2Image.fromURL(getTest1Url()).getPdfRenderer().saveToPDF("test.pdf");
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/renderer/FormatNameUtilTest.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.renderer;
2 |
3 | import org.junit.Assert;
4 | import org.junit.Test;
5 |
6 | /**
7 | * @author Yoav Aharoni
8 | */
9 | public class FormatNameUtilTest {
10 | @Test
11 | public void testGif() {
12 | final String format = FormatNameUtil.formatForFilename("test.file.gif");
13 | Assert.assertEquals("gif", format);
14 | }
15 |
16 | @Test
17 | public void testPng() {
18 | final String format = FormatNameUtil.formatForFilename("test.file.png");
19 | Assert.assertEquals("png", format);
20 | }
21 |
22 | @Test
23 | public void testJpg() {
24 | final String format = FormatNameUtil.formatForFilename("test.file.jpg");
25 | Assert.assertEquals("jpg", format);
26 | }
27 |
28 | @Test
29 | public void testNoName() {
30 | final String format = FormatNameUtil.formatForFilename(".gif");
31 | Assert.assertEquals("gif", format);
32 | }
33 |
34 | @Test
35 | public void testNoExtension() {
36 | final String format = FormatNameUtil.formatForFilename("name.");
37 | Assert.assertEquals("png", format);
38 | }
39 |
40 | @Test
41 | public void testEmptyFilename() {
42 | final String format = FormatNameUtil.formatForFilename("");
43 | Assert.assertEquals("png", format);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/html2image/src/test/java/gui/ava/html/renderer/ImageRendererImplTest.java:
--------------------------------------------------------------------------------
1 | package gui.ava.html.renderer;
2 |
3 | import gui.ava.html.BaseTest;
4 | import gui.ava.html.parser.HtmlParserImpl;
5 | import org.junit.Before;
6 | import org.junit.Test;
7 |
8 | import java.io.FileOutputStream;
9 |
10 | /**
11 | * @author Yoav Aharoni
12 | */
13 | public class ImageRendererImplTest extends BaseTest {
14 | private HtmlParserImpl parser;
15 | private ImageRendererImpl renderer;
16 |
17 | @Before
18 | public void createParser() {
19 | parser = new HtmlParserImpl();
20 | renderer = new ImageRendererImpl(parser);
21 | }
22 |
23 | @Test
24 | public void testSaveStream() throws Exception {
25 | parser.load(getTest1Url());
26 | renderer.saveImage(new FileOutputStream("file1.png"), true);
27 | }
28 |
29 | @Test
30 | public void testSaveFile() throws Exception {
31 | parser.load(getTest1Url());
32 | renderer.saveImage("test.gif");
33 | renderer.saveImage("test.png");
34 | renderer.saveImage("test.jpg");
35 | renderer.saveImage("test.bmp");
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/html2image/src/test/resources/test1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | HTML-2-Image Test #1
5 |
21 |
22 |
23 |
24 | Hello
25 | World!
26 |
27 |
28 |
37 |
38 |
--------------------------------------------------------------------------------
/html2image/src/test/resources/test2.xhtml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------