Mercurial > hg > mpdl-group
view software/mpdl-services/mpiwg-mpdl-cms/src/de/mpg/mpiwg/berlin/mpdl/cms/document/PdfHandlerUserAgent.java @ 23:e845310098ba
diverse Korrekturen
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 27 Nov 2012 12:35:19 +0100 |
parents | |
children |
line wrap: on
line source
package de.mpg.mpiwg.berlin.mpdl.cms.document; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.logging.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 PdfHandlerUserAgent 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(PdfHandlerUserAgent.class.getName()); private SharedContext sharedContext; private ITextOutputDevice outputDevice; public PdfHandlerUserAgent() { 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.severe("Can't get image file: unexpected problem for URI: '" + uri + "': " + e.getMessage()); } 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.severe("first retry to get image for URL '" + url.toString() + "': " + e.getMessage()); try { image = Image.getInstance(url); } catch (Exception e2) { try { Thread.sleep(1000); } catch (InterruptedException ee) { // nothing } LOGGER.severe("second retry to get image for URL '" + url.toString() + "': " + e.getMessage()); try { image = Image.getInstance(url); } catch (Exception e3) { LOGGER.severe("third retry to get image for URL '" + url.toString() + "': " + e.getMessage()); 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.severe("first retry to open stream for URL '" + uri + "': " + e.getMessage()); try { is = new URL(uri).openStream(); } catch (Exception e2) { try { Thread.sleep(1000); } catch (InterruptedException ee) { // nothing } LOGGER.severe("second retry to open stream for URL '" + uri + "': " + e.getMessage()); try { is = new URL(uri).openStream(); } catch (Exception e3) { LOGGER.severe("third retry to open stream for URL '" + uri + "': " + e.getMessage()); return null; } } } return is; } }