All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jpedal.io.NameLookup Maven / Gradle / Ivy

There is a newer version: 20151002
Show newest version
/*
 * ===========================================
 * Java Pdf Extraction Decoding Access Library
 * ===========================================
 *
 * Project Info:  http://www.idrsolutions.com
 * Help section for developers at http://www.idrsolutions.com/support/
 *
 * (C) Copyright 1997-2015 IDRsolutions and Contributors.
 *
 * This file is part of JPedal/JPDF2HTML5
 *
     This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 *
 * ---------------
 * NameLookup.java
 * ---------------
 */
package org.jpedal.io;

import org.jpedal.objects.Javascript;
import org.jpedal.objects.raw.NamesObject;
import org.jpedal.objects.raw.PdfArrayIterator;
import org.jpedal.objects.raw.PdfDictionary;
import org.jpedal.objects.raw.PdfObject;
import org.jpedal.utils.StringUtils;

import java.util.HashMap;
import org.jpedal.objects.raw.XObject;

/**
 * convert names to refs
 */
public class NameLookup extends HashMap {

    private final PdfFileReader objectReader;

    /**
     *
     * @param objectReader
     */
    public NameLookup(final PdfFileReader objectReader) {

        this.objectReader=objectReader;

    }

    /**
     * read any names
     * @param nameObject
     * @param javascript
     * @param isKid
     */
    public void readNames(final PdfObject nameObject, final Javascript javascript, final boolean isKid){

        final ObjectDecoder objectDecoder=new ObjectDecoder(objectReader);
        objectDecoder.checkResolved(nameObject);

        /**
         *  loop to read required values into lookup
         */
        final int[] nameLists= {PdfDictionary.Dests, PdfDictionary.JavaScript,PdfDictionary.XFAImages};
        int count=nameLists.length;
        if(isKid) {
            count = 1;
        }

        PdfObject pdfObj;
        PdfArrayIterator namesArray;

        String name,value;

        for(int ii=0;ii 0) {

                    for (final byte[] aKidList : kidList) {

                        final String nextValue = new String(aKidList);

                        final PdfObject nextObject = new NamesObject(nextValue);
                        nextObject.ignoreRecursion(false);

                        objectReader.readObject(nextObject);

                        readNames(nextObject, javascript, true);
                    }
                }
            }

            //get any names object
            namesArray = pdfObj.getMixedArray(PdfDictionary.Names);

            //read all the values
            if (namesArray != null && namesArray.getTokenCount()>0) {
                while (namesArray.hasMoreTokens()) {
                    name =namesArray.getNextValueAsString(true);

                    //fix for baseline_screens/11jun/Bundy_vs_F_Kruger_Sons_Bundy_v_F_Kruger!~!2200.pdf
                    //as code assumes paired values and not in this file (List a list)
                    if(!namesArray.hasMoreTokens()) {
                        continue;
                    }

                    value =namesArray.getNextValueAsString(true);

                    switch(nameLists[ii]){
                        //if Javascript, get full value and store, otherwise just get name
                        case PdfDictionary.JavaScript:
                            setJavaScriptName(value, objectDecoder, javascript, name);
                            break;
                            
                        case PdfDictionary.XFAImages:
                            setXFAImage(value, objectDecoder, name);
                            break;
                            
                        default: //just store
                            this.put(name, value);
                    }
                }
            }
        }
    }

    private void setXFAImage(final String value, final ObjectDecoder objectDecoder, final String name) {
        
        final PdfObject XFAImagesObj=new XObject(value);
        XFAImagesObj.decompressStreamWhenRead();
        final byte[] xfaData=StringUtils.toBytes(value);
        if(xfaData[0]=='<') {
            XFAImagesObj.setStatus(PdfObject.UNDECODED_DIRECT);
        } else {
            XFAImagesObj.setStatus(PdfObject.UNDECODED_REF);
        }
        
        if(value.contains(" ") || value.contains("<")){
            
            //must be done AFTER setStatus()
            XFAImagesObj.setUnresolvedData(xfaData, PdfDictionary.XObject);
            objectDecoder.checkResolved(XFAImagesObj);

            final byte[] decodedImageData=objectReader.readStream(XFAImagesObj, true, true, false, false, false, null);

            this.put(name,decodedImageData);
        }
    }

    static void setJavaScriptName(final String value, final ObjectDecoder objectDecoder, final Javascript javascript, final String name) {
        final String JSstring;
        
        final PdfObject javascriptObj=new NamesObject(value);
        final byte[] jsData=StringUtils.toBytes(value);
        if(jsData[0]=='<') {
            javascriptObj.setStatus(PdfObject.UNDECODED_DIRECT);
        } else {
            javascriptObj.setStatus(PdfObject.UNDECODED_REF);
        }
        
        if(value.contains(" ") || value.contains("<")){
            //must be done AFTER setStatus()
            javascriptObj.setUnresolvedData(jsData, PdfDictionary.JS);
            objectDecoder.checkResolved(javascriptObj);
            
            
            final PdfObject JS=javascriptObj.getDictionary(PdfDictionary.JS);
            if(JS!=null){ //in stream
                JSstring=new String(JS.getDecodedStream());
            }else{ //can also be text
                JSstring=javascriptObj.getTextStreamValue((PdfDictionary.JS));
            }
        }else{
            JSstring=value;
        }
        
        if(JSstring!=null){
            //store
            javascript.setCode(name, JSstring);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy