Example usage for org.apache.pdfbox.cos COSString getString

List of usage examples for org.apache.pdfbox.cos COSString getString

Introduction

In this page you can find the example usage for org.apache.pdfbox.cos COSString getString.

Prototype

public String getString() 

Source Link

Document

Returns the content of this string as a PDF text string.

Usage

From source file:com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java

License:Apache License

public String getHelaTexten(COSStream cosStream) {
    String HTexten = "";
    String string = "";

    try {// ww w  .ja  v  a 2 s. c  o  m
        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;
}

From source file:com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java

License:Apache License

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.//  ww w.  j  ava 2  s.c o  m
    // 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;
}

From source file:com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java

License:Apache License

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.//ww  w. j a  v a 2 s  .  c  om
    // 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;

}

From source file:com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java

License:Apache License

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./*  ww  w .j a  va  2 s .  com*/

    // 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;

}

From source file:com.santaanna.friendlyreader.pdfstod.pdfstod3.ReplaceStringStreamEngine.java

License:Apache License

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.//from w  ww  .j  av a2 s  . co m

    // 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;

}

From source file:org.apache.fop.render.pdf.pdfbox.PDFBoxAdapter.java

License:Apache License

private Object readCOSString(COSString string, Object keyBase) {
    //retval = ((COSString)base).getString(); //this is unsafe for binary content
    byte[] bytes = string.getBytes();
    //Be on the safe side and use the byte array to avoid encoding problems
    //as PDFBox doesn't indicate whether the string is just
    //a string (PDF 1.4, 3.2.3) or a text string (PDF 1.4, 3.8.1).
    if (keyBase instanceof COSObject) {
        return cacheClonedObject(keyBase, new PDFString(bytes));
    } else {// w  w  w . j a v  a  2 s .c o  m
        if (PDFString.isUSASCII(bytes)) {
            return cacheClonedObject(keyBase, string.getString());
        } else {
            return cacheClonedObject(keyBase, bytes);
        }
    }
}

From source file:org.lockss.pdf.pdfbox.PdfBoxTokens.java

License:Open Source License

/**
 * <p>/*from  w ww .java  2  s .c o m*/
 * Converts from a {@link COSString} to a string value.
 * </p>
 * @param cosString A {@link COSString} instance.
 * @return A string value.
 * @since 1.56
 */
protected static String getString(COSString cosString) {
    return cosString.getString();
}

From source file:test.be.fedict.eid.applet.PdfSpikeTest.java

License:Open Source License

@Test
public void testSignPDF() throws Exception {
    // create a sample PDF file
    Document document = new Document();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfWriter.getInstance(document, baos);

    document.open();//from w  ww  .  ja v a2 s  .  co  m

    Paragraph titleParagraph = new Paragraph("This is a test.");
    titleParagraph.setAlignment(Paragraph.ALIGN_CENTER);
    document.add(titleParagraph);

    document.newPage();
    Paragraph textParagraph = new Paragraph("Hello world.");
    document.add(textParagraph);

    document.close();

    File tmpFile = File.createTempFile("test-", ".pdf");
    LOG.debug("tmp file: " + tmpFile.getAbsolutePath());
    FileUtils.writeByteArrayToFile(tmpFile, baos.toByteArray());

    // eID
    PcscEid pcscEid = new PcscEid(new TestView(), new Messages(Locale.getDefault()));
    if (false == pcscEid.isEidPresent()) {
        LOG.debug("insert eID card");
        pcscEid.waitForEidPresent();
    }

    List<X509Certificate> signCertificateChain = pcscEid.getSignCertificateChain();
    Certificate[] certs = new Certificate[signCertificateChain.size()];
    for (int idx = 0; idx < certs.length; idx++) {
        certs[idx] = signCertificateChain.get(idx);
    }

    // open the pdf
    FileInputStream pdfInputStream = new FileInputStream(tmpFile);
    File signedTmpFile = File.createTempFile("test-signed-", ".pdf");
    PdfReader reader = new PdfReader(pdfInputStream);
    FileOutputStream pdfOutputStream = new FileOutputStream(signedTmpFile);
    PdfStamper stamper = PdfStamper.createSignature(reader, pdfOutputStream, '\0', null, true);

    // add extra page
    Rectangle pageSize = reader.getPageSize(1);
    int pageCount = reader.getNumberOfPages();
    int extraPageIndex = pageCount + 1;
    stamper.insertPage(extraPageIndex, pageSize);

    // calculate unique signature field name
    int signatureNameIndex = 1;
    String signatureName;
    AcroFields existingAcroFields = reader.getAcroFields();
    List<String> existingSignatureNames = existingAcroFields.getSignatureNames();
    do {
        signatureName = "Signature" + signatureNameIndex;
        signatureNameIndex++;
    } while (existingSignatureNames.contains(signatureName));
    LOG.debug("new unique signature name: " + signatureName);

    PdfSignatureAppearance signatureAppearance = stamper.getSignatureAppearance();
    signatureAppearance.setCrypto(null, certs, null, PdfSignatureAppearance.SELF_SIGNED);
    signatureAppearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
    signatureAppearance.setReason("PDF Signature Test");
    signatureAppearance.setLocation("Belgium");
    signatureAppearance.setVisibleSignature(new Rectangle(54, 440, 234, 566), extraPageIndex, signatureName);
    signatureAppearance.setExternalDigest(new byte[128], new byte[20], "RSA");
    signatureAppearance.preClose();

    byte[] content = IOUtils.toByteArray(signatureAppearance.getRangeStream());
    byte[] hash = MessageDigest.getInstance("SHA-1").digest(content);
    byte[] signatureBytes = pcscEid.sign(hash, "SHA-1");
    pcscEid.close();

    PdfSigGenericPKCS sigStandard = signatureAppearance.getSigStandard();
    PdfPKCS7 signature = sigStandard.getSigner();
    signature.setExternalDigest(signatureBytes, hash, "RSA");
    PdfDictionary dictionary = new PdfDictionary();
    dictionary.put(PdfName.CONTENTS, new PdfString(signature.getEncodedPKCS1()).setHexWriting(true));
    signatureAppearance.close(dictionary);

    LOG.debug("signed tmp file: " + signedTmpFile.getAbsolutePath());

    // verify the signature
    reader = new PdfReader(new FileInputStream(signedTmpFile));
    AcroFields acroFields = reader.getAcroFields();
    ArrayList<String> signatureNames = acroFields.getSignatureNames();
    for (String signName : signatureNames) {
        LOG.debug("signature name: " + signName);
        LOG.debug("signature covers whole document: " + acroFields.signatureCoversWholeDocument(signName));
        LOG.debug("document revision " + acroFields.getRevision(signName) + " of "
                + acroFields.getTotalRevisions());
        PdfPKCS7 pkcs7 = acroFields.verifySignature(signName);
        Calendar signDate = pkcs7.getSignDate();
        LOG.debug("signing date: " + signDate.getTime());
        LOG.debug("Subject: " + PdfPKCS7.getSubjectFields(pkcs7.getSigningCertificate()));
        LOG.debug("Document modified: " + !pkcs7.verify());
        Certificate[] verifyCerts = pkcs7.getCertificates();
        for (Certificate certificate : verifyCerts) {
            X509Certificate x509Certificate = (X509Certificate) certificate;
            LOG.debug("cert subject: " + x509Certificate.getSubjectX500Principal());
        }
    }

    /*
     * Reading the signature using Apache PDFBox.
     */
    PDDocument pdDocument = PDDocument.load(signedTmpFile);
    COSDictionary trailer = pdDocument.getDocument().getTrailer();
    /*
     * PDF Reference - third edition - Adobe Portable Document Format -
     * Version 1.4 - 3.6.1 Document Catalog
     */
    COSDictionary documentCatalog = (COSDictionary) trailer.getDictionaryObject(COSName.ROOT);

    /*
     * 8.6.1 Interactive Form Dictionary
     */
    COSDictionary acroForm = (COSDictionary) documentCatalog.getDictionaryObject(COSName.ACRO_FORM);

    COSArray fields = (COSArray) acroForm.getDictionaryObject(COSName.FIELDS);
    for (int fieldIdx = 0; fieldIdx < fields.size(); fieldIdx++) {
        COSDictionary field = (COSDictionary) fields.getObject(fieldIdx);
        String fieldType = field.getNameAsString("FT");
        if ("Sig".equals(fieldType)) {
            COSDictionary signatureDictionary = (COSDictionary) field.getDictionaryObject(COSName.V);
            /*
             * TABLE 8.60 Entries in a signature dictionary
             */
            COSString signatoryName = (COSString) signatureDictionary.getDictionaryObject(COSName.NAME);
            if (null != signatoryName) {
                LOG.debug("signatory name: " + signatoryName.getString());
            }
            COSString reason = (COSString) signatureDictionary.getDictionaryObject(COSName.REASON);
            if (null != reason) {
                LOG.debug("reason: " + reason.getString());
            }
            COSString location = (COSString) signatureDictionary.getDictionaryObject(COSName.LOCATION);
            if (null != location) {
                LOG.debug("location: " + location.getString());
            }
            Calendar signingTime = signatureDictionary.getDate(COSName.M);
            if (null != signingTime) {
                LOG.debug("signing time: " + signingTime.getTime());
            }
            String signatureHandler = signatureDictionary.getNameAsString(COSName.FILTER);
            LOG.debug("signature handler: " + signatureHandler);
        }
    }
}

From source file:Utilities.GlobalVar.java

public static void updateSeqNum(PDDocument doc, String cycle) throws IOException {
    int sequenceNum = 1;
    List pages = doc.getDocumentCatalog().getAllPages();

    for (int i = 0; i < pages.size(); i++) {
        PDPage page = (PDPage) pages.get(i);
        PDStream contents = page.getContents();
        PDFStreamParser parser = new PDFStreamParser(contents.getStream());
        parser.parse();/*from ww w .j  a  va2s .c o m*/
        List tokens = parser.getTokens();
        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
                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();
                    //                        System.out.println(string);
                    //                        System.out.println(string.charAt(5));
                    if (string.contains("/0")) {
                        String seq = cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum);
                        string = string.replaceFirst(string, seq);
                        previous.reset();
                        previous.append(string.getBytes("ISO-8859-1"));
                        sequenceNum++;
                        break;
                    }
                    //Word you want to change. Currently this code changes word "Solr" to "Solr123"
                    previous.reset();
                    previous.append(string.getBytes("ISO-8859-1"));

                } 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();
                            //                                System.out.println(string);
                            if (string.contains("/00")) {
                                String seq = cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum);
                                string = string.replaceFirst(string, seq);
                                cosString.reset();
                                cosString.append(string.getBytes("ISO-8859-1"));
                                sequenceNum++;
                                break;
                            }
                            // Currently this code changes word "Solr" to "Solr123"
                            cosString.reset();
                            cosString.append(string.getBytes("ISO-8859-1"));
                            //                                break;
                        }
                    }
                }
            }
        }
        // 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);
    }
}