com.toolkit.util.pdf.HomeITextUserAgent.java Source code

Java tutorial

Introduction

Here is the source code for com.toolkit.util.pdf.HomeITextUserAgent.java

Source

/**
 * Copyright (c) 2006-2007 Berlin Brown and botnode.com  All Rights Reserved
 *
 * http://www.opensource.org/licenses/bsd-license.php
    
 * All rights reserved.
    
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
    
 * * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * * Neither the name of the Botnode.com (Berlin Brown) nor
 * the names of its contributors may be used to endorse or promote
 * products derived from this software without specific prior written permission.
    
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Date: 1/5/2009, 5/5/2010
 *       7/15/2009 - Added Clojure 1.0, other performance fixes and cleanups.
 *       
 * Main Description: Light Log Viewer is a tool for making it easier to search log files.  
 * Light Log Viewer adds some text highlighting, quick key navigation to text files, simple graphs 
 * and charts for monitoring logs, file database to quickly navigate to files of interest, 
 * and HTML to PDF convert tool.  
 * Light Log was developed with a combination of Clojure 1.0, Java and Scala with use of libs, SWT 3.4, JFreeChart, iText. 
 * 
 * Quickstart : the best way to run the Light Log viewer is to click on the win32 batch script light_logs.bat
 * (you may need to edit the Linux script for Unix/Linux environments).
 * Edit the win32 script to add more heap memory or other parameters.
 * 
 * The clojure source is contained in : HOME/src/octane
 * The java source is contained in :  HOME/src/java/src
 * 
 * To build the java source, see : HOME/src/java/build.xml and build_pdf_gui.xml
 * 
 * Metrics: (as of 7/15/2009) Light Log Viewer consists of 6500 lines of Clojure code, and contains wrapper code
 *  around the Java source.  There are 2000+ lines of Java code in the Java library for Light Log Viewer.
 *  
 * Additional Development Notes: The SWT gui and other libraries are launched from a dynamic classloader.  Clojure is also
 *   started from the same code, and reflection is used to dynamically initiate Clojure. See the 'start' package.  The binary
 *   code is contained in the octane_start.jar library.
 *   
 * Home Page: http://code.google.com/p/lighttexteditor/
 * 
 * Contact: Berlin Brown <berlin dot brown at gmail.com>
 */

package com.toolkit.util.pdf;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

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 org.xhtmlrenderer.util.XRLog;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfReader;

/**
 * XHTMLRenderer resource callback. Sub class of the XHTMLRenderer User Agent.
 * 
 * @author Berlin Brown
 * @version 1.0 on 2/1/2009
 */
public class HomeITextUserAgent extends NaiveUserAgent {

    private static final int IMAGE_CACHE_CAPACITY = 32;

    private SharedContext _sharedContext;

    private ITextOutputDevice _outputDevice;

    /** 
     * Set the main base URL, to override any sub-classes attempting to change baseURL.
     */
    private String coreBaseURL = ".";

    public HomeITextUserAgent(final ITextOutputDevice outputDevice) {
        super(IMAGE_CACHE_CAPACITY);
        _outputDevice = outputDevice;
    }

    public SharedContext getSharedContext() {
        return _sharedContext;
    }

    public void setSharedContext(SharedContext sharedContext) {
        _sharedContext = sharedContext;
    }

    /** 
     * URL relative to which URIs are resolved.
     *
     * @param url A URI which anchors other, possibly relative URIs.
     */
    public void setBaseURL(String url) {
        // IGNORE
    }

    /**
     * Returns the current baseUrl for this class.
     */
    public String getBaseURL() {
        return this.coreBaseURL;
    }

    /**
     * Attempt to join the base URL and URI.
     * Return null on error.
     * 
     * @param uri String
     * @return String
     */
    public String findBaseURLAndURI(final String uri) {

        try {
            URL result = null;
            result = new URL(new URL(this.getBaseURL()), uri);
            return result.toString();
        } catch (MalformedURLException e1) {
            XRLog.exception("The default NaiveUserAgent cannot resolve the URL " + uri + " with base URL "
                    + this.getBaseURL());
        }
        return null;
    }

    /**
     * Resolves the URI; if absolute, leaves as is, if relative, returns an
     * absolute URI based on the baseUrl for the agent.
     * 
     * @param uriDef String
     * @return A URI as String, resolved, or null if there was an exception (for
     *         example if the URI is malformed).
     * @see org.xhtmlrenderer.extend.UserAgentCallback#resolveURI(String)
     */
    public String resolveURI(final String uriDef) {

        if (uriDef == null) {
            return null;
        }

        System.out.println("<resolveURI 149> Base URL : " + this.getBaseURL());
        final String uri = uriDef;
        if (this.getBaseURL() == null) {
            try {

                final URL result = new URL(uri);
                final String externalForm = result.toExternalForm();
                setBaseURL(externalForm);

            } catch (MalformedURLException e) {

                try {
                    setBaseURL(new File(".").toURI().toURL().toExternalForm());
                } catch (Exception e1) {
                    XRLog.exception(
                            "The default NaiveUserAgent doesn't know how to resolve the base URL for " + uri);
                    return null;
                } // End of try catch
            } // End of if resolve URI
        } // End of if

        return this.findBaseURLAndURI(uri);
    }

    private void scaleToOutputResolution(Image image) {
        float factor = _sharedContext.getDotsPerPixel();
        image.scaleAbsolute(image.getPlainWidth() * factor, image.getPlainHeight() * factor);
    }

    /**
     * Implementation Routine getImageResource.
     * @param uri String
     * @return ImageResource
     * @see org.xhtmlrenderer.extend.UserAgentCallback#getImageResource(String)
     */
    public ImageResource getImageResource(String uri) {

        ImageResource resource = null;
        uri = resolveURI(uri);
        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.width() * _outputDevice.getDotsPerPoint());
                        image.setInitialHeight(rect.height() * _outputDevice.getDotsPerPoint());
                        resource = new ImageResource(image);
                    } else {
                        Image image = Image.getInstance(url);
                        scaleToOutputResolution(image);
                        resource = new ImageResource(new ITextFSImage(image));
                    }
                    _imageCache.put(uri, resource);

                } catch (IOException e) {
                    XRLog.exception("Can't read image file; unexpected problem for URI '" + uri + "'", e);
                } catch (BadElementException e) {
                    XRLog.exception("Can't read image file; unexpected problem for URI '" + uri + "'", e);
                }
            }
        }
        if (resource == null) {
            resource = new ImageResource(null);
        }
        return resource;
    }

    /** 
     * Get the main base URL, to override any sub-classes attempting to change baseURL.
     */
    public String getCoreBaseURL() {
        return coreBaseURL;
    }

    /** 
     * Set the main base URL, to override any sub-classes attempting to change baseURL.
     */
    public void setCoreBaseURL(String coreBaseURL) {
        this.coreBaseURL = coreBaseURL;
    }

} // End of the Class //