File Source: pebblepdfcreationlistener.java

         /* 
    P/P   *  Method: net.sourceforge.pebble.web.listener.PebblePDFCreationListener__static_init
          * 
          *  Postconditions:
          *    init'ed(log)
          */
     1  /*
     2   * Copyright (c) 2003-2006, Simon Brown
     3   * All rights reserved.
     4   *
     5   * Redistribution and use in source and binary forms, with or without
     6   * modification, are permitted provided that the following conditions are met:
     7   *
     8   *   - Redistributions of source code must retain the above copyright
     9   *     notice, this list of conditions and the following disclaimer.
    10   *
    11   *   - Redistributions in binary form must reproduce the above copyright
    12   *     notice, this list of conditions and the following disclaimer in
    13   *     the documentation and/or other materials provided with the
    14   *     distribution.
    15   *
    16   *   - Neither the name of Pebble nor the names of its contributors may
    17   *     be used to endorse or promote products derived from this software
    18   *     without specific prior written permission.
    19   *
    20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    30   * POSSIBILITY OF SUCH DAMAGE.
    31   */
    32  package net.sourceforge.pebble.web.listener;
    33  
         /* 
    P/P   *  Method: void net.sourceforge.pebble.web.listener.PebblePDFCreationListener()
          * 
          *  Postconditions:
          *    this.headerTags == &new Properties(PebblePDFCreationListener#1)
          *    new Properties(PebblePDFCreationListener#1) num objects == 1
          */
    34  import org.xhtmlrenderer.pdf.ITextRenderer;
    35  import org.xhtmlrenderer.pdf.PDFCreationListener;
    36  
    37  import java.util.Properties;
    38  import java.util.Enumeration;
    39  
    40  import org.w3c.dom.Document;
    41  import org.w3c.dom.Element;
    42  import org.w3c.dom.Node;
    43  import org.w3c.dom.NodeList;
    44  
    45  import com.lowagie.text.pdf.PdfName;
    46  import com.lowagie.text.pdf.PdfString;
    47  import com.lowagie.text.pdf.PdfObject;
    48  import com.lowagie.text.pdf.PdfWriter;
    49  import com.lowagie.text.pdf.PdfDictionary;
    50  
    51  import org.apache.commons.logging.Log;
    52  import org.apache.commons.logging.LogFactory;
    53  
    54  /**
    55   * Add ability to manipulate PDF output document before it's closed and opened.
    56   *  
    57   * Soltuion was adopted from: https://xhtmlrenderer.dev.java.net/servlets/ReadMsg?listName=users&msgNo=1908
    58   *
    59   * @author    Alexander Zagniotov
    60   */
    61  public class PebblePDFCreationListener implements PDFCreationListener {
    62  
    63  	/** the log used by this class */
    64  	private static Log log = LogFactory.getLog(PebblePDFCreationListener.class);
    65  	
    66  	Properties headerTags = null;
    67  
    68  	public PebblePDFCreationListener()  {
    69  		headerTags = new Properties();
    70  	}
    71  
        	 /* 
    P/P 	  *  Method: void parseMetaTags(Document)
        	  * 
        	  *  Preconditions:
        	  *    (soft) log != null
        	  *    (soft) sourceXHTML != null
        	  *    (soft) this.headerTags != null
        	  * 
        	  *  Presumptions:
        	  *    org.w3c.dom.Document:getDocumentElement(...)@76 != null
        	  *    org.w3c.dom.Element:getAttribute(...)@83 != null
        	  *    org.w3c.dom.Element:getAttribute(...)@84 != null
        	  *    org.w3c.dom.Element:getElementsByTagName(...)@76 != null
        	  *    org.w3c.dom.Element:getElementsByTagName(...)@78 != null
        	  *    ...
        	  * 
        	  *  Test Vectors:
        	  *    java.lang.String:length(...)@87: {0}, {1..232-1}
        	  */
    72  	public void parseMetaTags(Document sourceXHTML) {
    73          
    74  		try {
    75  
    76  			NodeList e = sourceXHTML.getDocumentElement().getElementsByTagName("head");
    77  			Element e1 = (Element) e.item(0);
    78  			NodeList retVal = e1.getElementsByTagName("meta");
    79  
    80  			for (int i = 0; i < retVal.getLength(); i++) {
    81  					
    82  					Element thisNode = (Element) retVal.item(i);
    83  					String name = thisNode.getAttribute("name");
    84  					String content = thisNode.getAttribute("content");
    85  				 
    86  					//<meta name="XXXXX" content="XXXXX" />
    87  					if (name.length() != 0 && content.length() != 0) {
    88  						headerTags.setProperty(name,content);
    89  					}
    90  				}
    91  		}
    92      
    93  		catch (Exception e)  {
    94  				log.warn("Could not parse header meta tags: " + e);
    95  		}
    96       }
    97  
    98    
    99      /**
   100  	 * Called directly before calling open() on the Document. 
   101  	 * That allows you to e.g. modify headers before the document is created.
   102  	 *
   103  	 */
   104  	public void preOpen(ITextRenderer renderer) { 
   105  
   106  		try {
        			 /* 
    P/P 			  *  Method: void preOpen(ITextRenderer)
        			  * 
        			  *  Preconditions:
        			  *    (soft) log != null
        			  *    (soft) renderer != null
        			  *    (soft) this.headerTags != null
        			  * 
        			  *  Presumptions:
        			  *    init'ed(com.lowagie.text.pdf.PdfName.AUTHOR)
        			  *    init'ed(com.lowagie.text.pdf.PdfName.CREATOR)
        			  *    init'ed(com.lowagie.text.pdf.PdfName.KEYWORDS)
        			  *    init'ed(com.lowagie.text.pdf.PdfName.PRODUCER)
        			  *    init'ed(com.lowagie.text.pdf.PdfName.SUBJECT)
        			  *    ...
        			  * 
        			  *  Test Vectors:
        			  *    java.lang.String:equals(...)@139: {0}, {1}
        			  *    java.lang.String:equals(...)@142: {0}, {1}
        			  *    java.lang.String:equals(...)@145: {0}, {1}
        			  *    java.lang.String:equals(...)@148: {0}, {1}
        			  *    java.lang.String:equals(...)@151: {0}, {1}
        			  *    java.lang.String:equals(...)@154: {0}, {1}
        			  *    org.xhtmlrenderer.pdf.ITextRenderer:getWriter(...)@109: Inverse{null}, Addr_Set{null}
        			  */
   107  			Enumeration e = headerTags.propertyNames();
   108  
   109  			PdfWriter writer = renderer.getWriter(); 
   110  
   111  			 if (writer == null) {
   112  					 log.warn("PdfWriter is null, not able to set header meta tags to PDF document");
   113  					 return;
   114  			 }
   115  
   116  			 /*
   117  					Available versions:
   118  					PdfWriter.VERSION_1_2,
   119  					PdfWriter.VERSION_1_3,
   120  					PdfWriter.VERSION_1_4,  //default
   121  					PdfWriter.VERSION_1_5,
   122  					PdfWriter.VERSION_1_6,
   123  					PdfWriter.VERSION_1_7
   124  				*/
   125  			writer.setPdfVersion(PdfWriter.VERSION_1_5);
   126  
   127  			//Full compression means that not only page streams are compressed, 
   128  			//but some other objects as well, such as the cross-reference table. 
   129  			//This is only possible since PDF-1.5
   130  			writer.setFullCompression();
   131  
   132  			while (e.hasMoreElements())  { 
   133  
   134  				  String key = (String) e.nextElement() ;
   135  				  PdfString val = new PdfString(headerTags.getProperty(key), PdfObject.TEXT_UNICODE);
   136  
   137  				  PdfDictionary dictionary = writer.getInfo();
   138  				  
   139  				  if (key.equals("title" )) {
   140  						dictionary.put(PdfName.TITLE, val);
   141  				  }
   142  				  else if (key.equals("author")) {
   143  						dictionary.put(PdfName.AUTHOR, val);  
   144  				  }
   145  				  else if (key.equals("subject")) {
   146  						dictionary.put(PdfName.SUBJECT, val);  
   147  				  }
   148  				  else if (key.equals("keywords")) {
   149  						dictionary.put(PdfName.KEYWORDS, val);  
   150  				  }
   151  				  else if (key.equals("creator")) {
   152  						dictionary.put(PdfName.CREATOR, val);  
   153  				  }
   154  				  else if (key.equals("producer")) {
   155  						dictionary.put(PdfName.PRODUCER, val);  
   156  				  }
   157  				  else  {
   158  						log.warn("Unexpected header meta tag: " + key + ", value: " + val);
   159  				  }
   160  				}
   161  			}
   162  			catch (Exception e)  {
   163  				log.warn("Could not set header meta tags to PDF document: " + e);
   164  			}
   165  	}
   166  
   167      public void onClose(ITextRenderer renderer) { 
   168  
        		 /* 
    P/P 		  *  Method: void onClose(ITextRenderer)
        		  * 
        		  *  Preconditions:
        		  *    renderer != null
        		  *    (soft) log != null
        		  * 
        		  *  Test Vectors:
        		  *    org.xhtmlrenderer.pdf.ITextRenderer:getWriter(...)@169: Inverse{null}, Addr_Set{null}
        		  */
   169  		PdfWriter writer = renderer.getWriter(); 
   170  
   171  		if (writer == null) {
   172  			 log.warn("PdfWriter is null, not able to set header meta tags to PDF document");
   173  			 return;
   174  		}
   175  
   176  		//Display doc title in the title bar instead of filename,
   177  		writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
   178  
   179  	}
   180  }








SofCheck Inspector Build Version : 2.22510
pebblepdfcreationlistener.java 2010-Jun-25 19:40:32
pebblepdfcreationlistener.class 2010-Jul-19 20:23:38