com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java Source code

Java tutorial

Introduction

Here is the source code for com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java

Source

package com.santaanna.friendlyreader.pdfstod.pdfstod3;

/*  ReplaceStringStreamEngine.java
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.LinkedList;
import java.util.Vector;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.geom.GeneralPath;

import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.cos.COSNumber;
import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSInteger;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSStream;

import org.apache.pdfbox.exceptions.COSVisitorException;

import org.apache.pdfbox.pdfwriter.ContentStreamWriter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.font.PDFont;

import org.apache.pdfbox.pdmodel.common.PDStream;

import org.apache.pdfbox.util.PDFOperator;
import org.apache.pdfbox.util.PDFStreamEngine;

import org.apache.pdfbox.util.ResourceLoader;
import org.apache.pdfbox.util.TextPosition;

// AH* Klasser fr att gra sammanfattningen:

import java.util.ArrayList;
import java.util.Collection;
import com.santaanna.friendlyreader.pdfstod.CogsumApplet.SEArrayIndKlass;
import com.santaanna.friendlyreader.pdfstod.CogsumApplet.SEArrayNumber;
import com.santaanna.friendlyreader.pdfstod.CogsumApplet.SECosstr;
import com.santaanna.friendlyreader.pdfstod.CogsumApplet.SETextBlock;
import com.santaanna.friendlyreader.pdfstod.CogsumApplet.SEmening;
import com.santaanna.friendlyreader.pdfstod.CogsumApplet.SEmeningsdel;
import com.santaanna.friendlyreader.summarization.reader.Document;
import com.santaanna.friendlyreader.summarization.reader.Summary;
import com.santaanna.friendlyreader.summarization.reader.SummaryReader;
import com.santaanna.friendlyreader.summarization.summarizer.CogSum;
import com.santaanna.friendlyreader.summarization.Settings;

/**
 * This is an example that will replace a string in a PDF with a new one.
 *
 * The example is taken from the pdf file format specification.
 *
 * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
 * @version $Revision: 1.3 $
 */

public class ReplaceStringStreamEngine extends PDFStreamEngine {
    private static List tokenlist;
    private Graphics2D graphics;
    private Dimension pageSize;
    public PDDocument doc1 = null;
    private PDPage page = null;
    private PDPage page1 = null;
    private GeneralPath linePath = new GeneralPath();
    public static int stringlen = 0;
    public static int currstringlen = 0;
    public static byte[] bytestr;
    public static String strtp = ""; // AH* Samlade stringen frn COSString.
    public static String helaTexten = ""; //AH* Totala texten!
    // public static Vector<String> meningarna;  // Anvnds inte!

    public static float sumcharAlla = 0; //AH* Bredden fr hela stringen.
    public float[] sumcharwidth = new float[1000]; // AH* array med char width fr varje char.
    public static float tpx;
    public static float tpy;
    public static SECosstr SEC = null; // Textblocks string struktur.
    public static Vector<SETextBlock> TBVector; // TBVector per sida.
    public static Vector<Vector> PageVector = new Vector<Vector>(); // Vektor som innehller siddata.
    // public Vector<SEmening> menvektor = new Vector<SEmening>(); // Anv temporrt.
    public int TBIndex = 0; // Aktuellt index till TBVector!
    public static SETextBlock setb = null;
    public static boolean ISArray = false;
    public static int arraysize = 0;
    public static int tbpagenr = 0;
    public static int mind = 0; // Index fr aktuell mening.
    public static Vector<SEmening> meningsvektor = new Vector<SEmening>();// Vektor som lagrar meningarna.
    public static boolean skrivut = false;
    private String outputFile = "";
    private PDDocument doc = null;
    public static List ptokens = null; // Sparade tokens p en sida.
    public static Vector<List> pageTokens = new Vector<List>(); // Vektor med tokens p alla sidor.
    // Sammanfattningsvariabler:
    public static int cosenr = 0; // Nummer p aktuell COSString eller COSArray.
    public static boolean medisammanf = true;
    public static int mennr = 0; // Aktuellt meningsnummer.
    public static int mendelnr = 0;
    public static int mendelantal = 0; // Antal delar som en mening bestr av.

    public static int[] menisammanfattn = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };

    public static int[] menisammanfattningenTest = // xxx
            { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };

    // AH* Data som anvnds av sammanfattningen:
    public static ArrayList<Integer> menisammanfattningen;
    public static int sumslidval = 0;
    static ArrayList<String> sentences;
    static SummaryReader reader;
    static ArrayList<Integer> indexSummary;
    public static int valdsida = -1;
    static int tempsidnr;

    public static void resetXY() {
        tpx = 0;
        tpy = 0;
    }

    /*
     * SkrivUt(String)
     */

    public static void SkrivUt(String str) {
        // if (skrivut)
        System.out.println(str);
    }

    /*
    * SkrivUt(String)
    */

    public static void SkrivUt(int plats, String str) {
        switch (plats) {
        case 0:
            System.out.println(str); // catch utskrifter.
            break;
        case 1: // System.out.println(str);
            break;
        case 2: // System.out.println(str);
            break;
        case 3: // System.out.println(str);
            break;
        case 4: // System.out.println(str); // Mnga grundutskrifter.
            break;
        case 5: // System.out.println(str); // I TextPosition.
            break;
        case 6:
            System.out.println(str);
            break;
        case 7:
            System.out.println(str);
            break;
        default:
            System.out.println("Ingen match i Skrivut!");
            break;

        }
    }

    public static void SkrivUt2(int plats, String str) {
        switch (plats) {
        case 0:
            System.out.print(str);
            break;
        case 1: // System.out.println(str);
            break;
        case 2: // System.out.println(str);
            break;
        case 3:
            System.out.print(str);
            break;
        case 4: // System.out.print(str); //Loop i TextPosition.
            break;
        case 5:
            System.out.print(str);
            break;
        case 6:
            System.out.print(str);
            break;
        case 7:
            System.out.print(str);
            break;
        default:
            System.out.print("Ingen match i Skrivut2!");
            break;

        }
    }

    /**
    * encoding that text will be written in (or null).
    */
    protected String outputEncoding = "Unicode"; // "UTF-16"; // Samma som i PDFHighlighter.java

    /**
    * The normalizer is used to remove text ligatures/presentation forms
    * and to correct the direction of right to left text, such as Arabic and Hebrew.
    */
    // private TextNormalize normalize = null;

    /**
     * Constructor.
     */
    public ReplaceStringStreamEngine() throws IOException {
        super(ResourceLoader.loadProperties("Resources/MyPropertyFile.properties", true));
        // this.outputEncoding = null;
        // normalize = new TextNormalize(this.outputEncoding);
        // AH Tillagd.
        SkrivUt(4, "Konstruktorn klar.");
    }

    /* baraBlanka kollar om varje tecken i en string r ett blanktecken.
     *
     */

    public static Boolean baraBlanka(String instr) {
        for (int b = 0; b < instr.length(); b++) {
            if (!isBlank(instr.charAt(b)))
                return false;
        }
        return true;
    }

    /*
     *  isBlank kollar om tecknet r blankt.
     */

    public static Boolean isBlank(char c) {
        if ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r') || (c == '\f'))
            return true;
        else
            return false;
    }

    /*
     *  isSlutTecken kollar om tecknet r sluttecken.
     */

public static Boolean isSlutTecken(char c)
{
    if ((c == '.')||(c =='!')|| (c == '?')||(c==''))
        return true;
    else return false;
}

    /*
     *  isVersal testa om 
     */

public static Boolean isVersal(char c)
{
    if ((c == '')||(c =='')|| (c == '')||
            ((c >= '0')&& (c <= '9'))||
            ((c >= 'A')&&(c <='Z')))
        return true;
    else return false;
}

    /*
     * Hitta meningarna letar igenom helaTexten och sparar
     * separata meningar som den hittar.
     */

    public static Vector<SEmening> Hittameningarna(String helaTexten) {
        int antal = 0;
        final int vanligText = 0;
        final int slutTecken = 1;
        final int blanka = 2;
        final int versaler = 3;
        int state = vanligText;
        String tempmening = "";
        String tempstr = "";
        SEmening semening = new SEmening(); // AH* ndrad struktur.
        Vector<SEmening> meningsvektor = new Vector(); // AH* ndrad struktur.
        int meningsnummer = 0;
        int k;
        char tc;
        for (k = 0; k < helaTexten.length(); k++) {
            tc = helaTexten.charAt(k);
            switch (state) {
            case vanligText: // Alla tecken utom sluttecken.
                // Vid sluttecken byt state.
                if (isSlutTecken(tc)) {
                    state = slutTecken;
                    tempmening += tc;
                } else // Samma fr alla efterkommande tecken.
                {
                    tempmening += tc;
                }
                break;
            case slutTecken: // .,!? och ...
                if (isSlutTecken(tc)) {
                    tempmening += tc;
                } else if (isBlank(tc)) {
                    state = blanka;
                    tempstr += tc;
                } else if (isVersal(tc)) { // Ny mening. >> Krver INTE blanka innan!
                                           // Spara tidigare mening.
                    semening = new SEmening();
                    semening.helameningen = tempmening;
                    meningsvektor.add(semening);
                    meningsnummer++;
                    tempmening = "" + tc;
                    state = vanligText;
                } else // inte sluttecken, blank eller versal.
                { // => fortsatt mening!
                    tempmening += tc;
                    state = vanligText;
                }
                break;
            case blanka: // ' ', '\t','\n'
                // Bara blanka efter sluttecken!
                if (isBlank(tc)) {
                    tempstr += tc;
                } else if (isVersal(tc)) { // Ny mening.
                                           // Spara tidigare mening.
                    semening = new SEmening();
                    semening.helameningen = tempmening;
                    meningsvektor.add(semening);
                    meningsnummer++;
                    tempmening = tempstr + tc;
                    tempstr = "";
                    state = vanligText;
                } else // Ingen ny mening!
                {
                    tempmening += tempstr + tc;
                    tempstr = "";
                    state = vanligText;
                }
                break;

            case versaler: // A-Z, ,,, 0-9.
                // Start p ny mening hittad. INGET SKALL GRAS!
                break;
            default:
                SkrivUt(4, "Inget alt vid meningslsning.");
            }

        }
        // Efterbearbetning av resultatet!
        switch (state) {
        case vanligText: // Alla tecken utom sluttecken.
            // Vid sluttecken byt state.
            semening = new SEmening();
            semening.helameningen = tempmening;
            meningsvektor.add(semening);
            meningsnummer++;
            break;
        case slutTecken: // .,! och ?
            semening = new SEmening();
            semening.helameningen = tempmening;
            meningsvektor.add(semening);
            // meningsvektor.add( tempmening );
            meningsnummer++;
            break;
        case blanka: // ' ', '\t','\n'
            semening = new SEmening();
            semening.helameningen = tempmening;
            meningsvektor.add(semening);
            semening = new SEmening();
            semening.helameningen = tempstr;
            meningsvektor.add(semening);
            // meningsvektor.add( tempmening );
            // meningsvektor.add(tempstr);
            meningsnummer += 2;
            break;
        case versaler: // A-Z, ,,, 0-9.
            // Start p ny mening hittad. INGET SKALL GRAS!
            break;
        default:
            SkrivUt(4, "Inget alt vid meningslsning.");
        }
        // Testutskrift av alla meningarna.
        // for (k=0; k< meningsnummer; k++ )
        // {
        //  SkrivUt(4, "Mening: " + meningsvektor.get(k));
        // }
        return meningsvektor;
    }

    /*            helaTexten
     public static Vector<String> meningarna
     *
     */

    /* OperatorCall testar att anropa en funktion med en operator och dess
     * argument. I nulget s skrivs endast operationen och argumenten ut.
     */

    public String OperatorCall(PDFOperator op, List arguments) {
        String retstr = op.toString();
        for (int k = 0; k < arguments.size(); k++) {
            retstr += " ," + arguments.get(k);
        }
        return retstr;
    }

    /*
     * setTokenList frmedlar TokenList frn andra klasser till denna klass.
     */

    public static void setTokenList(List tokens) {
        tokenlist = tokens;
    }

    /*
    * getTokenList returnerar TokenList.
    */

    public static List getTokenList() {
        return tokenlist;
    }

    /*
     *  addToArray skall addera en SECosstr till ett COSArray textblock.
     */

    public void addToArray(SECosstr SEC) {
        setb = new SETextBlock();
        setb.Carray.add(SEC);
        setb.IsArray = true;
        TBVector.add(TBIndex, setb);
    }

    /*
     * addToArray med nummer som indata lgger till ett nummer till arrayen.
     * 
     */

    public void addToArray(SEArrayNumber SEAN) {
        setb = new SETextBlock();
        setb.Carray.add(SEAN);
        setb.IsArray = true;
        TBVector.add(TBIndex, setb);
    }

    /* Funktion genom vilken aktuella textdata kan extraheras.
     * process the decoded text
     */

    public void processTextPosition(TextPosition tp) {
        // if (fas == PDFStreamEngine.splitstrings)

        String tpstr = tp.getCharacter();
        SkrivUt(5, "TextPosition: " + tpstr + " len: " + tpstr.length());
        SkrivUt(5, "spaceWidth: " + tp.getWidthOfSpace());
        SkrivUt(5, "Width: " + tp.getWidth()); // Fr TP, inte string!?
        int tempcurrstrlen = currstringlen;
        currstringlen += tpstr.length();
        strtp += tpstr;
        //AH* Data som sparas om string.
        byte[] bytedata = bytestr;
        PDFont strfont = tp.getFont();
        float strfontsizeIP = tp.getFontSizeInPt();
        SkrivUt(5, "strfontsizeIP: " + tp.getFontSizeInPt());
        float strfontsizeVal = tp.getFontSize();
        SkrivUt(5, "strfontsizeVal: " + tp.getFontSize());
        float[] charwidth = tp.getIndividualWidths(); // array av char bredder.
        float maxFontHeight = tp.getHeight(); // Gller alla tecken i fonten?
        // Dvs hela string?
        SkrivUt(5, "maxFontHeight: " + tp.getHeight());
        /* AH* Fel i bortkommenterat.
        if (firstInText) //Testa om frsta tp i string.
        {
         tpx = tp.getX(); // FEL, bara vid frsta TP i string!
         tpy = tp.getY(); // FEL, bara vid frsta TP i string!
         firstInText = false;
        }
         *
         */
        SkrivUt(5, "X: " + tpx + " Y: " + tpy);
        // int sumcharlen = 0;
        float sumcharAlla = 0; // Bredden fr hela string.
        // float[] sumcharwidth = new float[1000];
        for (int k = 0; k < tpstr.length(); k++) // charwidth.length; k++ )
        {
            SkrivUt2(4, " iw " + charwidth[k]);
            sumcharwidth[tempcurrstrlen + k] = charwidth[k];
        }
        SkrivUt(5, "");
        if (currstringlen < stringlen) // Inte avslutad n.
        {
            // Fortstt bara samla delstrngar.
        } else if (currstringlen == stringlen) {
            SkrivUt(5, "TextPosition hela: " + strtp);
            for (int k = 0; k < stringlen; k++) {
                SkrivUt2(4, " iw " + sumcharwidth[k]);
                sumcharAlla += sumcharwidth[k];
            }
            SkrivUt(5, "\nSumcharAlla: " + sumcharAlla);
            // Ta hand om resultat string...
            // Hanteras p annat hll: helaTexten += strtp;

            // Spara data till en Cosstring post.

            SEC = new SECosstr(0, // int mennrin
                    0, //int CARRind
                    strtp, // String cosstrin,
                    bytestr, // bytedatain,
                    strfont, // PDFont strfontin,
                    strfontsizeIP, // float strfontsizeIPin,
                    strfontsizeVal, // float strfontsizeValin,
                    sumcharwidth, // float[] charwidthin,
                    maxFontHeight, // float maxFontHeightin,
                    sumcharAlla, // float sumcharAllain,
                    tpx, // float xin,
                    tpy // float yin
            );

            if (ISArray) // Lgg till till COSArrayen.
            {
                addToArray(SEC);
            } else // Lgg till COSString till TB vektorn.
            {
                setb = new SETextBlock();
                setb.cstr = SEC;
                setb.IsArray = false;
                TBVector.add(TBIndex, setb);
            }

            strtp = "";
            currstringlen = 0;
            setSumcharAlla(0);

        } else // (currstringlen > stringlen) ny string eftersom lngden verskrider!
        {
            SkrivUt(5, "Fr stor string i processTextPosition.");
            SkrivUt(5, "Text: " + strtp + "currlen: " + currstringlen);
            strtp = "";
            currstringlen = 0;
            setSumcharAlla(0);
        }
    }

    /*               new TextPosition(
                        page,
                        textMatrixStDisp,
                        textMatrixEndDisp,
                        totalVerticalDisplacementDisp,
                        individualWidths,
                        spaceWidthDisp,
                        characterBuffer.toString(),
                        font,
                        fontSizeText,
                        (int)(fontSizeText * textMatrix.getXScale()),
                        wordSpacingDisp ));
     *
     */

    public void setSumcharAlla(float val) {
        sumcharAlla = val;
    }

    public float getSumcharAlla() {
        return sumcharAlla;
    }

    /*
     *   getHelaTexten hmtar HelaTexten frn en sida.
     */
    public String getHelaTexten(COSStream cosStream) {
        String HTexten = "";
        String string = "";

        try {
            List tokens = cosStream.getStreamTokens();
            // List tokens = getTokenList();// AH* parser.getTokens(); Tidigare hmtning av lista.
            // Dvs hmta INTE tokens frn den parsade filen. Anvnd tidigare data.
            LinkedList arguments = new LinkedList(); // AH* argumenten till operatorn.
            SkrivUt(2, "token-size: " + tokens.size()); // xxx
            for (int j = 0; j < tokens.size(); j++) {
                Object next = tokens.get(j);
                if (next instanceof PDFOperator) {
                    PDFOperator op = (PDFOperator) next;
                    //Tj and TJ are the two operators that display
                    //strings in a PDF
                    //AH:
                    //SkrivUt(4, "ArgumentList length: " + arguments.size());
                    //>> AH* SkrivUt(4, "Operator anrop:" + OperatorCall( op, arguments ));
                    // AH: Hr borde man gra ett anrop till StreamEngine!
                    arguments = new LinkedList(); // Mste nollstlla argumenten
                    // efter varje operator.
                    if (op.getOperation().equals("Tj")) {
                        //Tj takes one operator and that is the string
                        //to display so lets update that operator
                        COSString previous = (COSString) tokens.get(j - 1);
                        string = previous.getString();
                        // SkrivUt(2, "Hittat Tj. String: " + string); // xxx
                        HTexten += string;
                        // string = string.replaceFirst( strToFind, message );
                        // previous.reset();
                        // previous.append( string.getBytes() );
                        // AH* Testa tillgg av kod.
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                            
                          */
                    } else if (op.getOperation().equals("TJ")) {
                        COSArray previous = (COSArray) tokens.get(j - 1);
                        for (int k = 0; k < previous.size(); k++) {
                            Object arrElement = previous.getObject(k);
                            if (arrElement instanceof COSString) {
                                COSString cosString = (COSString) arrElement;
                                string = cosString.getString();
                                // SkrivUt(2, "Hittat TJ. String: " + string); // xxx
                                HTexten += string;
                                // string = string.replaceFirst( strToFind, message );
                                // cosString.reset();
                                // cosString.append( string.getBytes() );
                            }
                        }
                        // AH: Tillagd kod!
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                        */
                    }
                } else // Inte PDFOperator, samla argument!
                {
                    if (next instanceof COSBase) {
                        arguments.add(next);
                        //SkrivUt(4, "COSBase " + next.toString());
                    } else {
                        SkrivUt(4, "next inte rtt typ!");
                    }
                }
            }
            //now that the tokens are updated we will replace the
            //page content stream.
            /*
            PDStream updatedStream = new PDStream(doc);
            OutputStream out = updatedStream.createOutputStream();
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens( tokens );
            page.setContents( updatedStream );
             *
             */
        } catch (java.io.IOException ioe) {
            SkrivUt(4, "Exception i getHelaTexten.");
        }
        return HTexten;
    }

    /*
     * arraycopy kopierar en COSArray och returnerar innehllet.
     */

    public COSArray arraycopy(COSArray carr) {
        COSArray retcarr = new COSArray();
        for (int cind = 0; cind < carr.size(); cind++) {
            retcarr.add(carr.get(cind));
        }
        return retcarr;
    }

    /*
     *   splitMeningar splittrar strings vid meningsskifte.
     *   Detta sker sidvis.
     *   Resterande av helaTexten returneras till nsta sida.
     *   mindex r aktuellt index i meningsvektorn.
     *   reststr r resten av meningen som r kvar fr bearbetning av nsta sida.
     */

    public String splitMeningar(String reststr, COSStream cosStream) {
        SkrivUt(4, "Frst i splitmeningar.");
        // Anvnd meningsvektor fr att hmta meningar.
        // Metoden rknar bara tecknen i string och mening och antar att de r synkade
        // i vrigt.
        // ShowText Tj = new ShowText(); // Tj
        // ShowTextGlyph TJ = new ShowTextGlyph(); // TJ
        int mindex = mind;
        PDFOperator Tj = PDFOperator.getOperator("Tj");
        PDFOperator TJ = PDFOperator.getOperator("TJ");
        String restretur = ""; // Resterande text p meningsrad. En arbetsstruktur.
        String men; // Aktuell meningsstruktur.
        if (reststr != "")
            men = reststr;
        else
            men = meningsvektor.get(mindex).helameningen;
        // terskrivet Hit!
        int menlen = men.length(); // Lngden p den aktuella meningen.
        int mvektlen = meningsvektor.size(); // Storleken p vektorn.
        byte[] bytestr; // string representerad som byte[]
        byte[] tempbstr; // byte[] fr temporr lagring.
        int strlen; // Lngden p den aktuella stringen.
        COSString prevny = null;
        boolean firsttime = true;
        boolean kapad = false;
        List tokens = null;
        try {
            tokens = cosStream.getStreamTokens();
            // pageTokens.add(tokens); Fungerande hantering.
            SkrivUt(4, "Splitmeningar, data innan split.");
            listTokens(tokens); // Data innan split.
            // List tokens = getTokenList();// AH* parser.getTokens(); Tidigare hmtning av lista.
            // Dvs hmta INTE tokens frn den parsade filen. Anvnd tidigare data.
            LinkedList arguments = new LinkedList(); // AH* argumenten till operatorn.
            SkrivUt(4, ">>> Split-Token size: " + tokens.size());
            for (int j = 0; j < tokens.size(); j++) {
                Object next = tokens.get(j);
                if (next instanceof PDFOperator) {
                    PDFOperator op = (PDFOperator) next;
                    //Tj and TJ are the two operators that display
                    //strings in a PDF
                    //AH:
                    //SkrivUt(4, "ArgumentList length: " + arguments.size());
                    //>> AH* SkrivUt(4, "Operator anrop:" + OperatorCall( op, arguments ));
                    // AH: Hr borde man gra ett anrop till StreamEngine!
                    arguments = new LinkedList(); // Mste nollstlla argumenten
                    // efter varje operator.
                    if (op.getOperation().equals("Tj")) {
                        SkrivUt(4, "Tj hittad.");
                        //Tj takes one operator and that is the string
                        //to display so lets update that operator
                        COSString previous = (COSString) tokens.get(j - 1);
                        String string = previous.getString();
                        prevny = null;
                        bytestr = previous.getBytes();
                        strlen = string.length();
                        restretur = "";
                        SkrivUt(4, "Men: " + men);
                        SkrivUt(4, "string: " + string);
                        if (strlen > menlen) {
                            firsttime = true;
                            // Hela meningen r kortare n string.
                            // => Stega mening tills strlen < menlen.
                            while (strlen > menlen) // Tills strlen <= menlen.
                            { // Anvnder while eftersom string kan strcka sig ver flera meningar.
                              // I detta fall skall string kapas eftersom
                              // String innehller mer n en mening.
                              // Resterande delen skall sparas som en egen string.
                              // Minska strlen:
                                SkrivUt(4, "while strlen > menlen");
                                SkrivUt(4, "Men1: " + men);
                                SkrivUt(4, "string1: " + string);
                                byte[] prevbytestr = new byte[menlen];
                                for (int it = 0; it < menlen; it++) { // Ta fram den delstring som motsvarar slutet p meningen.
                                    prevbytestr[it] = bytestr[it];
                                }
                                // Lagra tillbaka prevbytestr till posten.
                                prevny = new COSString(prevbytestr);
                                // prevny.reset();
                                // prevny.append( prevbytestr );
                                // Spara tillbaka kapad string till tokens.
                                if (firsttime) {
                                    tokens.set(j - 1, prevny);
                                    firsttime = false;
                                } else {
                                    tokens.add(j + 1, Tj);
                                    tokens.add(j + 1, prevny);
                                    j = j + 2;
                                }
                                // Lgg in 0 g KVAR!
                                tempbstr = new byte[strlen - menlen];
                                // Kapa bort meningen frn string.
                                for (int it = menlen; it < strlen; it++) {
                                    tempbstr[it - menlen] = bytestr[it];
                                }
                                bytestr = tempbstr; // spara resterande string.
                                string = string.substring(menlen, strlen);
                                strlen = strlen - menlen; // Nya lngden p nya string
                                // Stega index f mening. Kolla vektorlngd.
                                // Stega j s att nsta string lggs in rtt!

                                mindex++;
                                if (mindex >= mvektlen) {
                                    sparaTokens(tokens);
                                    mind = mindex;
                                    return ""; // Fler sidor.
                                }
                                // Stega sjlva meningen.
                                men = (meningsvektor.get(mindex)).helameningen;
                                menlen = men.length();
                                SkrivUt(4, "Men2: " + men);
                                SkrivUt(4, "string2: " + string);
                            }
                            // Testa om strlen <= menlen.

                            if (strlen == menlen) {
                                // I detta fall skall data sparas tillbaka!
                                // Stega bda. Kolla frst om man r klar med sidan/ dokumentet.
                                // spara string.
                                SkrivUt(4, "strlen == menlen e while");
                                SkrivUt(4, "Men: " + men);
                                SkrivUt(4, "string: " + string);
                                prevny = new COSString(bytestr);
                                // prevny.reset();
                                // prevny.append( bytestr );
                                tokens.add(j + 1, Tj); // Spara Tj operatorn. Kolla index.
                                tokens.add(j + 1, prevny);
                                j = j + 3;
                                // Kolla vektorlngd innan kning.
                                mindex++;
                                if (mindex >= mvektlen) {
                                    sparaTokens(tokens);
                                    mind = mindex;
                                    return ""; // Fler sidor.
                                }
                                men = (meningsvektor.get(mindex)).helameningen;
                                menlen = men.length();
                                // menlen = (meningsvektor.get(mindex)).length();
                                // Leta efter nsta text.
                            } else if (strlen < menlen) {
                                // I detta fall skall data sparas tillbaka!
                                // Hela string fr plats i meningen.
                                // Stega string. Behll mening. Kolla om slut p sidan.
                                SkrivUt(4, "strlen < menlen e while");
                                SkrivUt(4, "Men: " + men);
                                SkrivUt(4, "string: " + string);
                                prevny = new COSString(bytestr);
                                // prevny.reset();
                                // prevny.append( bytestr );
                                tokens.add(j + 1, Tj); // Spara Tj operatorn. Kolla index!
                                tokens.add(j + 1, prevny);
                                j = j + 3;
                                men = men.substring(strlen, menlen);
                                menlen = menlen - strlen;
                                // Kapa mening. Kolla om slut p sidan.
                                // Spara en ev rest om det r slut p sidan!
                                restretur = men;
                                SkrivUt(4, "restreturStr0: " + restretur);
                            }

                        } else if (strlen == menlen) {
                            // I detta fall skall INGA data sparas tillbaka!
                            // Stega bda. Kolla frst om man r klar med sidan/ dokumentet.
                            // Kolla vektorlngd innan kning.
                            SkrivUt(4, "strlen == menlen loopen");
                            SkrivUt(4, "Men: " + men);
                            SkrivUt(4, "string: " + string);
                            /* Sparande tillbaka till strukturen behvs inte hr!
                             * KOLLAS!
                            prevny = new COSString();
                            prevny.reset();
                            prevny.append( bytestr );
                            tokens.add(j, Tj); // Spara Tj operatorn. Kolla index.
                            tokens.add(j, prevny);
                            j = j+2;
                                
                             */
                            // Kolla vektorlngd innan kning.
                            mindex++;
                            if (mindex >= mvektlen) {
                                sparaTokens(tokens);
                                mind = mindex;
                                return ""; // Fler sidor.
                            }
                            men = (meningsvektor.get(mindex)).helameningen;
                            menlen = men.length();
                            // menlen = (meningsvektor.get(mindex)).length();
                            // Leta efter nsta text.
                        } else if (strlen < menlen) {
                            // I detta fall skall INGA data sparas tillbaka!
                            // Hela string fr plats i meningen.
                            // Stega string. Behll mening. Kolla om slut p sidan.
                            SkrivUt(4, "strlen < menlen loopen");
                            SkrivUt(4, "Men: " + men);
                            SkrivUt(4, "string: " + string);
                            /* Data skall inte  sparas tillbaka hr!
                            prevny = new COSString();
                            prevny.reset();
                            prevny.append( bytestr );
                            tokens.add(j, Tj); // Spara Tj operatorn. Kolla index.
                            tokens.add(j, prevny);
                            j = j+2;
                             *
                             */
                            men = men.substring(strlen, menlen);
                            menlen = menlen - strlen;
                            // Kapa mening. Kolla om slut p sidan.
                            // AH* Hr borde ett returvrde sttas om sist p sidan.
                            restretur = men;
                            SkrivUt(4, "restreturStr1: " + restretur);

                        }

                        // Kolla kommenterad kod.
                        // HTexten += string;
                        // string = string.replaceFirst( strToFind, message );
                        // previous.reset();
                        // previous.append( string.getBytes() );
                        // AH* Testa tillgg av kod.
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                            
                          */
                    } else if (op.getOperation().equals("TJ")) {
                        SkrivUt(4, "TJ hittad.");
                        COSArray aktarray = new COSArray(); // Arbetsstrukturen
                        COSArray temparray = new COSArray(); // Arbetsstrukturen
                        COSArray nextarray = new COSArray();
                        kapad = false;
                        restretur = "";
                        int aktind = 0;
                        // fr den aktuella arrayen.
                        COSArray previous = (COSArray) tokens.get(j - 1);
                        firsttime = true;
                        for (int k = 0; k < previous.size(); k++) {
                            Object arrElement = previous.getObject(k);
                            if (arrElement instanceof COSString) {
                                COSString cosString = (COSString) arrElement;
                                String string = cosString.getString();
                                bytestr = ((COSString) arrElement).getBytes();
                                strlen = string.length();
                                prevny = null;
                                SkrivUt(4, "Men: " + men);
                                SkrivUt(4, "string: " + string);
                                if (strlen > menlen) {
                                    // Hela meningen r kortare n string.
                                    // => Stega mening tills strlen < menlen.
                                    // firsttime = true; // Frsta gngen i while loopen.
                                    while (strlen > menlen) // Tills strlen <= menlen.
                                    { // Anvnder while eftersom string kan strcka sig ver flera meningar.
                                      // I detta fall skall string o array kapas eftersom
                                      // String innehller mer n en mening.
                                      // Resterande delen skall sparas som en egen string.
                                      // Minska strlen:
                                        SkrivUt(4, "TJ while strlen > menlen");
                                        SkrivUt(4, "Men1: " + men);
                                        SkrivUt(4, "string1: " + string);
                                        byte[] prevbytestr = new byte[menlen];
                                        for (int it = 0; it < menlen; it++) { // Ta fram den delstring som motsvarar slutet p meningen.
                                            prevbytestr[it] = bytestr[it];
                                        }
                                        // Lagra tillbaka prevbytestr till posten.
                                        // Sparandet behver modifieras hr!
                                        prevny = new COSString(prevbytestr);
                                        aktarray.add(prevny); // array som avslutas.
                                        //prevny.reset();
                                        // prevny.append( prevbytestr );
                                        // Spara tillbaka token:
                                        // modifiera nedanstende: Fr korrekt sparande.
                                        // Kopiera en ev rest av array till nextarray.
                                        // Detta utfrs alltid vid kapning.
                                        nextarray.clear(); // Rensa ev tidigare data.

                                        // nextarray.add(prevrest); Resten av nuvarande string.

                                        for (int n = k + 1; n < previous.size(); n++) {
                                            nextarray.add(previous.get(n));
                                        } // Om slut, s kan nextarray vara tom!
                                        if (firsttime) // Modifiera existerande COSArray.
                                        {
                                            SkrivUt(4, "Firsttime = true.");
                                            temparray = arraycopy(aktarray);
                                            tokens.set(j - 1, temparray); // OK nu eftersom rest r sparad.
                                            SkrivUt(4, "token.SET . " + (j - 1) + " " + aktarray.toString());
                                            // tokens.add(j, TJ); Finns ju redan p plats!
                                            firsttime = false;

                                        } else // Skapa en ny array och lgg in med TJ.
                                        {
                                            SkrivUt(4, "Firsttime = false.");
                                            tokens.add(j + 1, TJ);
                                            SkrivUt(4, "token.add1 . " + (j + 1) + " " + TJ.toString());
                                            temparray = arraycopy(aktarray);
                                            ;
                                            tokens.add(j + 1, temparray);
                                            SkrivUt(4, "token.add1 . " + (j + 1) + " " + temparray.toString());
                                            j = j + 2; // AH* ndrad.
                                        }
                                        aktarray.clear(); // Rensa till ny array.
                                        aktind = 0;
                                        // Lgg in 0 g KVAR!
                                        // Stega index f mening. Kolla vektorlngd.
                                        // Stega j s att nsta string lggs in rtt!
                                        // >> Stega kod flyttad hrifrn!

                                        tempbstr = new byte[strlen - menlen];
                                        // Kapa bort meningen frn string.
                                        for (int it = menlen; it < strlen; it++) {
                                            tempbstr[it - menlen] = bytestr[it];
                                        }
                                        bytestr = tempbstr; // spara resterande string.
                                        string = string.substring(menlen, strlen);
                                        strlen = strlen - menlen; // Nya lngden p nya string

                                        mindex++;
                                        if (mindex >= mvektlen) { // Skall ngot mer utfras innan sparande?
                                            sparaTokens(tokens);
                                            mind = mindex;
                                            return ""; // Fler sidor.
                                        } // Fler sidor.
                                          // Stega sjlva meningen.
                                        men = (meningsvektor.get(mindex)).helameningen;
                                        menlen = men.length();
                                        SkrivUt(4, "Men2: " + men);
                                        SkrivUt(4, "string2: " + string);
                                    }
                                    // Fortstt efter while.
                                    // Testa om strlen <= menlen.

                                    if (strlen == menlen) {
                                        // Stega bde string och men.
                                        // Kolla om array slut. else kapa array.
                                        // Kolla frst om man r klar med sidan/ dokumentet.
                                        // spara string.
                                        SkrivUt(4, "TJ strlen == menlen e while");
                                        SkrivUt(4, "Men: " + men);
                                        SkrivUt(4, "string: " + string);
                                        // Sparandet behver modifieras hr:
                                        prevny = new COSString(bytestr);
                                        aktarray.add(prevny);
                                        // prevny.reset();
                                        // prevny.append( bytestr );
                                        temparray = arraycopy(aktarray);
                                        tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                        SkrivUt(4, "token.add2 ." + (j + 1) + " " + TJ.toString());
                                        tokens.add(j + 1, temparray);
                                        SkrivUt(4, "token.add2 ." + (j + 1) + " " + temparray.toString());
                                        j = j + 2;
                                        aktarray.clear();
                                        aktind = 0;
                                        // Kolla vektorlngd innan kning.
                                        mindex++;
                                        if (mindex >= mvektlen) {
                                            sparaTokens(tokens);
                                            mind = mindex;
                                            return ""; // Fler sidor.
                                        }
                                        men = (meningsvektor.get(mindex)).helameningen;
                                        menlen = men.length();
                                        // menlen = (meningsvektor.get(mindex)).length();
                                        // Leta efter nsta text.
                                    } else if (strlen < menlen) {
                                        // Hela string fr plats i meningen.
                                        // Dvs splittra inte hr! Bygg sparade data.
                                        // Stega string. Behll mening. Kolla om slut p sidan.
                                        SkrivUt(4, "TJ strlen < menlen e while");
                                        SkrivUt(4, "Men: " + men);
                                        SkrivUt(4, "string: " + string);
                                        SkrivUt(4, ">> bytestr: " + bytestr.toString());
                                        // Sparandet behver modifieras hr!
                                        prevny = new COSString(bytestr);
                                        aktarray.add(prevny);
                                        aktind++;
                                        // Spara data hr om det r sista i arrayen!
                                        if (firsttime == false)
                                            if ((k >= previous.size() - 1) || ((k >= previous.size() - 2)
                                                    && (!(previous.get(k + 1) instanceof COSString)))) {
                                                SkrivUt(4, "Spara i TJ strlen < menlen loopen.");
                                                // prevny = new COSString( bytestr );
                                                // aktarray.add(prevny);
                                                // aktind++;
                                                // prevny.reset();
                                                // prevny.append( bytestr );
                                                tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                                SkrivUt(4, "token.add4 ." + (j + 1) + " " + TJ.toString());
                                                temparray = arraycopy(aktarray);
                                                tokens.add(j + 1, temparray);
                                                SkrivUt(4, "token.add4 ." + (j + 1) + " " + temparray.toString());
                                                j = j + 3;
                                                aktarray.clear();
                                                aktind = 0;
                                            }

                                        // INTE spara data hr!?
                                        // prevny.reset();
                                        // prevny.append( bytestr );
                                        /* tokens.add(j+1, TJ); // Spara TJ operatorn. Kolla index!
                                        tokens.add(j+1, prevny);
                                        j=j+3;
                                         * 
                                         */
                                        men = men.substring(strlen, menlen);
                                        menlen = menlen - strlen;
                                        // Kapa mening. Kolla om slut p sidan.
                                        // AH* Hr borde ett returvrde sttas om sist p sidan.
                                        restretur = men;
                                        SkrivUt(4, "restretur0: " + restretur);
                                    }

                                } else if (strlen == menlen) {
                                    // Stega bda. Kolla frst om man r klar med sidan/ dokumentet.
                                    // Om det r slut p arrayen ocks behver ingen splittring gras!
                                    // Else splittra arrayen!
                                    // Kolla vektorlngd innan kning.
                                    SkrivUt(4, "TJ strlen == menlen loopen");
                                    SkrivUt(4, "Men: " + men);
                                    SkrivUt(4, "string: " + string);
                                    // Ansats: Skall inte spara tillbaka data hr!
                                    // >> Data skall sparas bara om detta INTE r sista i arrayen!
                                    // Om det r sista i arrayen skall det INTE sparas! D finns
                                    // den ju redan!
                                    // Borde testa om alla efterkommande != COSString!
                                    // Tidigare kod:
                                    // if (!((k >= previous.size()-1) ||
                                    //        ((k >= previous.size()-2) &&
                                    //       (! (previous.get( k+1 ) instanceof COSString)))))
                                    // Behver inte vara i slutet av arrayen fr att kapa hr!
                                    // Skall spara data till array alltid hr!?
                                    // Kan data redan vara sparade hr?
                                    //if // Villkor fr sparandet.
                                    //{
                                    SkrivUt(4, "Spara i TJ strlen== menlen loopen.");
                                    prevny = new COSString(bytestr);
                                    aktarray.add(prevny);
                                    // aktind++;
                                    // prevny.reset();
                                    // prevny.append( bytestr );
                                    if (firsttime) // Testa denna!
                                    {
                                        temparray = arraycopy(aktarray);
                                        tokens.set(j - 1, temparray);
                                        SkrivUt(4, "token.SET3 ." + (j - 1) + " " + temparray.toString());
                                        firsttime = false;
                                    } else {
                                        tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                        SkrivUt(4, "token.add3 ." + (j + 1) + " " + TJ.toString());
                                        temparray = arraycopy(aktarray);
                                        tokens.add(j + 1, temparray);
                                        SkrivUt(4, "token.add3 ." + (j + 1) + " " + temparray.toString());
                                        j = j + 2;
                                    }
                                    aktarray.clear();
                                    aktind = 0;
                                    //} else SkrivUt(4, "Sparar INTE data i TJ strlen == menlen loopen.");
                                    // Kolla vektorlngd innan kning.
                                    mindex++;
                                    if (mindex >= mvektlen) {
                                        sparaTokens(tokens);
                                        mind = mindex;
                                        return ""; // Fler sidor.
                                    }
                                    men = (meningsvektor.get(mindex)).helameningen;
                                    menlen = men.length();
                                    // menlen = (meningsvektor.get(mindex)).length();
                                    // Leta efter nsta text.
                                } else if (strlen < menlen) {
                                    // Hela string fr plats i meningen.
                                    // Stega string. Behll mening. Kolla om slut p sidan.
                                    // Behver inte splittra arrayen hr!
                                    // Kan behva spara denna string till arbetsarrayen.
                                    SkrivUt(4, "TJ strlen < menlen loopen");
                                    SkrivUt(4, "Men: " + men);
                                    SkrivUt(4, "string: " + string);
                                    SkrivUt(4, ">> bytestr: " + bytestr.toString());
                                    // Ansats: Spara inte tillbaka data hr!
                                    prevny = new COSString(bytestr);
                                    aktarray.add(prevny);
                                    aktind++;
                                    // prevny.reset();
                                    // prevny.append( bytestr );
                                    /*
                                    tokens.add(j, TJ); // Spara Tj operatorn. Kolla index.
                                    tokens.add(j, prevny);
                                    j = j+2;
                                     *
                                     */
                                    // Frn (while strlen < menlen.
                                    // Om firsttime == true s skall data INTE sparas eftersom den
                                    // redan r sparad.
                                    // Skall denna kod vara med?
                                    if (firsttime == false)
                                        if ((k >= previous.size() - 1) || ((k >= previous.size() - 2)
                                                && (!(previous.get(k + 1) instanceof COSString)))) {
                                            SkrivUt(4, "Spara i TJ strlen < menlen loopen.");
                                            // prevny = new COSString( bytestr );
                                            // aktarray.add(prevny);
                                            // aktind++;
                                            // prevny.reset();
                                            // prevny.append( bytestr );
                                            tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                            SkrivUt(4, "token.add5 ." + (j + 1) + " " + TJ.toString());
                                            temparray = arraycopy(aktarray);
                                            tokens.add(j + 1, temparray);
                                            SkrivUt(4, "token.add5 ." + (j + 1) + " " + temparray.toString());
                                            j = j + 2;
                                            aktarray.clear();
                                            aktind = 0;
                                        }

                                    men = men.substring(strlen, menlen);
                                    menlen = menlen - strlen;
                                    // AH* Hr borde ett returvrde sttas om sist p sidan.
                                    restretur = men;
                                    SkrivUt(4, "restretur0: " + restretur);
                                    // Kapa mening. Kolla om slut p sidan.

                                }
                                // HTexten += string;
                                // string = string.replaceFirst( strToFind, message );
                                // cosString.reset();
                                // cosString.append( string.getBytes() );
                            } else if (arrElement instanceof COSNumber) {
                                // Testa om det finns nr.
                                // Spara arrElement i aktarray!
                                // Tester visar att det r COSNumber som hanteras!
                                aktarray.add((COSNumber) arrElement);
                                aktind++;
                                SkrivUt(4, "COSNumber i splitMeningar.");
                            } else if (arrElement instanceof COSInteger) {
                                // Testa om det finns int.
                                // Spara arrElement i aktarray!
                                aktarray.add((COSInteger) arrElement);
                                aktind++;
                                SkrivUt(4, "COSInteger i splitMeningar.");
                            } else if (arrElement instanceof COSFloat) {
                                // Testa om det finns float.
                                // Spara arrElement i aktarray!
                                aktarray.add((COSFloat) arrElement);
                                aktind++;
                                SkrivUt(4, "COSFloat i splitMeningar.");
                            } else {
                                // Spara data till aktarray. Kolla vilken typ det r!
                                SkrivUt(4, "Oknd typ arrel i split: " + arrElement.toString());
                            }
                        }
                        // AH: Tillagd kod!
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                        */
                    }
                } else // Inte PDFOperator, samla argument!
                {
                    if (next instanceof COSBase) {
                        arguments.add(next);
                        //SkrivUt(4, "COSBase " + next.toString());
                    } else {
                        SkrivUt(4, "next inte rtt typ!");
                    }
                }
            }
            //now that the tokens are updated we will replace the
            //page content stream.

            SkrivUt(4, ">>> Fre spara tokens i splitMeningar.");

            PDStream updatedStream = new PDStream(doc1);
            OutputStream out = updatedStream.createOutputStream();
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens(tokens);
            page1.setContents(updatedStream);

            SkrivUt(4, ">>> Efter spara tokens i splitMeningar.");

        } catch (java.io.IOException ioe) {
            SkrivUt(0, "Exception i getHelaTexten.");
        }
        // Sparad skrpkod:
        // cosStream.setStreamTokens( tokens );
        // tokens = cosStream.getStreamTokens();
        mind = mindex;
        // Borde spara tokens hr!?
        // SkrivUt(4, "restretur: " + restretur);
        // SkrivUt(4, "Splitmeningar, data efter split.");
        // listTokens( tokens ); // Data innan split.
        return restretur;
    }

    /*
     *   byggStrukturer bygger upp bde menings och TB strukturer.
     *   Detta sker sidvis.
     *   Resterande av helaTexten returneras till nsta sida.
     *   mindex r aktuellt index i meningsvektorn.
     *   reststr r resten av meningen som r kvar fr bearbetning av nsta sida.
     */

    public String byggStrukturer(String reststr, COSStream cosStream, int pageind) {
        SkrivUt(4, "Frst i byggstrukturer.");
        // Anvnd meningsvektor fr att hmta meningar.
        // Metoden rknar bara tecknen i string och mening och antar att de r synkade
        // i vrigt.
        // ShowText Tj = new ShowText(); // Tj
        // ShowTextGlyph TJ = new ShowTextGlyph(); // TJ
        int mindex = mind;
        PDFOperator Tj = PDFOperator.getOperator("Tj");
        PDFOperator TJ = PDFOperator.getOperator("TJ");
        String restretur = ""; // Resterande text p meningsrad. En arbetsstruktur.
        String men; // Aktuell meningsstruktur.
        if (reststr != "")
            men = reststr;
        else
            men = meningsvektor.get(mindex).helameningen;
        // terskrivet Hit!
        int menlen = men.length(); // Lngden p den aktuella meningen.
        int mvektlen = meningsvektor.size(); // Storleken p vektorn.
        SEmeningsdel semendel = new SEmeningsdel();
        SEmening semen = new SEmening();
        byte[] bytestr; // string representerad som byte[]
        byte[] tempbstr; // byte[] fr temporr lagring.
        int strlen; // Lngden p den aktuella stringen.
        COSString prevny = null;
        boolean firsttime = true;
        boolean kapad = false;
        setb = new SETextBlock();
        SECosstr secostr; // Aktuell COSString struktur.
        Vector<SEArrayIndKlass> newCarray = null; // Aktuell COSArray.
        SEArrayNumber seaik = null; // Aktuellt nummer i COSArray
        List tokens = null;

        try {
            tokens = cosStream.getStreamTokens(); // AH* Detta skrivs ver i nsta steg.
            // tokens = pageTokens.get( pageind ); Fungerade tidigare.
            SkrivUt(4, "Frst i byggstrukturer, listToken.");
            listTokens(tokens); // Data innan byggstrukturer.
            // List tokens = getTokenList();// AH* parser.getTokens(); Tidigare hmtning av lista.
            // Dvs hmta INTE tokens frn den parsade filen. Anvnd tidigare data.
            LinkedList arguments = new LinkedList(); // AH* argumenten till operatorn.
            SkrivUt(4, ">>> Split-Token size: " + tokens.size());
            for (int j = 0; j < tokens.size(); j++) {
                Object next = tokens.get(j);
                if (next instanceof PDFOperator) {
                    PDFOperator op = (PDFOperator) next;
                    //Tj and TJ are the two operators that display
                    //strings in a PDF
                    //AH:
                    //SkrivUt(4, "ArgumentList length: " + arguments.size());
                    //>> AH* SkrivUt(4, "Operator anrop:" + OperatorCall( op, arguments ));
                    // AH: Hr borde man gra ett anrop till StreamEngine!
                    arguments = new LinkedList(); // Mste nollstlla argumenten
                    // efter varje operator.
                    if (op.getOperation().equals("Tj")) {
                        SkrivUt(4, "Tj hittad.");
                        setb = new SETextBlock();
                        setb.IsArray = false;
                        setb.pagenr = tbpagenr;
                        setb.index = j;

                        //Tj takes one operator and that is the string
                        //to display so lets update that operator
                        COSString previous = (COSString) tokens.get(j - 1);
                        String string = previous.getString();
                        secostr = new SECosstr(mindex, 0, string);

                        setb.cstr = secostr;
                        TBVector.add(setb);

                        semendel = new SEmeningsdel();
                        semendel.pagenr = tbpagenr;
                        semendel.tb = TBVector.size();
                        semendel.isarr = false;
                        semendel.arrind = 0;
                        semendel.deltext = string;
                        semen = meningsvektor.get(mindex);
                        semen.allaDelar.add(semendel);
                        // Kolla om detta rcker eller om det ocks skall
                        // tilldelas till meningsvektor igen!

                        prevny = null;
                        bytestr = previous.getBytes();
                        strlen = string.length();
                        restretur = "";
                        SkrivUt(4, "Men: " + men);
                        SkrivUt(4, "string: " + string);
                        if (strlen > menlen) {
                            SkrivUt(4, "**** strlen > menlen i byggstrukturer.");
                            firsttime = true;
                            // Hela meningen r kortare n string.
                            // => Stega mening tills strlen < menlen.
                            while (strlen > menlen) // Tills strlen <= menlen.
                            { // Anvnder while eftersom string kan strcka sig ver flera meningar.
                              // I detta fall skall string kapas eftersom
                              // String innehller mer n en mening.
                              // Resterande delen skall sparas som en egen string.
                              // Minska strlen:
                                SkrivUt(4, "while strlen > menlen");
                                SkrivUt(4, "Men1: " + men);
                                SkrivUt(4, "string1: " + string);
                                byte[] prevbytestr = new byte[menlen];
                                for (int it = 0; it < menlen; it++) { // Ta fram den delstring som motsvarar slutet p meningen.
                                    prevbytestr[it] = bytestr[it];
                                }
                                // Lagra tillbaka prevbytestr till posten.
                                prevny = new COSString(prevbytestr);
                                // prevny.reset();
                                // prevny.append( prevbytestr );
                                // Spara tillbaka kapad string till tokens.
                                if (firsttime) {
                                    tokens.set(j - 1, prevny);
                                    firsttime = false;
                                } else {
                                    tokens.add(j + 1, Tj);
                                    tokens.add(j + 1, prevny);
                                    j = j + 2;
                                }
                                // Lgg in 0 g KVAR!
                                tempbstr = new byte[strlen - menlen];
                                // Kapa bort meningen frn string.
                                for (int it = menlen; it < strlen; it++) {
                                    tempbstr[it - menlen] = bytestr[it];
                                }
                                bytestr = tempbstr; // spara resterande string.
                                string = string.substring(menlen, strlen);
                                strlen = strlen - menlen; // Nya lngden p nya string
                                // Stega index f mening. Kolla vektorlngd.
                                // Stega j s att nsta string lggs in rtt!

                                mindex++;
                                if (mindex >= mvektlen) {
                                    sparaTokens(tokens);
                                    mind = mindex;
                                    return ""; // Fler sidor.
                                }
                                // Stega sjlva meningen.
                                men = (meningsvektor.get(mindex)).helameningen;
                                menlen = men.length();
                                SkrivUt(4, "Men2: " + men);
                                SkrivUt(4, "string2: " + string);
                            }
                            // Testa om strlen <= menlen.

                            if (strlen == menlen) {
                                // I detta fall skall data sparas tillbaka!
                                // Stega bda. Kolla frst om man r klar med sidan/ dokumentet.
                                // spara string.
                                SkrivUt(4, "strlen == menlen e while");
                                SkrivUt(4, "Men: " + men);
                                SkrivUt(4, "string: " + string);
                                prevny = new COSString(bytestr);
                                // prevny.reset();
                                // prevny.append( bytestr );
                                tokens.add(j + 1, Tj); // Spara Tj operatorn. Kolla index.
                                tokens.add(j + 1, prevny);
                                j = j + 3;
                                // Kolla vektorlngd innan kning.
                                mindex++;
                                if (mindex >= mvektlen) {
                                    sparaTokens(tokens);
                                    mind = mindex;
                                    return ""; // Fler sidor.
                                }
                                men = (meningsvektor.get(mindex)).helameningen;
                                menlen = men.length();
                                // menlen = (meningsvektor.get(mindex)).length();
                                // Leta efter nsta text.
                            } else if (strlen < menlen) {
                                // I detta fall skall data sparas tillbaka!
                                // Hela string fr plats i meningen.
                                // Stega string. Behll mening. Kolla om slut p sidan.
                                SkrivUt(4, "strlen < menlen e while");
                                SkrivUt(4, "Men: " + men);
                                SkrivUt(4, "string: " + string);
                                prevny = new COSString(bytestr);
                                // prevny.reset();
                                // prevny.append( bytestr );
                                tokens.add(j + 1, Tj); // Spara Tj operatorn. Kolla index!
                                tokens.add(j + 1, prevny);
                                j = j + 3;
                                men = men.substring(strlen, menlen);
                                menlen = menlen - strlen;
                                // Kapa mening. Kolla om slut p sidan.
                                // Spara en ev rest om det r slut p sidan!
                                restretur = men;
                                SkrivUt(4, "restreturStr0: " + restretur);
                            }

                        } else if (strlen == menlen) {
                            // I detta fall skall INGA data sparas tillbaka!
                            // Stega bda. Kolla frst om man r klar med sidan/ dokumentet.
                            // Kolla vektorlngd innan kning.
                            SkrivUt(4, "strlen == menlen loopen");
                            SkrivUt(4, "Men: " + men);
                            SkrivUt(4, "string: " + string);
                            /* Sparande tillbaka till strukturen behvs inte hr!
                             * KOLLAS!
                            prevny = new COSString();
                            prevny.reset();
                            prevny.append( bytestr );
                            tokens.add(j, Tj); // Spara Tj operatorn. Kolla index.
                            tokens.add(j, prevny);
                            j = j+2;
                                
                             */
                            // Kolla vektorlngd innan kning.
                            mindex++;
                            if (mindex >= mvektlen) {
                                sparaTokens(tokens);
                                mind = mindex;
                                return ""; // Fler sidor.
                            }
                            men = (meningsvektor.get(mindex)).helameningen;
                            menlen = men.length();
                            // menlen = (meningsvektor.get(mindex)).length();
                            // Leta efter nsta text.
                        } else if (strlen < menlen) {
                            // I detta fall skall INGA data sparas tillbaka!
                            // Hela string fr plats i meningen.
                            // Stega string. Behll mening. Kolla om slut p sidan.
                            SkrivUt(4, "strlen < menlen loopen");
                            SkrivUt(4, "Men: " + men);
                            SkrivUt(4, "string: " + string);
                            /* Data skall inte  sparas tillbaka hr!
                            prevny = new COSString();
                            prevny.reset();
                            prevny.append( bytestr );
                            tokens.add(j, Tj); // Spara Tj operatorn. Kolla index.
                            tokens.add(j, prevny);
                            j = j+2;
                             *
                             */
                            men = men.substring(strlen, menlen);
                            menlen = menlen - strlen;
                            // Kapa mening. Kolla om slut p sidan.
                            // AH* Hr borde ett returvrde sttas om sist p sidan.
                            restretur = men;
                            SkrivUt(4, "restreturStr1: " + restretur);

                        }

                        // Kolla kommenterad kod.
                        // HTexten += string;
                        // string = string.replaceFirst( strToFind, message );
                        // previous.reset();
                        // previous.append( string.getBytes() );
                        // AH* Testa tillgg av kod.
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                            
                          */
                    } else if (op.getOperation().equals("TJ")) {
                        SkrivUt(4, "TJ hittad.");
                        setb = new SETextBlock();
                        setb.IsArray = true;
                        setb.pagenr = tbpagenr;
                        setb.index = j;
                        TBVector.add(setb);
                        newCarray = new Vector<SEArrayIndKlass>(); // COSArray
                        COSArray aktarray = new COSArray(); // Arbetsstrukturen
                        COSArray temparray = new COSArray(); // Arbetsstrukturen
                        COSArray nextarray = new COSArray();
                        kapad = false;
                        restretur = "";
                        int aktind = 0;
                        // fr den aktuella arrayen.
                        COSArray previous = (COSArray) tokens.get(j - 1);
                        firsttime = true;
                        for (int k = 0; k < previous.size(); k++) {
                            Object arrElement = previous.getObject(k);
                            if (arrElement instanceof COSString) {
                                COSString cosString = (COSString) arrElement;
                                String string = cosString.getString();
                                bytestr = ((COSString) arrElement).getBytes();
                                strlen = string.length();
                                prevny = null;
                                // Datastrukturer byggs upp:
                                secostr = new SECosstr(mindex, k, string);
                                newCarray.add(secostr);
                                setb.Carray = newCarray; // COSArray data.
                                SkrivUt(4, "Men: " + men);
                                SkrivUt(4, "string: " + string);

                                semendel = new SEmeningsdel();
                                semendel.pagenr = tbpagenr;
                                semendel.tb = TBVector.size();
                                semendel.isarr = true;
                                semendel.arrind = k;
                                semendel.deltext = string;
                                semen = meningsvektor.get(mindex);
                                semen.allaDelar.add(semendel);
                                // Kolla om detta rcker eller om det ocks skall
                                // tilldelas till meningsvektor igen!

                                if (strlen > menlen) {
                                    SkrivUt(4, "**** strlen > menlen i byggstrukturer.");
                                    // Hela meningen r kortare n string.
                                    // => Stega mening tills strlen < menlen.
                                    // firsttime = true; // Frsta gngen i while loopen.
                                    while (strlen > menlen) // Tills strlen <= menlen.
                                    { // Anvnder while eftersom string kan strcka sig ver flera meningar.
                                      // I detta fall skall string o array kapas eftersom
                                      // String innehller mer n en mening.
                                      // Resterande delen skall sparas som en egen string.
                                      // Minska strlen:
                                        SkrivUt(4, "TJ while strlen > menlen");
                                        SkrivUt(4, "Men1: " + men);
                                        SkrivUt(4, "string1: " + string);
                                        byte[] prevbytestr = new byte[menlen];
                                        for (int it = 0; it < menlen; it++) { // Ta fram den delstring som motsvarar slutet p meningen.
                                            prevbytestr[it] = bytestr[it];
                                        }
                                        // Lagra tillbaka prevbytestr till posten.
                                        // Sparandet behver modifieras hr!
                                        prevny = new COSString(prevbytestr);
                                        aktarray.add(prevny); // array som avslutas.
                                        //prevny.reset();
                                        // prevny.append( prevbytestr );
                                        // Spara tillbaka token:
                                        // modifiera nedanstende: Fr korrekt sparande.
                                        // Kopiera en ev rest av array till nextarray.
                                        // Detta utfrs alltid vid kapning.
                                        nextarray.clear(); // Rensa ev tidigare data.

                                        // nextarray.add(prevrest); Resten av nuvarande string.

                                        for (int n = k + 1; n < previous.size(); n++) {
                                            nextarray.add(previous.get(n));
                                        } // Om slut, s kan nextarray vara tom!
                                        if (firsttime) // Modifiera existerande COSArray.
                                        {
                                            SkrivUt(4, "Firsttime = true.");
                                            temparray = arraycopy(aktarray);
                                            tokens.set(j - 1, temparray); // OK nu eftersom rest r sparad.
                                            SkrivUt(4, "token.SET . " + (j - 1) + " " + aktarray.toString());
                                            // tokens.add(j, TJ); Finns ju redan p plats!
                                            firsttime = false;

                                        } else // Skapa en ny array och lgg in med TJ.
                                        {
                                            SkrivUt(4, "Firsttime = false.");
                                            tokens.add(j + 1, TJ);
                                            SkrivUt(4, "token.add1 . " + (j + 1) + " " + TJ.toString());
                                            temparray = arraycopy(aktarray);
                                            ;
                                            tokens.add(j + 1, temparray);
                                            SkrivUt(4, "token.add1 . " + (j + 1) + " " + temparray.toString());
                                            j = j + 2; // AH* ndrad.
                                        }
                                        aktarray.clear(); // Rensa till ny array.
                                        aktind = 0;
                                        // Lgg in 0 g KVAR!
                                        // Stega index f mening. Kolla vektorlngd.
                                        // Stega j s att nsta string lggs in rtt!
                                        // >> Stega kod flyttad hrifrn!

                                        tempbstr = new byte[strlen - menlen];
                                        // Kapa bort meningen frn string.
                                        for (int it = menlen; it < strlen; it++) {
                                            tempbstr[it - menlen] = bytestr[it];
                                        }
                                        bytestr = tempbstr; // spara resterande string.
                                        string = string.substring(menlen, strlen);
                                        strlen = strlen - menlen; // Nya lngden p nya string

                                        mindex++;
                                        if (mindex >= mvektlen) { // Skall ngot mer utfras innan sparande?
                                            sparaTokens(tokens);
                                            mind = mindex;
                                            return ""; // Fler sidor.
                                        } // Fler sidor.
                                          // Stega sjlva meningen.
                                        men = (meningsvektor.get(mindex)).helameningen;
                                        menlen = men.length();
                                        SkrivUt(4, "Men2: " + men);
                                        SkrivUt(4, "string2: " + string);
                                    }
                                    // Fortstt efter while.
                                    // Testa om strlen <= menlen.

                                    if (strlen == menlen) {
                                        // Stega bde string och men.
                                        // Kolla om array slut. else kapa array.
                                        // Kolla frst om man r klar med sidan/ dokumentet.
                                        // spara string.
                                        SkrivUt(4, "TJ strlen == menlen e while");
                                        SkrivUt(4, "Men: " + men);
                                        SkrivUt(4, "string: " + string);
                                        // Sparandet behver modifieras hr:
                                        prevny = new COSString(bytestr);
                                        aktarray.add(prevny);
                                        // prevny.reset();
                                        // prevny.append( bytestr );
                                        temparray = arraycopy(aktarray);
                                        tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                        SkrivUt(4, "token.add2 ." + (j + 1) + " " + TJ.toString());
                                        tokens.add(j + 1, temparray);
                                        SkrivUt(4, "token.add2 ." + (j + 1) + " " + temparray.toString());
                                        j = j + 2;
                                        aktarray.clear();
                                        aktind = 0;
                                        // Kolla vektorlngd innan kning.
                                        mindex++;
                                        if (mindex >= mvektlen) {
                                            sparaTokens(tokens);
                                            mind = mindex;
                                            return ""; // Fler sidor.
                                        }
                                        men = (meningsvektor.get(mindex)).helameningen;
                                        menlen = men.length();
                                        // menlen = (meningsvektor.get(mindex)).length();
                                        // Leta efter nsta text.
                                    } else if (strlen < menlen) {
                                        // Hela string fr plats i meningen.
                                        // Dvs splittra inte hr! Bygg sparade data.
                                        // Stega string. Behll mening. Kolla om slut p sidan.
                                        SkrivUt(4, "TJ strlen < menlen e while");
                                        SkrivUt(4, "Men: " + men);
                                        SkrivUt(4, "string: " + string);
                                        SkrivUt(4, ">> bytestr: " + bytestr.toString());
                                        // Sparandet behver modifieras hr!
                                        prevny = new COSString(bytestr);
                                        aktarray.add(prevny);
                                        aktind++;
                                        // Spara data hr om det r sista i arrayen!
                                        if (firsttime == false)
                                            if ((k >= previous.size() - 1) || ((k >= previous.size() - 2)
                                                    && (!(previous.get(k + 1) instanceof COSString)))) {
                                                SkrivUt(4, "Spara i TJ strlen < menlen loopen.");
                                                // prevny = new COSString( bytestr );
                                                // aktarray.add(prevny);
                                                // aktind++;
                                                // prevny.reset();
                                                // prevny.append( bytestr );
                                                tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                                SkrivUt(4, "token.add4 ." + (j + 1) + " " + TJ.toString());
                                                temparray = arraycopy(aktarray);
                                                tokens.add(j + 1, temparray);
                                                SkrivUt(4, "token.add4 ." + (j + 1) + " " + temparray.toString());
                                                j = j + 3;
                                                aktarray.clear();
                                                aktind = 0;
                                            }

                                        // INTE spara data hr!?
                                        // prevny.reset();
                                        // prevny.append( bytestr );
                                        /* tokens.add(j+1, TJ); // Spara TJ operatorn. Kolla index!
                                        tokens.add(j+1, prevny);
                                        j=j+3;
                                         *
                                         */
                                        men = men.substring(strlen, menlen);
                                        menlen = menlen - strlen;
                                        // Kapa mening. Kolla om slut p sidan.
                                        // AH* Hr borde ett returvrde sttas om sist p sidan.
                                        restretur = men;
                                        SkrivUt(4, "restretur0: " + restretur);
                                    }

                                } else if (strlen == menlen) {
                                    // Stega bda. Kolla frst om man r klar med sidan/ dokumentet.
                                    // Om det r slut p arrayen ocks behver ingen splittring gras!
                                    // Else splittra arrayen!
                                    // Kolla vektorlngd innan kning.
                                    SkrivUt(4, "TJ strlen == menlen loopen");
                                    SkrivUt(4, "Men: " + men);
                                    SkrivUt(4, "string: " + string);
                                    // Ansats: Skall inte spara tillbaka data hr!
                                    // >> Data skall sparas bara om detta INTE r sista i arrayen!
                                    // Om det r sista i arrayen skall det INTE sparas! D finns
                                    // den ju redan!
                                    // Borde testa om alla efterkommande != COSString!
                                    // Tidigare kod:
                                    // if (!((k >= previous.size()-1) ||
                                    //        ((k >= previous.size()-2) &&
                                    //       (! (previous.get( k+1 ) instanceof COSString)))))
                                    // Behver inte vara i slutet av arrayen fr att kapa hr!
                                    // Skall spara data till array alltid hr!?
                                    // Kan data redan vara sparade hr?
                                    //if // Villkor fr sparandet.
                                    //{
                                    SkrivUt(4, "Spara i TJ strlen== menlen loopen.");
                                    prevny = new COSString(bytestr);
                                    aktarray.add(prevny);
                                    // aktind++;
                                    // prevny.reset();
                                    // prevny.append( bytestr );
                                    if (firsttime) // Testa denna!
                                    {
                                        temparray = arraycopy(aktarray);
                                        tokens.set(j - 1, temparray);
                                        SkrivUt(4, "token.SET3 ." + (j - 1) + " " + temparray.toString());
                                        firsttime = false;
                                    } else {
                                        tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                        SkrivUt(4, "token.add3 ." + (j + 1) + " " + TJ.toString());
                                        temparray = arraycopy(aktarray);
                                        tokens.add(j + 1, temparray);
                                        SkrivUt(4, "token.add3 ." + (j + 1) + " " + temparray.toString());
                                        j = j + 2;
                                    }
                                    aktarray.clear();
                                    aktind = 0;
                                    //} else SkrivUt(4, "Sparar INTE data i TJ strlen == menlen loopen.");
                                    // Kolla vektorlngd innan kning.
                                    mindex++;
                                    if (mindex >= mvektlen) {
                                        sparaTokens(tokens);
                                        mind = mindex;
                                        return ""; // Fler sidor.
                                    }
                                    men = (meningsvektor.get(mindex)).helameningen;
                                    menlen = men.length();
                                    // menlen = (meningsvektor.get(mindex)).length();
                                    // Leta efter nsta text.
                                } else if (strlen < menlen) {
                                    // Hela string fr plats i meningen.
                                    // Stega string. Behll mening. Kolla om slut p sidan.
                                    // Behver inte splittra arrayen hr!
                                    // Kan behva spara denna string till arbetsarrayen.
                                    SkrivUt(4, "TJ strlen < menlen loopen");
                                    SkrivUt(4, "Men: " + men);
                                    SkrivUt(4, "string: " + string);
                                    SkrivUt(4, ">> bytestr: " + bytestr.toString());
                                    // Ansats: Spara inte tillbaka data hr!
                                    prevny = new COSString(bytestr);
                                    aktarray.add(prevny);
                                    aktind++;
                                    // prevny.reset();
                                    // prevny.append( bytestr );
                                    /*
                                    tokens.add(j, TJ); // Spara Tj operatorn. Kolla index.
                                    tokens.add(j, prevny);
                                    j = j+2;
                                     *
                                     */
                                    // Frn (while strlen < menlen.
                                    // Om firsttime == true s skall data INTE sparas eftersom den
                                    // redan r sparad.
                                    // Skall denna kod vara med?
                                    if (firsttime == false)
                                        if ((k >= previous.size() - 1) || ((k >= previous.size() - 2)
                                                && (!(previous.get(k + 1) instanceof COSString)))) {
                                            SkrivUt(4, "Spara i TJ strlen < menlen loopen.");
                                            // prevny = new COSString( bytestr );
                                            // aktarray.add(prevny);
                                            // aktind++;
                                            // prevny.reset();
                                            // prevny.append( bytestr );
                                            tokens.add(j + 1, TJ); // Spara Tj operatorn. Kolla index.
                                            SkrivUt(4, "token.add5 ." + (j + 1) + " " + TJ.toString());
                                            temparray = arraycopy(aktarray);
                                            tokens.add(j + 1, temparray);
                                            SkrivUt(4, "token.add5 ." + (j + 1) + " " + temparray.toString());
                                            j = j + 2;
                                            aktarray.clear();
                                            aktind = 0;
                                        }

                                    men = men.substring(strlen, menlen);
                                    menlen = menlen - strlen;
                                    // AH* Hr borde ett returvrde sttas om sist p sidan.
                                    restretur = men;
                                    SkrivUt(4, "restretur0: " + restretur);
                                    // Kapa mening. Kolla om slut p sidan.

                                }
                                // HTexten += string;
                                // string = string.replaceFirst( strToFind, message );
                                // cosString.reset();
                                // cosString.append( string.getBytes() );
                            } else if (arrElement instanceof COSNumber) {
                                // Testa om det finns nr.
                                // Spara arrElement i aktarray!
                                // Tester visar att det r COSNumber som hanteras!
                                aktarray.add((COSNumber) arrElement);
                                aktind++;
                                int temp = ((COSNumber) arrElement).intValue();
                                seaik = new SEArrayNumber(temp);
                                newCarray.add(seaik);
                                SkrivUt(4, "COSNumber i splitMeningar.");
                            } else if (arrElement instanceof COSInteger) {
                                // seaik = ((COSInteger)arrElement)
                                // Testa om det finns int.
                                // Spara arrElement i aktarray!
                                aktarray.add((COSInteger) arrElement);
                                aktind++;
                                int temp = ((COSNumber) arrElement).intValue();
                                seaik = new SEArrayNumber(temp);
                                newCarray.add(seaik);
                                SkrivUt(4, "COSInteger i splitMeningar.");
                            } else if (arrElement instanceof COSFloat) {
                                // Testa om det finns float.
                                // Spara arrElement i aktarray!
                                aktarray.add((COSFloat) arrElement);
                                aktind++;
                                SkrivUt(4, "COSFloat i splitMeningar.");
                            } else {
                                // Spara data till aktarray. Kolla vilken typ det r!
                                SkrivUt(4, "Oknd typ arrel i split: " + arrElement.toString());
                            }
                        }
                        // AH: Tillagd kod!
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                        */
                    }
                } else // Inte PDFOperator, samla argument!
                {
                    if (next instanceof COSBase) {
                        arguments.add(next);
                        //SkrivUt(4, "COSBase " + next.toString());
                    } else {
                        SkrivUt(4, "next inte rtt typ!");
                    }
                }
            }
            //now that the tokens are updated we will replace the
            //page content stream.

            SkrivUt(4, ">>> Fre spara tokens i byggStrukturer.");

            PDStream updatedStream = new PDStream(doc1);
            OutputStream out = updatedStream.createOutputStream();
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens(tokens);
            page1.setContents(updatedStream);

            SkrivUt(4, ">>> Efter spara tokens i byggStrukturer.");

        } catch (java.io.IOException ioe) {
            SkrivUt(4, "Exception i getHelaTexten.");
        }
        // Sparad skrpkod:
        // cosStream.setStreamTokens( tokens );
        // tokens = cosStream.getStreamTokens();
        mind = mindex;
        // Borde spara tokens hr!?
        SkrivUt(4, "restretur: " + restretur);
        return restretur;

    }

    /* grayInsert skall lgga till gray operatorer och float argument fre varje TJ och Tj.
     * Detta sker sidvis.
    *   Resterande av helaTexten returneras till nsta sida.
    *   mindex r aktuellt index i meningsvektorn.
    *   reststr r resten av meningen som r kvar fr bearbetning av nsta sida.
    */

    public String grayInsert(String reststr, COSStream cosStream, int pageind) {
        SkrivUt(4, "Frst i grayInsert.");
        // Anvnd meningsvektor fr att hmta meningar.
        // Metoden rknar bara tecknen i string och mening och antar att de r synkade
        // i vrigt.

        // ShowText Tj = new ShowText(); // Tj
        // ShowTextGlyph TJ = new ShowTextGlyph(); // TJ
        int mindex = mind;
        PDFOperator Tj = PDFOperator.getOperator("Tj");
        PDFOperator TJ = PDFOperator.getOperator("TJ");
        PDFOperator g = PDFOperator.getOperator("g");
        COSFloat gval = null;
        try {
            gval = new COSFloat("0.0");
        } catch (IOException ioec) {
            SkrivUt(0, "Fel p gval!");
        }
        String restretur = ""; // Resterande text p meningsrad. En arbetsstruktur.
        String men; // Aktuell meningsstruktur.
        if (reststr != "")
            men = reststr;
        else
            men = meningsvektor.get(mindex).helameningen;
        // terskrivet Hit!
        int menlen = men.length(); // Lngden p den aktuella meningen.
        int mvektlen = meningsvektor.size(); // Storleken p vektorn.
        byte[] bytestr; // string representerad som byte[]
        byte[] tempbstr; // byte[] fr temporr lagring.
        int strlen; // Lngden p den aktuella stringen.
        COSString prevny = null;
        boolean firsttime = true;
        boolean kapad = false;
        List tokens = null;
        try {
            SkrivUt(4, "Frst i grayInsert.");
            tokens = cosStream.getStreamTokens(); // AH* Hmtar tokens frn strukturen istllet.
            // Dessa data skrivs ver hr:
            // tokens = pageTokens.get( pageind ); Fungerade tidigare.
            listTokens(tokens); // Data innan gray.
            // List tokens = getTokenList();// AH* parser.getTokens(); Tidigare hmtning av lista.
            // Dvs hmta INTE tokens frn den parsade filen. Anvnd tidigare data.
            LinkedList arguments = new LinkedList(); // AH* argumenten till operatorn.
            SkrivUt(4, ">>> AddGray-Token size: " + tokens.size());
            for (int j = 0; j < tokens.size(); j++) {
                Object next = tokens.get(j);
                if (next instanceof PDFOperator) {
                    PDFOperator op = (PDFOperator) next;
                    //Tj and TJ are the two operators that display
                    //strings in a PDF
                    //AH:
                    //SkrivUt(4, "ArgumentList length: " + arguments.size());
                    //>> AH* SkrivUt(4, "Operator anrop:" + OperatorCall( op, arguments ));
                    // AH: Hr borde man gra ett anrop till StreamEngine!
                    arguments = new LinkedList(); // Mste nollstlla argumenten
                    // efter varje operator.
                    if (op.getOperation().equals("Tj")) {
                        SkrivUt(4, "Tj hittad.");
                        // Lgg till gray operator och argument!
                        tokens.add(j - 1, g);
                        tokens.add(j - 1, gval);
                        j = j + 2;
                        //Tj takes one operator and that is the string
                        //to display so lets update that operator
                        COSString previous = (COSString) tokens.get(j - 1);
                        String string = previous.getString();
                        prevny = null;
                        bytestr = previous.getBytes();
                        strlen = string.length();
                        //SkrivUt(4, "Men: " + men);
                        //SkrivUt(4, "string: "+ string);

                        // Kolla kommenterad kod.
                        // HTexten += string;
                        // string = string.replaceFirst( strToFind, message );
                        // previous.reset();
                        // previous.append( string.getBytes() );
                        // AH* Testa tillgg av kod.
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                            
                          */
                    } else if (op.getOperation().equals("TJ")) {
                        SkrivUt(4, "TJ hittad.");
                        // Lgg till gray operator och argument!
                        tokens.add(j - 1, g);
                        tokens.add(j - 1, gval);
                        j = j + 2;
                        restretur = "";
                        int aktind = 0;
                        // fr den aktuella arrayen.
                        COSArray previous = (COSArray) tokens.get(j - 1);
                        firsttime = true;
                        for (int k = 0; k < previous.size(); k++) {
                            Object arrElement = previous.getObject(k);
                            if (arrElement instanceof COSString) {
                                COSString cosString = (COSString) arrElement;
                                String string = cosString.getString();
                                bytestr = ((COSString) arrElement).getBytes();
                                strlen = string.length();
                                prevny = null;
                                // SkrivUt(4, "Men: " + men);
                                // SkrivUt(4, "string: "+ string);

                                // HTexten += string;
                                // string = string.replaceFirst( strToFind, message );
                                // cosString.reset();
                                // cosString.append( string.getBytes() );
                            } else if (arrElement instanceof COSNumber) {
                                // Testa om det finns nr.
                                // Spara arrElement i aktarray!
                                // Tester visar att det r COSNumber som hanteras!
                                // aktarray.add( (COSNumber)arrElement );
                                // aktind++;
                                // SkrivUt(4, "COSNumber i splitMeningar.");
                            } else if (arrElement instanceof COSInteger) {
                                // Testa om det finns int.
                                // Spara arrElement i aktarray!
                                // aktarray.add( (COSInteger)arrElement );
                                // aktind++;
                                // SkrivUt(4, "COSInteger i splitMeningar.");
                            } else if (arrElement instanceof COSFloat) {
                                // Testa om det finns float.
                                // Spara arrElement i aktarray!
                                // aktarray.add( (COSFloat)arrElement );
                                // aktind++;
                                // SkrivUt(4, "COSFloat i splitMeningar.");
                            } else {
                                // Spara data till aktarray. Kolla vilken typ det r!
                                SkrivUt(4, "Oknd typ arrel i addGrey: " + arrElement.toString());
                            }
                        }
                        // AH: Tillagd kod!
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                        */
                    }
                } else // Inte PDFOperator, samla argument!
                {
                    if (next instanceof COSBase) {
                        arguments.add(next);
                        //SkrivUt(4, "COSBase " + next.toString());
                    } else {
                        SkrivUt(4, "next inte rtt typ!");
                    }
                }
            }
            //now that the tokens are updated we will replace the
            //page content stream.

            SkrivUt(4, ">>> Fre spara tokens i grayInsert.");

            PDStream updatedStream = new PDStream(doc1);
            OutputStream out = updatedStream.createOutputStream();
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens(tokens);
            page1.setContents(updatedStream);

            SkrivUt(4, ">>> Efter spara tokens i grayInsert.");

        } catch (java.io.IOException ioe) {
            SkrivUt(4, "Exception i addGrey .");
        }
        // Sparad skrpkod:
        // cosStream.setStreamTokens( tokens );
        // tokens = cosStream.getStreamTokens();
        mind = mindex;
        // Borde spara tokens hr!?
        SkrivUt(4, "ListTokens efter grayInsert.");
        listTokens(tokens);
        return restretur;

    }

    /* highlight skall ndra de float argument till gray operatorer fre varje TJ och Tj.
     * Detta sker sidvis.
    *   Resterande av helaTexten returneras till nsta sida.
    *   mindex r aktuellt index i meningsvektorn.
    *   reststr r resten av meningen som r kvar fr bearbetning av nsta sida.
    */

    public String highlight(String reststr, COSStream cosStream, int pageind, boolean DoHighlight, int valdmening) {
        SkrivUt(1, "Frst i highlight.");
        // Anvnd meningsvektor fr att hmta meningar.
        // Metoden rknar bara tecknen i string och mening och antar att de r synkade
        // i vrigt.

        // ShowText Tj = new ShowText(); // Tj
        // ShowTextGlyph TJ = new ShowTextGlyph(); // TJ
        int mindex = mind;
        PDFOperator Tj = PDFOperator.getOperator("Tj");
        PDFOperator TJ = PDFOperator.getOperator("TJ");
        PDFOperator g = PDFOperator.getOperator("g");
        PDFOperator G = PDFOperator.getOperator("G");
        COSFloat gval = null;
        COSFloat g2val = null;
        COSFloat etta = null;
        COSFloat nolla = null;
        COSInteger tv = null;
        COSFloat red = null;
        COSFloat green = null;
        PDFOperator rg = PDFOperator.getOperator("rg");
        PDFOperator RG = PDFOperator.getOperator("RG");
        PDFOperator Tr = PDFOperator.getOperator("Tr");

        try {
            gval = new COSFloat("0.0");
            g2val = new COSFloat("0.6"); // AH* Hr stlls sammanfattningsgraden!
            etta = new COSFloat("1.0");
            nolla = new COSFloat("0.0");
            tv = new COSInteger("2");
            red = new COSFloat("0.753");
            green = new COSFloat("1.0");
        } catch (IOException ioec) {
            SkrivUt(0, "Fel p gval!");
        }
        String restretur = ""; // Resterande text p meningsrad. En arbetsstruktur.
        String men; // Aktuell meningsstruktur.
        if (reststr == null ? "" != null : !reststr.equals(""))
            men = reststr;
        else
            men = meningsvektor.get(mindex).helameningen;
        // terskrivet Hit!
        int menlen = men.length(); // Lngden p den aktuella meningen.
        int mvektlen = meningsvektor.size(); // Storleken p vektorn.
        byte[] bytestr; // string representerad som byte[]
        byte[] tempbstr; // byte[] fr temporr lagring.
        int strlen; // Lngden p den aktuella stringen.
        COSString prevny = null;
        boolean firsttime = true;
        boolean kapad = false;
        List tokens = null;
        int tempmennr = 0;
        String teststr = "";
        try {
            SkrivUt(1, "Andra i highlight.");
            tokens = cosStream.getStreamTokens();
            pageTokens.add(pageind, tokens);
            // tokens =  Fungerade tidigare.
            // listTokens( tokens ); // Data innan split.
            // List tokens = getTokenList();// AH* parser.getTokens(); Tidigare hmtning av lista.
            // Dvs hmta INTE tokens frn den parsade filen. Anvnd tidigare data.
            LinkedList arguments = new LinkedList(); // AH* argumenten till operatorn.
            SkrivUt(1, ">>> AddGray-Token size: " + tokens.size());
            for (int j = 0; j < tokens.size(); j++) {
                Object next = tokens.get(j);
                // SkrivUt(1, "Tokennr: " + j);
                if (next instanceof PDFOperator) {
                    PDFOperator op = (PDFOperator) next;
                    //Tj and TJ are the two operators that display
                    //strings in a PDF
                    //AH:
                    //SkrivUt(4, "ArgumentList length: " + arguments.size());
                    //>> AH* SkrivUt(4, "Operator anrop:" + OperatorCall( op, arguments ));
                    // AH: Hr borde man gra ett anrop till StreamEngine!
                    arguments = new LinkedList(); // Mste nollstlla argumenten
                    // efter varje operator.
                    if (op.getOperation().equals("Tj")) {
                        SkrivUt(1, "Tj hittad.");
                        // Lgg till gray operator och argument!
                        // tokens.add(j-1, g);
                        // Hr skall sammanfattningen gras!
                        tempmennr = mennr;
                        if (DoHighlight && !medisammanfattningen(false, pageind, valdmening)) // Ej Array.
                        {
                            tokens.set(j - 3, g2val);
                            SkrivUt(2, "EJ Highlight men:" + tempmennr);
                        } else
                            SkrivUt(2, "Highlight men:" + tempmennr);
                        mindex = mennr;
                        if (mennr >= meningsvektor.size())
                            return "";
                        SkrivUt(2, "mennr: " + tempmennr + " valdmening: " + valdmening);
                        SkrivUt(2, "Meningen: " + meningsvektor.get(tempmennr).helameningen);
                        if (tempmennr == valdmening) {
                            // Kolla frst om det r en tom text => Inte highlight!
                            SkrivUt(2, "Mennr == valdmening.");
                            /* Senaste bortkommenterade.
                            if (valdsida == -1) //
                            { // Tilldela valdsida bara om den inte tilldelats tidigare.
                                // Skall ocks kolla om det bara r blanka i meningsdelen 
                                // p denna sida.
                                teststr = meningsvektor.get(tempmennr).allaDelar.get(mendelnr).deltext;
                                SkrivUt(3, "xxxxxxxxx teststr: " + teststr);
                                if (!baraBlanka( teststr ))
                                {
                                    valdsida = pageind; // Detta r den valda sidan.
                                    SkrivUt(3, "*************************** valdsida: " + valdsida);
                                } else SkrivUt(3, "bara blanka i deltext till meniong: " + tempmennr);
                            } */
                            SkrivUt(3, ">>>>>>> valdmening:" + valdmening + " mennr: " + mennr);
                            tokens.add(j - 1, rg);
                            tokens.add(j - 1, nolla);
                            // tokens.add(j-1, green);
                            tokens.add(j - 1, nolla);
                            tokens.add(j - 1, red);
                            j += 4;
                            /*
                            tokens.add(j-1, RG);
                            tokens.add(j-1, nolla);
                            tokens.add(j-1, nolla);
                            tokens.add(j-1, red);
                            tokens.add(j-1, rg);
                            tokens.add(j-1, nolla);
                            tokens.add(j-1, nolla);
                            tokens.add(j-1, red);
                             * 
                             */

                            // Addera kod efter Tj:
                            /* tokens.add(j+9, G);
                            tokens.add(j+9, nolla);
                            tokens.add(j+9, g);
                            tokens.add(j+9, nolla);
                            j+= 13;
                             * 
                             */

                            // Kanske behver stta fler variabler.
                        }
                        //Tj takes one operator and that is the string
                        //to display so lets update that operator
                        restretur = "";
                        int aktind = 0;
                        COSString previous = (COSString) tokens.get(j - 1);
                        String string = previous.getString();
                        prevny = null;
                        bytestr = previous.getBytes();
                        strlen = string.length();
                        //SkrivUt(4, "Men: " + men);
                        //SkrivUt(4, "string: "+ string);

                        // Kolla kommenterad kod.
                        // HTexten += string;
                        // string = string.replaceFirst( strToFind, message );
                        // previous.reset();
                        // previous.append( string.getBytes() );
                        // AH* Testa tillgg av kod.
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                            
                          */
                    } else if (op.getOperation().equals("TJ")) {
                        SkrivUt(1, "TJ hittad.");
                        // Lgg till gray operator och argument!
                        // tokens.add(j-1, g);
                        // Hr skall sammanfattningen gras!
                        tempmennr = mennr;
                        if (DoHighlight && !medisammanfattningen(true, pageind, valdmening)) // Array.
                        {
                            tokens.set(j - 3, g2val);
                            SkrivUt(2, "EJ Highlight men:" + tempmennr);
                        } else
                            SkrivUt(2, "Highlight men:" + tempmennr);
                        mindex = mennr;
                        if (mennr >= meningsvektor.size())
                            return "";
                        SkrivUt(2, "mennr: " + tempmennr + " valdmening: " + valdmening);
                        SkrivUt(2, "Meningen: " + meningsvektor.get(tempmennr).helameningen);
                        if (tempmennr == valdmening) // .
                        { //valdmening
                          // Kolla frst om det r en tom text => Inte highlight!
                            SkrivUt(2, "Mennr == valdmening.");
                            /* if (valdsida == -1) //
                            { // Tilldela valdsida bara om den inte tilldelats tidigare.
                                // Skall ocks kolla om det bara r blanka i meningsdelen
                                // p denna sida.
                                teststr = meningsvektor.get(tempmennr).allaDelar.get(mendelnr).deltext;
                                SkrivUt(3, "xxxxxxxxx teststr: " + teststr);
                                if (!baraBlanka( teststr ))
                                {
                                    valdsida = pageind; // Detta r den valda sidan.
                                    SkrivUt(3, "*************************** valdsida: " + valdsida);
                                } else SkrivUt(3, "bara blanka i deltext till mening: " + tempmennr);
                            }
                             *
                             */
                            SkrivUt(3, ">>>>>>> valdmening:" + valdmening + " mennr: " + mennr);

                            //tokens.add(j-2, RG);
                            //tokens.add(j-2, nolla);
                            //tokens.add(j-2, nolla);
                            // tokens.add(j-2, red);

                            tokens.add(j - 1, rg);
                            tokens.add(j - 1, nolla);
                            // tokens.add(j-1, green);
                            tokens.add(j - 1, nolla);
                            tokens.add(j - 1, red);

                            // Addera kod efter Tj:
                            // tokens.add(j+9, G);
                            // tokens.add(j+9, nolla);
                            // tokens.add(j+9, g);
                            // tokens.add(j+9, nolla);
                            // j+= 13;
                            j += 4;
                            // Kanske behver stta fler variabler.
                        }
                        restretur = "";
                        int aktind = 0;
                        // fr den aktuella arrayen.
                        COSArray previous = (COSArray) tokens.get(j - 1);
                        firsttime = true;
                        for (int k = 0; k < previous.size(); k++) {
                            Object arrElement = previous.getObject(k);
                            if (arrElement instanceof COSString) {
                                COSString cosString = (COSString) arrElement;
                                String string = cosString.getString();
                                bytestr = ((COSString) arrElement).getBytes();
                                strlen = string.length();
                                prevny = null;
                                // SkrivUt(4, "Men: " + men);
                                // SkrivUt(4, "string: "+ string);

                                // HTexten += string;
                                // string = string.replaceFirst( strToFind, message );
                                // cosString.reset();
                                // cosString.append( string.getBytes() );
                            } else if (arrElement instanceof COSNumber) {
                                // Testa om det finns nr.
                                // Spara arrElement i aktarray!
                                // Tester visar att det r COSNumber som hanteras!
                                // aktarray.add( (COSNumber)arrElement );
                                // aktind++;
                                // SkrivUt(4, "COSNumber i splitMeningar.");
                            } else if (arrElement instanceof COSInteger) {
                                // Testa om det finns int.
                                // Spara arrElement i aktarray!
                                // aktarray.add( (COSInteger)arrElement );
                                // aktind++;
                                // SkrivUt(4, "COSInteger i splitMeningar.");
                            } else if (arrElement instanceof COSFloat) {
                                // Testa om det finns float.
                                // Spara arrElement i aktarray!
                                // aktarray.add( (COSFloat)arrElement );
                                // aktind++;
                                // SkrivUt(4, "COSFloat i splitMeningar.");
                            } else {
                                // Spara data till aktarray. Kolla vilken typ det r!
                                SkrivUt(4, "Oknd typ arrel i addGrey: " + arrElement.toString());
                            }
                        }
                        // AH: Tillagd kod!
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                        */
                    }
                } else // Inte PDFOperator, samla argument!
                {
                    if (next instanceof COSBase) {
                        arguments.add(next);
                        //SkrivUt(4, "COSBase " + next.toString());
                    } else {
                        SkrivUt(4, "next inte rtt typ!");
                    }
                }
            }
            //now that the tokens are updated we will replace the
            //page content stream.

            SkrivUt(3, ">>> Fre spara tokens i highlight.");
            PDStream updatedStream = new PDStream(doc1);
            OutputStream out = updatedStream.createOutputStream();
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens(tokens);
            // if (updatedStream == null) SkrivUt(4, "updatedStream == null");
            if (page1 == null)
                SkrivUt(4, "page == null");
            page1.setContents(updatedStream);

            SkrivUt(3, ">>> Efter spara tokens i highlight.");

        } catch (java.io.IOException ioe) {
            SkrivUt(0, "Exception i Highlight .");
        }
        // Sparad skrpkod:
        // cosStream.setStreamTokens( tokens );
        // tokens = cosStream.getStreamTokens();
        mind = mindex;
        // Borde spara tokens hr!?
        // SkrivUt(4, "restretur: " + restretur);
        listTokens(tokens);
        return restretur;

    }
    /*
     *  medisammanfattningen returnerar true om aktuell COS element skall
     *  vara med i sammanfattningen och false annars.
     *  Parametern meningsnummer (mennr) r inte inparameter eftersom
     *  den tilldelas i metoden.
     */

    public boolean medisammanfattningen(boolean isArray, int pageind, int valdmening) {
        // Om strre n antalet meningars delar. => Visa inget(?)
        // Fr aktuellt meningsnr: Om mendelnr > mendelantal s stega
        // Mening!
        // if (true) return true;
        boolean isSameArray = false;
        int arrind = 0;
        int tbnr = 0; // Nummer p textblocket.
        SkrivUt(1, ">> medisammanfattningen anropad.");
        boolean medisam = false;
        String teststr = "";
        if (mennr >= meningsvektor.size()) {
            return false;
        }
        SEmening semen = meningsvektor.get(mennr);
        if (semen == null) {
            SkrivUt(4, "semen == null i medisammanfattningen.");
            return false;
        }
        mendelantal = semen.allaDelar.size(); // Antalet bestndsdelar fr aktuell mening.
        SkrivUt(1, "mendelantal: " + mendelantal);
        SkrivUt(1, "mendelnr: " + mendelnr);
        SkrivUt(1, "mendel: " + semen.allaDelar.get(mendelnr).deltext);
        tbnr = semen.allaDelar.get(mendelnr).tb;
        SkrivUt(1, "tbnr: " + tbnr);
        medisam = Testmedisammanfattningen(mennr);
        if (mendelnr + 1 >= mendelantal) { // Stega mening.
            SkrivUt(4, "mendelnr > mendelantal.");
            mendelnr = 0;
            mennr++;
            return medisam;
        } else { // Hr skall man ta hand om arrayer ocks!
            SkrivUt(4, "mendelnr <= mendelantal.");
            isSameArray = true;
            arrind = semen.allaDelar.get(mendelnr).arrind; // Vilket array ind?
            if (semen.allaDelar.get(mendelnr).isarr) // r det en array
            {
                while (isSameArray) {
                    // Testa om mendelnr > mendelantal. => isSameArray = false
                    if (mendelnr + 1 >= mendelantal) {
                        SkrivUt(2, "Slut p nuvarande arrayen i medisammanfattningen.");
                        isSameArray = false;
                        // Lgg till koll om slutkod hr!
                        mennr++;
                        mendelnr = 0;
                    } else {
                        // Testa om nsta mendel r en del av samma array
                        // Skall stega hela arrayen!
                        mendelnr++;
                        if ((semen.allaDelar.get(mendelnr).isarr) && (semen.allaDelar.get(mendelnr).tb == tbnr))
                        // Inom samma textblock!
                        {
                            SkrivUt(2, "medisammanf arrind1 : " + semen.allaDelar.get(mendelnr).arrind + "tbnr: "
                                    + semen.allaDelar.get(mendelnr).tb);
                            arrind = semen.allaDelar.get(mendelnr).arrind;
                            // Testa om valdsida skall tilldelas:
                            if ((valdsida == -1) && (mennr == valdmening)) //
                            { // Tilldela valdsida bara om den inte tilldelats tidigare.
                              // Tilldela endast om aktuell del inte r bara blanka tecken.
                                teststr = meningsvektor.get(mennr).allaDelar.get(mendelnr).deltext;
                                SkrivUt(3, "xxxxxxxxx teststr: " + teststr);
                                SkrivUt(3, "xxxxx mennr: " + mennr);
                                SkrivUt(3, "xxxxx valdmening: " + valdmening);
                                if (!baraBlanka(teststr)) {
                                    valdsida = pageind; // Detta r den valda sidan.
                                    SkrivUt(3, "*************************** valdsida: " + valdsida);
                                } else
                                    SkrivUt(3, "bara blanka i deltext till mening: " + mennr);
                            }
                        } else { // Inte samma array!
                            SkrivUt(2, "medisammanf arrind2 : " + semen.allaDelar.get(mendelnr).arrind + "tbnr: "
                                    + semen.allaDelar.get(mendelnr).tb);
                            SkrivUt(2, "Ej samma array");
                            isSameArray = false; // Br avkommenteras nr ovanst fungerar!
                        }
                    }
                }
            } else { // Denna del r otestad eftersom dokumenten oftast inte innehller bara COSString!

                // Testa om valdsida skall tilldelas:
                if ((valdsida == -1) && (mennr == valdmening)) //
                { // Tilldela valdsida bara om den inte tilldelats tidigare.
                  // Tilldela endast om aktuell del inte r bara blanka tecken.
                    teststr = meningsvektor.get(mennr).allaDelar.get(mendelnr).deltext;
                    SkrivUt(3, "xxxxxxxxx teststr: " + teststr);
                    SkrivUt(3, "xxxxx mennr: " + mennr);
                    SkrivUt(3, "xxxxx valdmening: " + valdmening);
                    if (!baraBlanka(teststr)) {
                        valdsida = pageind; // Detta r den valda sidan.
                        SkrivUt(3, "*************************** valdsida: " + valdsida);
                    } else
                        SkrivUt(3, "bara blanka i deltext till mening: " + mennr);
                }

                mendelnr++; // Kolla om stega mening ocks!!!
            }
            return medisam;
        }
    }

    /*
     * Testmedisammanfattningen testar om ett givet meningsnummer r
     * med i samnanfattade meningarna. Kan effektiviseras!
     */

    public boolean Testmedisammanfattningen(int testmen) {
        // if (true) return true;
        SkrivUt(4, "Testmedisammanfattningen anropad testmen: " + testmen);
        for (int k = 0; k < menisammanfattningen.size(); k++) {
            if (testmen == menisammanfattningen.get(k)) {
                SkrivUt(1, "testmedisam ind: " + testmen);
                return true;
            } //else if (testmen > menisammanfattningen.get( k ))
              //  return false;
        }
        SkrivUt(1, "testmedisam EJ ind: " + testmen);
        return false;
    }

    /* ListTokens visar COSString, COSArray och PDFOperatorer i token listan.
     * 
     */

    public void listTokens(List intokens) {
        Object obj;
        SkrivUt(4, "listTokens loop:");
        for (int k = 0; k < intokens.size(); k++) {
            obj = intokens.get(k);
            SkrivUt(4, "Ind: " + k + " tokentyp: " + obj.toString());
            /*
            if (obj instanceof COSString)
            SkrivUt(4, "Ind: "+ k + " tokentyp: " + obj.toString());
            if (obj instanceof COSArray)
            {
            SkrivUt(4, "Ind: "+ k + " tokentyp: " + obj.toString());
            }
            if (obj instanceof PDFOperator)
            SkrivUt(4, "Ind: "+ k + " tokentyp: " + obj.toString());
            if ((obj.equals(PDFOperator.getOperator("Tj"))) || (obj.equals(PDFOperator.getOperator("Tj"))))
            SkrivUt(4, "tokentyp: " + obj.toString());
             *
             */
        }
    }

    /*
     *  SparaTokens sparar tillbaka en ndrad tokenlista till sidstrukturen.
     *  Observera att det r en gng per sida nu! Dvs borde inte spara till
     *  filen frrn alla filers data r klara!
     */

    public void listTextBlocks() {
        SkrivUt(4, "listTextBlocks:");
        for (int p = 0; p < PageVector.size(); p++) {
            TBVector = PageVector.get(p);
            SkrivUt(4, "Sida:" + p);
            for (int ind = 0; ind < TBVector.size(); ind++) {
                printTBPost(TBVector.get(ind), ind);
            }
        }
    }

    /* printTBPost skriver ut data om ett textblock.
     *
     */

    public void printTBPost(SETextBlock setb1, int ind1) {
        // SkrivUt(4, "COSString. Nr: "+ ind1);
        SEArrayNumber sean;

        if (setb1.IsArray == false) {
            SECosstr secosstr = setb1.cstr;
            SkrivUt2(4, "COSString. Nr: " + ind1 + " mennr: " + secosstr.meningsnummer);
            SkrivUt2(4, "String: " + secosstr.cosstr);
            SkrivUt(4, "");
        } else // isArray == true
        {
            Vector<SEArrayIndKlass> cosarr = setb1.Carray;
            int arrel;
            for (arrel = 0; arrel < cosarr.size(); arrel++) {
                if (cosarr.get(arrel) instanceof SECosstr) {
                    SECosstr secosstr = (SECosstr) cosarr.get(arrel); // setb1.cstr;
                    SkrivUt2(4, "COSArray. Nr: " + ind1 + " mennr: " + secosstr.meningsnummer);
                    SkrivUt2(4, "String: " + secosstr.cosstr);
                    SkrivUt(4, "");
                } else // COSInt.
                {
                    sean = (SEArrayNumber) cosarr.get(arrel); // setb1.cstr;
                    SkrivUt(4, "COSArray. Nr: " + ind1 + " valnr: " + sean.CArrayInt);
                }
            }
        }
    }

    public void listMeningar() {
        SkrivUt(4, "listMeningar");
        int size = meningsvektor.size();
        int delarsize = 0;
        int td;
        String outdata = "";
        Vector<SEmeningsdel> semendelarr = null;
        SEmeningsdel semendel = null;
        for (int k = 0; k < size; k++) {
            SkrivUt(4, "Hela men: " + meningsvektor.get(k).helameningen);
            semendelarr = meningsvektor.get(k).allaDelar;
            delarsize = semendelarr.size();
            SkrivUt(4, "delarsize: " + delarsize);
            for (td = 0; td < delarsize; td++) {
                semendel = semendelarr.get(td);
                outdata = "page: " + semendel.pagenr + " tb: " + semendel.tb;
                outdata += " isarr: " + semendel.isarr + " arrind: " + semendel.arrind;
                outdata += " text: " + semendel.deltext;
                SkrivUt(4, outdata);
            }

        }
    }

    public void sparaTokens(List intokens) {
        listTokens(intokens);
        // if (true) return;
        try {
            SkrivUt(4, ">>> Fre spara tokens i sparaTokens.");
            SkrivUt(4, "Tok len: " + intokens.size());
            if (intokens == null)
                SkrivUt(4, "Token == null.");
            if (doc == null) {
                SkrivUt(4, "doc == null");
                doc = new PDDocument();
            }
            if (page1 == null)
                SkrivUt(4, "page1 == null");
            PDStream updatedStream = new PDStream(doc);
            // SkrivUt(4, "1.");
            OutputStream out = updatedStream.createOutputStream();
            // SkrivUt(4, "2.");
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            // SkrivUt(4, "3.");
            tokenWriter.writeTokens(intokens); // Denna rad felar => Sparande felar.
            // SkrivUt(4, "4.");
            page1.setContents(updatedStream);
            SkrivUt(4, ">>> Efter spara tokens i sparaTokens.");
            /*
            doc.save( outputFile ); // Skriv tillbaka resultatet till fil! Tas bort senare!
            if( doc != null )
            {
            doc.close();
            }
             *
             */

        } catch (java.io.IOException ioe) {
            SkrivUt(0, "IOException i sparaTokens.");
        } /* catch (org.apache.pdfbox.exceptions.COSVisitorException cve)
          { // Denna exception skall bara vara aktiverad vid save och close!
          SkrivUt(4, "COSVisitorException i sparaTokens.");
          } */
        // finally
        // {

        //}
    }

    /*
     * buildSummaryTextWithNumbers skapar en string som innehller sammanfattningen.
     */

    static public String buildSummaryTextWithNumbers() {
        StringBuilder sb = new StringBuilder();
        for (int index : indexSummary) {
            sb.append(index);
            // sb.append(": ");
            // sb.append(sentences.get(index));
            sb.append("\n");
        }
        return sb.toString();
    }

    /*
     *     Sammanfatta returnerar data fr sammanfattning.
     *     Skall i framtiden innehlla cogsums summering.
     *     Borde troligen inte vara en vanlig array!
     */

    public ArrayList<Integer> sammanfatta(String HelaTexten, int isumslidval) {
        SkrivUt(2, "Frst i sammanfatta1. sumslidval: " + isumslidval);
        ArrayList<Integer> al = null;
        if (true) { // AH* kod frn main i smallproject.
                    // Skapa sammanfattningen.
            SkrivUt(2, "Sammanfatta, HelaTexten: " + HelaTexten); // AH* testutskrift.
            Settings s = new Settings();
            s.setRemoveStopWords(false);
            s.setUseOutsideSpace(false);
            s.setRemoveDocumentVector(true);
            s.setDimensionality(300);
            s.setPageRankIterations(20);
            CogSum cs = new CogSum(s);
            // easyreader.Document d = new easyreader.Document();
            // Fungerande?: Tar bort felet nedan.
            Document d = new Document();
            //d.readFile("resources/historia.txt");
            Vector<SEmening> vec = Hittameningarna(HelaTexten);
            ArrayList<String> sents = new ArrayList();
            for (SEmening sem : vec) {
                sents.add(sem.helameningen);
            }
            d.read(sents);
            cs.setText(d);
            // Fel om d r easyreader.Document! Vill ha Reader.Doc..
            //Summary sum = cs.buildSummary();
            Summary sum = cs.buildSummary(); // Hittar inte metoden!
            System.out.println(sum.getOrderedValues());
            // reader = new SummaryReader(sum); 
            reader = new SummaryReader(sum);
            SkrivUt(2, "isumslidval: " + isumslidval); // AH*
            //            try
            //            {
            sentences = sum.getSentences();
            // sentences = null; //AH* Ondigt slsa med minne.
            //Get indexes for a 70% summary
            indexSummary = reader.buildIndexListPercent(isumslidval);
            if (indexSummary == null)
                SkrivUt(2, "indexSummary == null.");
            else { /*
                   for (int n= 0; n < indexSummary.size(); n++)
                   {
                       SkrivUt(2, "IS = " + indexSummary.get(n));
                   }
                    * 
                    */
            }

            //            } 

            //            catch (java.lang.NullPointerException jln)
            //            {
            //                SkrivUt(2, "Null i sammanfatta.");
            //                if (indexSummary == null) // AH* Tillagt.
            //                {
            //                    SkrivUt(2, "indexSummary == null");
            //                    // indexSummary null dvs initiera fr test.
            //                    al = new ArrayList<Integer>();
            //                    for (int n= 0; n < meningsvektor.size(); n += 2)
            //                    {
            //                        al.add( n );
            //                        SkrivUt(2, "n1 = " + n);
            //                    }
            //                    indexSummary = al;
            //                } else
            //                    SkrivUt(2, "indexSummary != null");
            //            }
            SkrivUt(2, "\n" + buildSummaryTextWithNumbers());
            SkrivUt(2, "Sist i sammanfatta. Summary");

            return indexSummary;
        }

        else // Skapa testdata med varannan med i sammanfattningen.
        {
            al = new ArrayList<Integer>();
            for (int n = 0; n < meningsvektor.size(); n += 2) {
                al.add(n);
                // SkrivUt(2, "n2 = " + n);
            }
            indexSummary = al;
            SkrivUt(2, buildSummaryTextWithNumbers());
            SkrivUt(2, "Sist i sammanfatta. Default");
            return al;
            // return null; // menisammanfattningenTest;
        }
    }

    /**
     * Sammanfatta PDF dokumentet baserat p ..
     *
     * @param inputFile The PDF to open.
     * @param outputFile The PDF to write to.
     * @param strToFind The string to find in the PDF document.
     * @param message The message to write in the file.
     *
     * @throws IOException If there is an error writing the data.
     * @throws COSVisitorException If there is an error writing the PDF.
     */
    public Collection<SEmening> doIt(String inputFile, String outputFile1, boolean DoHighlight, int sumslidval,
            int valdmening) throws IOException, COSVisitorException {
        // the document
        // doc = null; // Output dokumentet (? Kollas!)
        PDFOperator gop = PDFOperator.getOperator("g");
        COSFloat cfloat5 = new COSFloat("0.25");
        COSFloat cfloat1 = new COSFloat("0.75");
        Boolean gray1 = true;
        outputFile = outputFile1;
        String meningsrest = "";
        String sidtext = "";
        Boolean filesaved = false;

        try {
            helaTexten = "";
            SkrivUt(3, "Fre DoIt doc1 load");
            doc1 = PDDocument.load(inputFile); // Indokumentet.
            SkrivUt(3, "Efter DoIt doc1 load");
            List pages = doc1.getDocumentCatalog().getAllPages();
            // SkrivUt(2, "Antal sidor: " + pages.size());
            for (int i = 0; i < pages.size(); i++) { // Frsta fasen skall samla hela texten samt ev ndra relativa till absoluta.
                                                     // TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                                                     // PageVector.add(i, TBVector); // Lgg till TB vektorn fr denna sida.
                SkrivUt(4, "Ny sida helaTexten: " + i);
                PDPage page = (PDPage) pages.get(i);
                PDStream contents = page.getContents();
                //AH Kod frn PageDrawer:
                if (contents != null) {
                    PDResources resources = page.findResources();
                    SkrivUt(4, "Fre getHelaTexten.");
                    // Fas = relativ2absolut r inte implementerad n!
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    sidtext = getHelaTexten(page.getContents().getStream()); //getTextFromPDF, Robin
                    helaTexten += sidtext;
                    // Hmta hela texten frn dokumentet.
                    // SkrivUt(2, "Hela texten per sida0: " + sidtext);
                    // helaTexten = ""; // Skall inte nollstllas nu!
                    // helaTexten = ""; // AH* >> Nollstll INTE, - fr alla sidor.
                    SkrivUt(4, "Efter getHelaTexten.");
                    // cosStream.getStreamToken
                    /*
                    // PDStream nycont = new PDStream( getTokenList());
                    PDFStreamEngine.fas = PDFStreamEngine.splitstrings;
                    processStream( page, resources, page.getContents().getStream());
                    SkrivUt(4, "Hela texten2: " + helaTexten);
                    SkrivUt(4, "Efter andra processStream.");
                    meningsvektor = Hittameningarna( helaTexten );
                    helaTexten = ""; // AH* >> Nollstll???
                     *
                     */
                }
            } // Extrahera meningarna frn hela texten:
              // SkrivUt(2, "Hela texten1: " + helaTexten);
            meningsvektor = Hittameningarna(helaTexten); // Splittra texten i meningar.
            SkrivUt(1, "Meningsvektor.Size: " + meningsvektor.size());
            SEmening semen = null;
            for (int n = 0; n < meningsvektor.size(); n++) {
                // Lgg till mening till meningsvektor.
                // semen = new SEmening();
                // semen.helameningen = menvektor.get( n );
                // meningsvektor.add(n, semen); // Huvudstrukturen fr meningar.
                SkrivUt(1, "Mening: " + meningsvektor.get(n).helameningen);
            }
            /* for (int n = 0; n < meningsvektor.size(); n++ )
            {
            SkrivUt(4, "Mening: " + meningsvektor.get( n ).helameningen);
            } */

            // String helaTextTemp = helaTexten;

            // Vid nsta bearbetning skall string och array splittras vid
            // meningsgrnser.
            mind = 0;
            meningsrest = meningsvektor.get(mind).helameningen; // Kvarvarande text p aktuella sidan
            for (int i = 0; i < pages.size(); i++) {
                // Borde flytta p denna om de inte skall anvndas!
                // TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                // PageVector.add(i, TBVector); // Totalstruktur.
                // Lgg till TB vektorn fr denna sida.
                SkrivUt(4, "Ny sida Split: " + i);
                // PDPage ndrad till lokal variabel!
                page1 = (PDPage) pages.get(i);
                PDStream contents = page1.getContents();
                //AH Kod frn PageDrawer:
                SkrivUt(4, "Innan contents test.");
                if (contents != null) {
                    PDResources resources = page1.findResources();
                    SkrivUt(3, "Fre splitMeningar 1.");
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    SkrivUt(4, "Fre splitMeningar 2.");
                    meningsrest = splitMeningar(meningsrest, page1.getContents().getStream());
                    SkrivUt(4, "*** meningsrest: " + meningsrest);
                    SkrivUt(4, "3, Efter splitMeningar.");
                }
            }

            // Kolla denna kod!!!
            // saveAndClose( outputFile, doc1 ); // AH****
            // doc1 = PDDocument.load( inputFile ); // Indokumentet.
            // SkrivUt(3,"Efter DoIt doc1 load");
            // pages = doc1.getDocumentCatalog().getAllPages(); Nyinlagd. Kvar???

            // Hr skall g operatorer lggas till fr varje TJ och Tj!
            mind = 0; // Behvs denna hr?
            meningsrest = meningsvektor.get(mind).helameningen; // Kvarvarande text p aktuella sidan.

            for (int i = 0; i < pages.size(); i++) {
                // Borde flytta p denna om de inte skall anvndas!
                // TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                // PageVector.add(i, TBVector); // Totalstruktur.
                // Lgg till TB vektorn fr denna sida.
                SkrivUt(4, "Ny sida Gray: " + i);
                // PDPage ndrad till lokal variabel!
                page1 = (PDPage) pages.get(i);
                PDStream contents = page1.getContents();
                //AH Kod frn PageDrawer:
                SkrivUt(4, "Innan contents test.");
                if (contents != null) {
                    PDResources resources = page1.findResources();
                    SkrivUt(3, "Fre GrayInsert 1.");
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    // SkrivUt(4, "Fre splitMeningar 2.");
                    meningsrest = grayInsert(meningsrest, page1.getContents().getStream(), i);
                    //SkrivUt(4, "*** meningsrest: "+ meningsrest);
                    SkrivUt(3, "Efter grayInsert av sida.");
                }
            }
            SkrivUt(3, "Efter hela grayInsert.");

            // Bygg TB och meningsstrukturer.
            //
            mind = 0;
            meningsrest = meningsvektor.get(mind).helameningen; // Kvarvarande text p aktuella sidan.

            for (int i = 0; i < pages.size(); i++) {
                TBIndex = 0; // Index i textblocks strukturen.
                // Hr anvnds och byggs datastrukturerna!
                TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                PageVector.add(i, TBVector); // Totalstruktur.
                tbpagenr = i;
                // Lgg till TB vektorn fr denna sida.
                SkrivUt(4, "Ny sida Split: " + i);
                // PDPage ndrad till lokal variabel!
                page1 = (PDPage) pages.get(i);
                PDStream contents = page1.getContents();
                //AH Kod frn PageDrawer:
                SkrivUt(4, "Innan contents test.");
                if (contents != null) {
                    PDResources resources = page1.findResources();
                    SkrivUt(3, "Fre byggStrukturer 1.");
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    SkrivUt(4, "Fre byggStrukturer 2.");
                    meningsrest = byggStrukturer(meningsrest, page1.getContents().getStream(), i);
                    SkrivUt(4, "*** meningsrest: " + meningsrest);
                    SkrivUt(3, "Efter byggStrukturer.");
                }
            }

            // Skriv ut innehllet i TB strukturen:
            listTextBlocks();

            // Skriv ut meningarna:
            listMeningar();
            //*/
            // Sista passet skall samla in TP fontmetrics och spara dem till TB strukturer.

            SkrivUt(4, "Fr lngt.");
            mind = 0; // Behvs denna hr?

            for (int i = 0; i < pages.size(); i++) { // Frsta fasen skall samla hela texten samt ev ndra relativa till absoluta.
                                                     // TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                                                     // PageVector.add(i, TBVector); // Lgg till TB vektorn fr denna sida.
                tempsidnr = i;
                SkrivUt(4, "Ny sida A: " + i);
                PDPage page = (PDPage) pages.get(i);
                PDStream contents = page.getContents();
                //AH Kod frn PageDrawer:
                if (contents != null) {
                    PDResources resources = page.findResources();
                    SkrivUt(4, "Fre processStream.");
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    // SkrivUt(4, "Hela texten2FRE: " + helaTexten);
                    // processStream( page, resources, page.getContents().getStream()); // Hr anropas sidhanteringen!
                    // SkrivUt(2, "Hela texten2: " + helaTexten);
                    // helaTexten = ""; // AH* >> Nollstll INTE, - fr alla sidor.
                    SkrivUt(4, "Efter processStream. fre nya");
                    // cosStream.getStreamToken

                    /*
                    // PDStream nycont = new PDStream( getTokenList());
                    PDFStreamEngine.fas = PDFStreamEngine.splitstrings;
                    processStream( page, resources, page.getContents().getStream());
                    SkrivUt(4, "Hela texten2: " + helaTexten);
                    SkrivUt(4, "Efter andra processStream.");
                    meningsvektor = Hittameningarna( helaTexten );
                    helaTexten = ""; // AH* >> Nollstll???
                     *
                     */
                }
            }
            SkrivUt(3, "Efter processStream.");

            //if (DoHighlight)
            //{
            // Hr skall texten frmedlas till EasyReader och resultatlista med
            // meningar som skall highlightas skall returneras!
            if ((DoHighlight) && !(helaTexten.equals(""))) {
                SkrivUt(2, "Fre sammanfatta. helaTexten = \"\"");
                menisammanfattningen = sammanfatta(helaTexten, sumslidval);
                System.out.println(menisammanfattningen);
            } else
                menisammanfattningen = null;
            // Hr skall g operatorernas argument modifieras fr de som skall vara
            // med i sammanfattningen.
            mind = 0; // Behvs denna hr?
            meningsrest = meningsvektor.get(mind).helameningen; // Kvarvarande text p aktuella sidan.
            cosenr = 0; // index fr COSString eller COSArray.
            mennr = 0; // index fr aktuell mening.
            mendelnr = 0;
            mendelantal = 0; // Antal delar som meningen bestr av.
            valdsida = -1; // valda sidan inte knd n.
            for (int i = 0; i < pages.size(); i++) {
                // Borde flytta p denna om de inte skall anvndas!
                // TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                // PageVector.add(i, TBVector); // Totalstruktur.
                // Lgg till TB vektorn fr denna sida.
                SkrivUt(4, "Ny sida highlight: " + i);
                // PDPage ndrad till lokal variabel!
                page1 = (PDPage) pages.get(i);
                PDStream contents = page1.getContents();
                //AH Kod frn PageDrawer:
                SkrivUt(4, "Innan contents test.");
                if (contents != null) {
                    PDResources resources = page1.findResources();
                    SkrivUt(1, "Fre highlight 1. Sida: " + i);
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    // SkrivUt(4, "Fre splitMeningar 2.");
                    // if (DoHighlight) 
                    meningsrest = highlight(meningsrest, page1.getContents().getStream(), i, DoHighlight,
                            valdmening);
                    //SkrivUt(4, "*** meningsrest: "+ meningsrest);
                    SkrivUt(1, "Efter highlight av sida:" + i);
                }
            }
            SkrivUt(3, "Efter hela highlight.");
            /*} else // Spara data till pageTokens fr sparande till fil efter.
            {
                
            }*/

            // Dags att hmta fontmetrics och spara till fil. r det samma som ovan?
            // Skall inte gras f.n!

            for (int i = 0; i < pages.size(); i++) {
                TBVector = new Vector<SETextBlock>(); // TB vektorn fr denna sida.
                PageVector.add(i, TBVector); // Lgg till TB vektorn fr denna sida.
                SkrivUt(4, "Ny sida X: " + i);
                // PDPage ndrad, inte lokal lngre!
                page = (PDPage) pages.get(i);
                PDStream contents = page.getContents();
                //AH Kod frn PageDrawer:
                if (contents != null) {
                    PDResources resources = page.findResources();
                    SkrivUt(4, "Fre processStream.");
                    // PDFStreamEngine.fas = PDFStreamEngine.rel2abs;
                    setSumcharAlla(0); // Nollstll teckenrknaren fr strings
                    // AH* Nsta rad anvnds fr att hmta ut fontmetrics.
                    /* processStream( page, resources, page.getContents().getStream()); // Hr anropas sidhanteringen!
                    SkrivUt(4, "Hela texten1: " + helaTexten);
                    // helaTexten = ""; // Skall inte nollstllas nu!
                    SkrivUt(4, "Efter processStream. fre nya");
                    // cosStream.getStreamToken
                     *
                     */

                    // PDStream nycont = new PDStream( getTokenList());
                    // PDFStreamEngine.fas = PDFStreamEngine.splitstrings;
                    // Nedanstende har anropats ovan.
                    // processStream( page, resources, page.getContents().getStream());
                    // SkrivUt(4, "Hela texten3: " + helaTexten);
                    SkrivUt(4, "Efter andra processStream.");
                }
                SkrivUt(3, "Efter hela andra processStream.");
                /*
                PDFStreamParser parser = new PDFStreamParser(contents.getStream());
                parser.parse();
                 *
                 */
                // SkrivUt(4, "Egna loopen Sida: " + i);
                /* List tokens = getTokenList();// AH* parser.getTokens(); Tidigare hmtning av lista.
                // Dvs hmta INTE tokens frn den parsade filen. Anvnd tidigare data.
                 LinkedList arguments = new LinkedList(); // AH* argumenten till operatorn.
                 for( int j=0; j<tokens.size(); j++ )
                 {
                Object next = tokens.get( j );
                if( next instanceof PDFOperator )
                {
                    PDFOperator op = (PDFOperator)next;
                    //Tj and TJ are the two operators that display
                    //strings in a PDF
                    //AH:
                    //SkrivUt(4, "ArgumentList length: " + arguments.size());
                    //>> AH* SkrivUt(4, "Operator anrop:" + OperatorCall( op, arguments ));
                    // AH: Hr borde man gra ett anrop till StreamEngine!
                    arguments = new LinkedList(); // Mste nollstlla argumenten
                    // efter varje operator.
                    if( op.getOperation().equals( "Tj" ) )
                    {
                        //Tj takes one operator and that is the string
                        //to display so lets update that operator
                        COSString previous = (COSString)tokens.get( j-1 );
                        String string = previous.getString();
                        string = string.replaceFirst( strToFind, message );
                        previous.reset();
                        previous.append( string.getBytes() );
                        // AH* Testa tillgg av kod.
                            
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                             
                            
                    }
                    else if( op.getOperation().equals( "TJ" ) )
                    {
                        COSArray previous = (COSArray)tokens.get( j-1 );
                        for( int k=0; k<previous.size(); k++ )
                        {
                            Object arrElement = previous.getObject( k );
                            if( arrElement instanceof COSString )
                            {
                                COSString cosString = (COSString)arrElement;
                                String string = cosString.getString();
                                string = string.replaceFirst( strToFind, message );
                                cosString.reset();
                                cosString.append( string.getBytes() );
                            }
                        }
                        // AH: Tillagd kod!
                        /*
                        tokens.add(j-1, gop);
                        if (gray1)
                        {
                            tokens.add(j-1,cfloat1 );
                            gray1 = false;
                        } else
                        {
                            tokens.add(j-1, cfloat5);
                            gray1 = true;
                        }
                        j = j+2;
                    
                             
                    }
                } else // Inte PDFOperator, samla argument!
                {
                    if (next instanceof COSBase)
                    {
                         arguments.add( next);
                         //SkrivUt(4, "COSBase " + next.toString());
                    } else
                    {
                        SkrivUt(4, "next inte rtt typ!");
                    }
                }
                 }
                    
                 */
                //now that the tokens are updated we will replace the
                //page content stream.
                // Uppdatera data till filen!
                SkrivUt(3, ">>> Fre spara tokens i DoIt.");
                PDStream updatedStream = new PDStream(doc1);
                SkrivUt(3, ">>> Efter updated stream i DoIt.");
                OutputStream out = updatedStream.createOutputStream();
                ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
                tokenWriter.writeTokens(pageTokens.get(i));
                page.setContents(updatedStream);
                SkrivUt(3, ">>> Efter spara tokens i DoIt.");
            }
            /*
            if (!filesaved)
            {
            doc1.save( outputFile );
            filesaved = true;
            }
            doc1.close();
            SkrivUt(3, "doc1 closed 1.");
             *
             */
        } finally {
            saveAndClose(outputFile, doc1);
            /*
            SkrivUt(2, "Finally.");
            if( doc1 != null )
            {
            if (!filesaved)
            {
                doc1.save( outputFile );
                filesaved = true;
            }
            doc1.close();
            SkrivUt(3, "doc1 closed 2.");
            }
             *
             */
        }

        return meningsvektor;
    }

    /* saveAndClose: Spara och stng fil vid avslutning.
     *
     */

    private void saveAndClose(String filnamn, PDDocument utfil) {
        try {
            if (utfil != null) {
                SkrivUt(3, "saveAndClose");
                utfil.save(filnamn);
                utfil.close();
            }
        } catch (java.io.IOException jioio) {
            SkrivUt(7, "IO Fel i saveAndClose.");
        } catch (COSVisitorException cosv) {
            SkrivUt(7, "CosVis Fel i saveAndClose.");
        }
    }

    public static String testdata() {
        String men = "Alla bra saker. r flera! Slut? Sist.Ord.ord!";
        men += " gemen?Ny del !Nyare ?nyast!7733INUTI ?     THE      END.";
        men += "  not new...Pig!!Bird!?!? Fish?? fish!?!    Aha.!?b";
        return men;
    }

    /**
     * This will open a PDF and replace a string if it finds it.
     * <br />
     * see usage() for commandline
     *
     * @param args Command line arguments.
     */
    public static void main(String[] args) {
        // Test av meningsextrahering:

        // Hittameningarna( testdata() );
        //return;
        ReplaceStringStreamEngine app = null;
        try {
            app = new ReplaceStringStreamEngine();
        } catch (IOException ioe) {
            SkrivUt(4, "Konstruktorn fungerade inte!");
        }
        try {
            if (args.length == 0) {
                app.doIt("AHDocWordPDF2.pdf", "AHPrepout.pdf", true, 80, -1); // AHPrep1.pdf
            } else if (args.length == 1) {
                app.doIt(args[0], "AHPrepout.pdf", false, 100, 0);
            } else {
                SkrivUt(4, "Felaktiga inparametrar till main.");
            }
            SkrivUt(4, "Slut p programmet."); // yyy
            // AHDocWordREDTestPDF.pdf
            // AHDocWordPDF2.pdf
            // Tj: AHDoc2Test11.pdf
            // TJ: AHDoc2Mini.pdf
            // TJ: AHDoc2Mini2.pdf
            // TJ: AHDoc2Mini3Arrayer.pdf
            // TJ: AHDoc2MiniArrayerMod3.pdf
            // TJ: AHDoc2TestNow.pdf - finns fel i.
            // Tv sidor: AHDoc1TvSidor.pdf
            // sltc-08
            // Hassel040517
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * This will print out a message telling how to use this example.
     */
    private void usage() {
        System.err.println(
                "usage: " + this.getClass().getName() + " <input-file> <output-file> <search-string> <Message>");
    }
}