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

org.jpedal.parser.text.TD Maven / Gradle / Ivy

The 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


 *
 * ---------------
 * TD.java
 * ---------------
 */
package org.jpedal.parser.text;

import org.jpedal.objects.TextState;

import org.jpedal.utils.Matrix;

public class TD {

    /**used to speed-up conversion of hex strings to numbers*/
    static final int[] multiply8={0,3,6,9,12,15};

    static final int[] multiply16={0,4,8,12,16,20,24,28,32,36,40};

    public static void execute(final boolean isLowerCase, final float x, final float y, final TextState currentTextState) {

        relativeMove(x, y,currentTextState);

        if (!isLowerCase) { //set leading as well
            final float TL = -y;
            currentTextState.setLeading(TL);
        }
    }

    /**
     * used by TD and T* to move current co-ord
     */
    public static void relativeMove(final float new_x, final float new_y, final TextState currentTextState) {

        //create matrix to update Tm
        final float[][] temp = new float[3][3];

        currentTextState.Tm = currentTextState.getTMAtLineStart();

        //set Tm matrix
        temp[0][0] = 1;
        temp[0][1] = 0;
        temp[0][2] = 0;
        temp[1][0] = 0;
        temp[1][1] = 1;
        temp[1][2] = 0;
        temp[2][0] = new_x;
        temp[2][1] = new_y;
        temp[2][2] = 1;

        //multiply to get new Tm
        currentTextState.Tm = Matrix.multiply(temp, currentTextState.Tm);

        currentTextState.setTMAtLineStart();

    }


    /**
     * get unicode/escape value and convert to value
     */
    static int readEscapeValue(final int start, final int count, final int base, final byte[] characterStream) {

        int val;

        switch(base) {
            case 8:
                val = getOctal(start, count, characterStream);
                break;

            case 16:
                val = getHex(start, count, characterStream);
                break;

            default:
                val = getGeneral(start, count, base, characterStream);
           break;
        }

        return val;
    }

    private static int getGeneral(int start, int count, int base, byte[] characterStream) {

        final StringBuilder chars = new StringBuilder(10);

        for (int pointer = 0; pointer < count; pointer++) {
            chars.append((char) characterStream[start + pointer]);
        }

        return Integer.parseInt(chars.toString(), base);

    }

    private static int getHex(int start, int count, byte[] characterStream) {

        int val=0;

        //now convert to value
        int topHex, ptr=0;
        for (int aa = 1; aa < count + 1; aa++) {

            topHex = characterStream[start + count - aa];

            //convert to number
            if (topHex >= 'A' && topHex <= 'F') {
                topHex -= 55;
            } else if (topHex >= 'a' && topHex <= 'f') {
                topHex -= 87;
            } else if (topHex >= '0' && topHex <= '9') {
                topHex -= 48;
            } else {    //ignore 'bum' values
                continue;
            }
            val += (topHex << multiply16[ptr]);
            ptr++;
        }
        return val;
    }

    private static int getOctal(int start, int count, byte[] characterStream) {

        //now convert to value
        int topHex, ptr=0, val=0;

        for (int aa = 1; aa < count + 1; aa++) {

            topHex = characterStream[start + count - aa];

            //convert to number
            if (topHex >= '0' && topHex <= '7') {
                topHex -= 48;
            } else {    //ignore 'bum' values
                continue;
            }
            val += (topHex << multiply8[ptr]);
            ptr++;
        }
        return val;
    }


    /**
     * convert to to String
     */
    static String getString(final int start,int end, final byte[] dataStream) {

        final String s;

        //lose spaces or returns at end
        while(dataStream[end]==32 || dataStream[end]==13 || dataStream[end]==10) {
            end--;
        }

        final int count=end-start+1;

        //discount duplicate spaces
        int spaces=0;
        for(int ii=0;ii0 &&(dataStream[start+ii]==32 || dataStream[start+ii]==13 ||dataStream[start+ii]==10)&&
                    (dataStream[start+ii-1]==32|| dataStream[start+ii-1]==13|| dataStream[start+ii-1]==10)) {
                spaces++;
            }
        }

        final char[] charString=new char[count-spaces];
        int pos=0;

        for(int ii=0;ii0)&&((dataStream[start+ii]==32)||(dataStream[start+ii]==13)||(dataStream[start+ii]==10))&&
                    ((dataStream[start+ii-1]==32)||(dataStream[start+ii-1]==13)||(dataStream[start+ii-1]==10)))
            {
            }else{
                if((dataStream[start+ii]==10)||(dataStream[start+ii]==13)) {
                    charString[pos] = ' ';
                } else {
                    charString[pos] = (char) dataStream[start + ii];
                }
                pos++;
            }
        }

        s=String.copyValueOf(charString);

        return s;

    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy