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;
  }
}