Mercurial > hg > mpdl-group
view software/eXist/mpdl-modules/src/de/mpg/mpiwg/berlin/mpdl/util/MpdlITextUserAgent.java @ 0:408254cf2f1d
Erstellung
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Wed, 24 Nov 2010 17:24:23 +0100 |
parents | |
children |
line wrap: on
line source
package de.mpg.mpiwg.berlin.mpdl.util; import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.apache.log4j.Logger; import org.xhtmlrenderer.layout.SharedContext; import org.xhtmlrenderer.pdf.ITextFSImage; import org.xhtmlrenderer.pdf.ITextOutputDevice; import org.xhtmlrenderer.pdf.PDFAsImage; import org.xhtmlrenderer.resource.ImageResource; import org.xhtmlrenderer.swing.NaiveUserAgent; import com.lowagie.text.Image; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.PdfReader; public class MpdlITextUserAgent extends NaiveUserAgent { private static final int IMAGE_CACHE_CAPACITY = 32; private static final float DEFAULT_DOTS_PER_POINT = 20f * 4f / 3f; private static Logger LOGGER = Logger.getLogger(MpdlITextUserAgent.class); // Logs to EXIST_HOME/webapp/WEB-INF/logs/exist.log private SharedContext sharedContext; private ITextOutputDevice outputDevice; public MpdlITextUserAgent() { super(IMAGE_CACHE_CAPACITY); outputDevice = new ITextOutputDevice(DEFAULT_DOTS_PER_POINT); } @SuppressWarnings("unchecked") public ImageResource getImageResource(String inputUri) { ImageResource resource = null; String uri = resolveURI(inputUri); resource = (ImageResource) _imageCache.get(uri); if (resource == null) { InputStream is = resolveAndOpenStream(uri); if (is != null) { try { URL url = new URL(uri); if (url.getPath() != null && url.getPath().toLowerCase().endsWith(".pdf")) { PdfReader reader = outputDevice.getReader(url); PDFAsImage image = new PDFAsImage(url); Rectangle rect = reader.getPageSizeWithRotation(1); image.setInitialWidth(rect.getWidth()*outputDevice.getDotsPerPoint()); image.setInitialHeight(rect.getHeight()*outputDevice.getDotsPerPoint()); resource = new ImageResource(image); } else { Image image = getImage(url); if (image == null) return null; scaleToOutputResolution(image); resource = new ImageResource(new ITextFSImage(image)); } _imageCache.put(uri, resource); } catch (IOException e) { LOGGER.error("Can't get image file: unexpected problem for URI: '" + uri + "': " + e.getMessage(), e); } finally { try { if (is != null) is.close(); } catch (IOException e) { // ignore } } } } if (resource == null) { resource = new ImageResource(null); } return resource; } private void scaleToOutputResolution(Image image) { float factor = sharedContext.getDotsPerPixel(); image.scaleAbsolute(image.getPlainWidth() * factor, image.getPlainHeight() * factor); } public SharedContext getSharedContext() { return sharedContext; } public void setSharedContext(SharedContext sharedContext) { this.sharedContext = sharedContext; } private Image getImage(URL url) { Image image = null; try { image = Image.getInstance(url); } catch (Exception e) { try { Thread.sleep(1000); } catch (InterruptedException ee) { // nothing } LOGGER.error("first retry to get image for URL '" + url.toString() + "': " + e.getMessage(), e); try { image = Image.getInstance(url); } catch (Exception e2) { try { Thread.sleep(1000); } catch (InterruptedException ee) { // nothing } LOGGER.error("second retry to get image for URL '" + url.toString() + "': " + e.getMessage(), e); try { image = Image.getInstance(url); } catch (Exception e3) { LOGGER.error("third retry to get image for URL '" + url.toString() + "': " + e.getMessage(), e); return null; } } } return image; } protected InputStream resolveAndOpenStream(String inputUri) { InputStream is = null; String uri = resolveURI(inputUri); try { is = new URL(uri).openStream(); } catch (Exception e) { try { Thread.sleep(1000); } catch (InterruptedException ee) { // nothing } LOGGER.error("first retry to open stream for URL '" + uri + "': " + e.getMessage(), e); try { is = new URL(uri).openStream(); } catch (Exception e2) { try { Thread.sleep(1000); } catch (InterruptedException ee) { // nothing } LOGGER.error("second retry to open stream for URL '" + uri + "': " + e.getMessage(), e); try { is = new URL(uri).openStream(); } catch (Exception e3) { LOGGER.error("third retry to open stream for URL '" + uri + "': " + e.getMessage(), e); return null; } } } return is; } }