Planet PDF Forum Planet PDF Forum
  New Posts New Posts RSS Feed - StmObj offset in Cross-References Stream
  FAQ FAQ  Forum Search   Register Register  Login Login

Hi, welcome to the Foxit Planet PDF Forum. If you have PDF or Adobe Acrobat questions then the right place to ask them is here, in this forum.

StmObj offset in Cross-References Stream

 Post Reply Post Reply
Author
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Topic: StmObj offset in Cross-References Stream
    Posted: 01 Sep 2019 at 9:01am
Hi everyone,

I'm developing a software for extracting text from a pdf file.

I can read the xref table from a pdf in version 1.4 or lower, so as to read the offsets of the various objects present without having to sequentially read the entire file at the beginning.

Now I would like to do the same thing with the Cross-References Stream present from version 1.5 (and higher).

But the object of type XRef contains, for compressed objects(Type = 2), only the number of the object of the stream object that contains it and not its offset, as can be read on the specifications:
The object number of the object stream in which this object is stored. (The generation number of the object stream shall be implicitly 0.)


Is there any way to get the offsets of these objects without having to sequentially read the whole file?

Thanks a lot
(and I apologize for my English).
Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 01 Sep 2019 at 9:14am
The program can be downloaded and installed, on a Linux-* nix environment, with the following terminal commands:
cd $HOME

mkdir myprojs

cd myprojs

git clone https://github.com/Vincenzo1968/mypdfsearch


cd mypdfsearch

./configure

make

sudo make install

Windows users can download the precompiled executable from here: https://vlcfreecode.netsons.org/

or they can download the sources and compile them using MINGW64.
Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 02 Sep 2019 at 2:49pm

At the moment I arrange with the following function that does a prescanning of the file and takes the objects with the relative offset:

int PreParseFile(Params *pParams, char *pszFileName)
{
    int retValue = 1;
    FILE *fp = NULL;
    size_t bytesRead = 0;
    uint32_t curPos = 0;
    unsigned char myBlock[BLOCK_SIZE];
    unsigned char c;
    unsigned char lexeme[128];
    int k = 0;
   
    int Number = 0;
    int Generation = 0;
    uint32_t Offset = 0;
    uint32_t ObjOffset = 0;
   
    PreParseStates state = S_PP0;
   
    fp = fopen(pszFileName, "rb");
    if ( fp == NULL )
    {
        wprintf(L"ERROR PreParseFile: fopen failed for file '%s'.\n", pszFileName);
        fwprintf(pParams->fpErrors, L"ERROR PreParseFile: fopen failed for file '%s'.\n\n", pszFileName);
        retValue = 0;
        goto uscita;
    }
   
    wprintf(L"\n");
   
    while ( (bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp)) )
    {
        curPos = 0;
       
        while ( curPos < bytesRead )
        {
            c = myBlock[curPos];
           
            if ( k >= 128 )
            {
                k = 0;
                state = S_PP0;
            }
           
            switch ( state )
            {
                case S_PP0:
                    k = 0;
                    ObjOffset = 0;
                   
                    if ( '%' == c )
                    {
                        curPos++;
                        Offset++;
                        if ( curPos >= bytesRead )
                        {
                            bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                            if ( bytesRead <= 0 )
                                goto uscita;
                            curPos = 0;
                        }
                        c = myBlock[curPos];
                        while ( '\n' != c  && '\r' != c )
                        {
                            curPos++;
                            Offset++;
                            if ( curPos >= bytesRead )
                            {
                                bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                                if ( bytesRead <= 0 )
                                    goto uscita;
                                curPos = 0;
                            }
                            c = myBlock[curPos];
                        }
                        if ( '\r' == c )
                        {
                            curPos++;
                            Offset++;
                            if ( curPos >= bytesRead )
                            {
                                bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                                if ( bytesRead <= 0 )
                                    goto uscita;
                                curPos = 0;
                            }
                            c = myBlock[curPos];
                           
                            if ( c >= '1' && c <= '9' )
                            {
                                lexeme[k++] = c;
                                ObjOffset = Offset;
                                state = S_PP1;
                            }
                        }
                    }
                    else if ( c >= '1' && c <= '9' )
                    {
                        lexeme[k++] = c;
                        ObjOffset = Offset;
                        state = S_PP1;
                    }
                    break;
                case S_PP1:
                    if ( c >= '0' && c <= '9' )
                    {
                        lexeme[k++] = c;
                    }
                    else if ( IsDelimiterChar(c) )
                    {
                        lexeme[k] = '\0';
                        k = 0;
                        Number = atoi((char*)lexeme);
                        state = S_PP2;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP2:
                    if ( c >= '0' && c <= '9' )
                    {
                        lexeme[k++] = c;
                    }
                    else if ( k > 0 && IsDelimiterChar(c) )
                    {
                        lexeme[k] = '\0';
                        k = 0;
                        Generation = atoi((char*)lexeme);
                        state = S_PP3;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP3:
                    if ( 'o' == c )
                    {
                        state = S_PP4;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP4:
                    if ( 'b' == c )
                    {
                        state = S_PP5;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP5:
                    if ( 'j' == c )
                    {
                        state = S_PP6;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP6:
                    if ( IsDelimiterChar(c) )
                    {
                        wprintf(L"OBJECT(%d %d obj) FOUND AT OFFSET %lu\n", Number, Generation, ObjOffset);
                    }
                    state = S_PP0;
                    break;
                default:
                    break;
            }
           
            curPos++;
            Offset++;
        }
    }
   
    wprintf(L"\n");
       
uscita:

    if ( NULL != fp )
    {
        fclose(fp);
        fp = NULL;
    }
   
    return retValue;
}

Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 02 Sep 2019 at 2:51pm
Typical output:
...
OBJECT(876 0 obj) FOUND AT OFFSET 8272697
OBJECT(877 0 obj) FOUND AT OFFSET 8273083
OBJECT(878 0 obj) FOUND AT OFFSET 8275969
OBJECT(879 0 obj) FOUND AT OFFSET 8282559
OBJECT(880 0 obj) FOUND AT OFFSET 8287341
OBJECT(881 0 obj) FOUND AT OFFSET 8287484
OBJECT(882 0 obj) FOUND AT OFFSET 8291247
OBJECT(883 0 obj) FOUND AT OFFSET 8291590
OBJECT(884 0 obj) FOUND AT OFFSET 8291859
...
Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 02 Sep 2019 at 8:19pm
While I was there, I modified the function so that it also calculates, for each object it finds, the offset of the relative stream, if there is one:
typedef enum tagPreParseStates
{
    S_PPError,
    S_PP0,
    S_PP1,
    S_PP2,   
    S_PP3,
    S_PP4,
    S_PP5,
    S_PP6,
    S_PP7,
    S_PP8,
    S_PP9,
    S_PP10,
    S_PP11,
    S_PP12,
    S_PP13,
    S_PP14,
    S_PP15,
    S_PP16,
    S_PP17,
    S_PP18
} PreParseStates;

int getObjsOffsets(Params *pParams, char *pszFileName)
{
    int retValue = 1;
    FILE *fp = NULL;
    size_t bytesRead = 0;
    uint32_t curPos = 0;
    unsigned char myBlock[BLOCK_SIZE];
    unsigned char myPrevBlock[BLOCK_SIZE];
    unsigned char c;
    unsigned char lexeme[128];
    int k = 0;
   
    uint32_t Number = 0;
    uint32_t Generation = 0;
    uint32_t Offset = 0;
    uint32_t ObjOffset = 0;
    uint32_t ObjStreamOffset = 0;
    uint32_t ObjStreamLength = 0;
   
    uint32_t countObjs = 0;
    uint32_t maxObjNum = 0;
    uint32_t maxObjGenNum = 0;
       
    int bStreamState = 0;
   
    PreParseStates state = S_PP0;
   
    fp = fopen(pszFileName, "rb");
    if ( fp == NULL )
    {
        wprintf(L"ERROR PreParseFile: fopen failed for file '%s'.\n", pszFileName);
        fwprintf(pParams->fpErrors, L"ERROR PreParseFile: fopen failed for file '%s'.\n\n", pszFileName);
        retValue = 0;
        goto uscita;
    }
   
    wprintf(L"\n");
       
    while ( (bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp)) )
    {
        curPos = 0;
       
        while ( curPos < bytesRead )
        {
            c = myBlock[curPos];
           
            if ( k >= 128 )
            {
                k = 0;
                state = S_PP0;
            }
           
            switch ( state )
            {
                case S_PP0:
                    k = 0;
                   
                    if ( '%' == c )
                    {
                        curPos++;
                        Offset++;
                        if ( curPos >= bytesRead )
                        {
                            bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                            if ( bytesRead <= 0 )
                                goto uscita;
                            curPos = 0;
                        }
                        c = myBlock[curPos];
                        while ( '\n' != c  && '\r' != c )
                        {
                            curPos++;
                            Offset++;
                            if ( curPos >= bytesRead )
                            {
                                bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                                if ( bytesRead <= 0 )
                                    goto uscita;
                                curPos = 0;
                            }
                            c = myBlock[curPos];
                        }
                        if ( '\r' == c )
                        {
                            curPos++;
                            Offset++;
                            if ( curPos >= bytesRead )
                            {
                                bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                                if ( bytesRead <= 0 )
                                    goto uscita;
                                curPos = 0;
                            }
                            c = myBlock[curPos];
                           
                            if ( c >= '1' && c <= '9' )
                            {
                                lexeme[k++] = c;
                                ObjOffset = Offset;
                                state = S_PP1;
                            }
                        }
                    }
                    else if ( c >= '1' && c <= '9' )
                    {
                        lexeme[k++] = c;
                        ObjOffset = Offset;
                        state = S_PP1;
                    }
                    else if ( !bStreamState && 's' == c )
                    {
                        state = S_PP7;
                    }
                    else if ( bStreamState && 'e' == c )
                    {
                        state = S_PP13;
                    }
                    break;
                case S_PP1:
                    if ( c >= '0' && c <= '9' )
                    {
                        lexeme[k++] = c;
                    }
                    else if ( IsDelimiterChar(c) )
                    {
                        lexeme[k] = '\0';
                        k = 0;
                        Number = atoi((char*)lexeme);
                        state = S_PP2;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP2:
                    if ( c >= '0' && c <= '9' )
                    {
                        lexeme[k++] = c;
                    }
                    else if ( k > 0 && IsDelimiterChar(c) )
                    {
                        lexeme[k] = '\0';
                        k = 0;
                        Generation = atoi((char*)lexeme);
                        state = S_PP3;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP3:
                    if ( 'o' == c )
                    {
                        state = S_PP4;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP4:
                    if ( 'b' == c )
                    {
                        state = S_PP5;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP5:
                    if ( 'j' == c )
                    {
                        state = S_PP6;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP6:
                    if ( IsDelimiterChar(c) )
                    {
                        countObjs++;
                        if ( maxObjNum < Number )
                            maxObjNum = Number;
                        if ( maxObjGenNum < Generation )
                            maxObjGenNum = Generation;
                        wprintf(L"OBJECT(%lu %lu obj) FOUND AT OFFSET %lu\n", Number, Generation, ObjOffset);
                    }
                    state = S_PP0;
                    break;
                case S_PP7:
                    if ( 't' == c )
                    {
                        state = S_PP8;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP8:
                    if ( 'r' == c )
                    {
                        state = S_PP9;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP9:
                    if ( 'e' == c )
                    {
                        state = S_PP10;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP10:
                    if ( 'a' == c )
                    {
                        state = S_PP11;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP11:
                    if ( 'm' == c )
                    {
                        state = S_PP12;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP12:
                    if ( IsDelimiterChar(c) )
                    {
                        if ( !bStreamState ) // stream
                        {
                            ObjStreamOffset = Offset + 1;
                            bStreamState = 1;
                           
                            if ( '\r' == c )
                            {
                                curPos++;
                                Offset++;
                                if ( curPos >= bytesRead )
                                {
                                    bytesRead = fread(myBlock, 1, BLOCK_SIZE, fp);
                                    if ( bytesRead <= 0 )
                                        goto uscita;
                                    curPos = 0;
                                }
                                c = myBlock[curPos];
                               
                                if ( '\n' == c )
                                {
                                    ObjStreamOffset++;
                                }
                            }
                           
                            wprintf(L"\tOBJECT STREAM FOUND AT OFFSET %lu\n", ObjStreamOffset);
                        }
                        else // endstream
                        {
                            int nTemp;
                           
                            ObjStreamLength = (Offset - ObjStreamOffset) - 9;
                            bStreamState = 0;
                           
                            nTemp = curPos - (9 + 2);
                            if ( nTemp >= 0 )
                            {
                                char c1, c2;
                                c1 = myBlock[nTemp];
                                c2 = myBlock[nTemp + 1];
                                if ( '\r' == c1 )
                                    ObjStreamLength -= 2;
                                else if ( '\n' == c2 )
                                    ObjStreamLength--;
                            }
                            else if ( -1 == nTemp )
                            {
                                char c1, c2;
                                c1 = myBlock[BLOCK_SIZE - 1];
                                c2 = myBlock[0];
                                if ( '\r' == c1 )
                                    ObjStreamLength -= 2;
                                else if ( '\n' == c2 )
                                    ObjStreamLength--;
                            }
                            else
                            {
                                char c1, c2;
                                c1 = myBlock[BLOCK_SIZE + nTemp];
                                nTemp++;
                                c2 = myBlock[BLOCK_SIZE + nTemp];
                                if ( '\r' == c1 )
                                    ObjStreamLength -= 2;
                                else if ( '\n' == c2 )
                                    ObjStreamLength--;
                            }
                           
                            wprintf(L"\t\tOBJECT STREAM LENGTH = %lu\n", ObjStreamLength);
                        }                       
                    }
                    state = S_PP0;
                    break;
                case S_PP13:
                    if ( 'n' == c )
                    {
                        state = S_PP14;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP14:
                    if ( 'd' == c )
                    {
                        state = S_PP15;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP15:
                    if ( 's' == c )
                    {
                        state = S_PP7;
                    }
                    else if ( 'o' == c )
                    {
                        state = S_PP16;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP16:
                    if ( 'b' == c )
                    {
                        state = S_PP17;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP17:
                    if ( 'j' == c )
                    {
                        state = S_PP18;
                    }
                    else
                    {
                        state = S_PP0;
                    }
                    break;
                case S_PP18:
                    if ( IsDelimiterChar(c) )
                    {
                        if ( bStreamState )
                        {
                            ObjStreamLength = (Offset - ObjStreamOffset) - 6;
                            bStreamState = 0;
                            wprintf(L"\t\tWARNING: STREAM NOT CLOSED BY 'endstream', but 'endobj' keyword.\n", ObjStreamLength);
                            wprintf(L"\t\tOBJECT STREAM LENGTH = %lu\n", ObjStreamLength);
                        }
                    }
                    state = S_PP0;
                    break;
                default:
                    break;
            }
           
            curPos++;
            Offset++;
        }
       
        memcpy(myPrevBlock, myBlock, bytesRead);   
    }
   
    wprintf(L"\n");
   
    wprintf(L"FOUND %lu OBJECTS.\n\tMAXIMUM OBJ NUMBER IS: %lu.\n\t\tMAXIMUM OBJ GENERATION NUMBER IS: %lu\n", countObjs, maxObjNum, maxObjGenNum);
   
    wprintf(L"\n");
       
uscita:

    if ( NULL != fp )
    {
        fclose(fp);
        fp = NULL;
    }
   
    return retValue;
}

Typical output:
OBJECT(1240 0 obj) FOUND AT OFFSET 16
OBJECT(1467 0 obj) FOUND AT OFFSET 116
    OBJECT STREAM FOUND AT OFFSET 367
        OBJECT STREAM LENGTH = 604
OBJECT(1567 0 obj) FOUND AT OFFSET 1356
    OBJECT STREAM FOUND AT OFFSET 1431
        OBJECT STREAM LENGTH = 2126
OBJECT(1241 0 obj) FOUND AT OFFSET 3576
OBJECT(1242 0 obj) FOUND AT OFFSET 3664
OBJECT(1243 0 obj) FOUND AT OFFSET 3943
    OBJECT STREAM FOUND AT OFFSET 4025
        OBJECT STREAM LENGTH = 7281
...
...
OBJECT(882 0 obj) FOUND AT OFFSET 8291247
    OBJECT STREAM FOUND AT OFFSET 8291324
        OBJECT STREAM LENGTH = 247
OBJECT(883 0 obj) FOUND AT OFFSET 8291590
    OBJECT STREAM FOUND AT OFFSET 8291666
        OBJECT STREAM LENGTH = 174
OBJECT(884 0 obj) FOUND AT OFFSET 8291859
    OBJECT STREAM FOUND AT OFFSET 8292081
        OBJECT STREAM LENGTH = 2421

FOUND 1113 OBJECTS.
    MAXIMUM OBJ NUMBER IS: 1567.
        MAXIMUM OBJ GENERATION NUMBER IS: 0

Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 08 Sep 2019 at 3:09pm
For the sake of completeness also the "IsDelimiterChar" function code:

#define DELIM_FALSE           0
#define DELIM_SPACECHAR       1
#define DELIM_SPECIALSYMBOL   2

int IsDelimiterChar(unsigned char c)
{
    switch ( c )
    {
        case ' ':
        case '\r':
        case '\n':
        case '\f':
        case '\t':
        case '\0':
            return DELIM_SPACECHAR;
            break;
        case '%':
        case '(':
        case ')':
        case '<':
        case '>':
        case '[':
        case ']':
        case '{':
        case '}':
        case '/':
            return DELIM_SPECIALSYMBOL;
            break;             
        default:
            return DELIM_FALSE;
            break;
    }
     
    return DELIM_FALSE;
}

Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 14 Sep 2019 at 2:57pm
Having received no response, I decided to implement it with the initial sequential reading of the file.
Now the program is able to read pdf files of any version, even greater than 1.4.
Any interested parties can download, for free (GNU GPL3 license), the program by following the instructions above, in the second post of this thread.
Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 23 Sep 2019 at 1:05pm
I added the --nosubdirs option, so you can search only in the specified path, excluding subdirectories:



[vincenzo]:~/MyJob/Progetti/Files/Prova$ pwd
/home/vincenzo/MyJob/Progetti/Files/Prova

[vincenzo]:~/MyJob/Progetti/Files/Prova$ ls -1
Giornali
JapaneseGrammarGuide.pdf

[vincenzo]:~/MyJob/Progetti/Files/Prova$ cd Giornali
[vincenzo]:~/MyJob/Progetti/Files/Prova/Giornali$ ls -1
'Corriere della Sera - 20 luglio 2019.pdf'
'Il Fatto Quotidiano - 9 aprile 2019.pdf'
'Il Giornale - 8 aprile 2019.pdf'
'Il Manifesto - 9 aprile 2019.pdf'
'Il Sole 24 Ore - 9 aprile 2019.pdf'



[vincenzo]:~/MyJob/Progetti/myPdfSearch$ ./mypdfsearch --words="Virginia sound Orbán" --path="../Files/Prova"

File: '../Files/Prova/Giornali/Corriere della Sera - 20 luglio 2019.pdf'
    Key 'orbán' found on page 1
    Key 'orbán' found on page 9
    Key 'orbán' found on page 46
File: '../Files/Prova/Giornali/Il Sole 24 Ore - 9 aprile 2019.pdf'
File: '../Files/Prova/Giornali/Il Giornale - 8 aprile 2019.pdf'
    Key 'virginia' found on page 6
    Key 'virginia' found on page 7
File: '../Files/Prova/Giornali/Il Fatto Quotidiano - 9 aprile 2019.pdf'
    Key 'orbán' found on page 2
    Key 'orbán' found on page 3
    Key 'virginia' found on page 18
    Key 'virginia' found on page 19
File: '../Files/Prova/Giornali/Il Manifesto - 9 aprile 2019.pdf'
File: '../Files/Prova/JapaneseGrammarGuide.pdf'
    Key 'sound' found on page 3
    Key 'sound' found on page 9
    Key 'sound' found on page 10
    Key 'sound' found on page 11
    Key 'sound' found on page 12
    Key 'sound' found on page 13
    Key 'sound' found on page 21
    Key 'sound' found on page 23
    Key 'sound' found on page 38
    Key 'sound' found on page 40
    Key 'sound' found on page 50
    Key 'sound' found on page 58
    Key 'sound' found on page 83
    Key 'sound' found on page 85
    Key 'sound' found on page 88
    Key 'sound' found on page 104
    Key 'sound' found on page 126
    Key 'sound' found on page 144
    Key 'sound' found on page 152
    Key 'sound' found on page 167
    Key 'sound' found on page 168
    Key 'sound' found on page 169
    Key 'sound' found on page 170
    Key 'sound' found on page 171
    Key 'sound' found on page 175
    Key 'sound' found on page 185
    Key 'sound' found on page 199
    Key 'sound' found on page 208
    Key 'sound' found on page 212
    Key 'sound' found on page 223
    Key 'sound' found on page 232
    Key 'sound' found on page 240
    Key 'sound' found on page 248
    Key 'sound' found on page 249
    Key 'sound' found on page 261
    Key 'sound' found on page 267
    Key 'sound' found on page 269
    Key 'sound' found on page 270
    Key 'sound' found on page 278
    Key 'sound' found on page 290
    Key 'sound' found on page 301
    Key 'sound' found on page 302
    Key 'sound' found on page 323
    Key 'sound' found on page 327
    Key 'sound' found on page 328




[vincenzo]:~/MyJob/Progetti/myPdfSearch$ ./mypdfsearch --words="Virginia sound Orbán" --path="../Files/Prova" --nosubdirs

File: '../Files/Prova/JapaneseGrammarGuide.pdf'
    Key 'sound' found on page 3
    Key 'sound' found on page 9
    Key 'sound' found on page 10
    Key 'sound' found on page 11
    Key 'sound' found on page 12
    Key 'sound' found on page 13
    Key 'sound' found on page 21
    Key 'sound' found on page 23
    Key 'sound' found on page 38
    Key 'sound' found on page 40
    Key 'sound' found on page 50
    Key 'sound' found on page 58
    Key 'sound' found on page 83
    Key 'sound' found on page 85
    Key 'sound' found on page 88
    Key 'sound' found on page 104
    Key 'sound' found on page 126
    Key 'sound' found on page 144
    Key 'sound' found on page 152
    Key 'sound' found on page 167
    Key 'sound' found on page 168
    Key 'sound' found on page 169
    Key 'sound' found on page 170
    Key 'sound' found on page 171
    Key 'sound' found on page 175
    Key 'sound' found on page 185
    Key 'sound' found on page 199
    Key 'sound' found on page 208
    Key 'sound' found on page 212
    Key 'sound' found on page 223
    Key 'sound' found on page 232
    Key 'sound' found on page 240
    Key 'sound' found on page 248
    Key 'sound' found on page 249
    Key 'sound' found on page 261
    Key 'sound' found on page 267
    Key 'sound' found on page 269
    Key 'sound' found on page 270
    Key 'sound' found on page 278
    Key 'sound' found on page 290
    Key 'sound' found on page 301
    Key 'sound' found on page 302
    Key 'sound' found on page 323
    Key 'sound' found on page 327
    Key 'sound' found on page 328


Back to Top
Vincenzo1968 View Drop Down
New Member
New Member
Avatar

Joined: 01 Sep 2019
Location: Palermo - Italy
Points: 9
Post Options Post Options   Quote Vincenzo1968 Quote  Post ReplyReply Direct Link To This Post Posted: 04 Oct 2019 at 1:35pm


vincenzo@:~/MyJob/Progetti/myPdfSearch$ time pdfgrep -i --with-filename -r -c 'Virginia|Orbán|branco' ../Files/gccFiles/Giornali
../Files/gccFiles/Giornali/A2019/Q20190726/Il Fatto Quotidiano - 26 luglio 2019.pdf:2
../Files/gccFiles/Giornali/A2019/Q20190726/Corriere della Sera - 26 luglio 2019.pdf:5
../Files/gccFiles/Giornali/A2019/Q20190723/Il Fatto Quotidiano - 23 luglio 2019.pdf:0
../Files/gccFiles/Giornali/A2019/Q20190723/Corriere della Sera - 23 luglio 2019.pdf:0
../Files/gccFiles/Giornali/A2019/Q20190729/Corriere della Sera - 29 luglio 2019.pdf:2
../Files/gccFiles/Giornali/A2019/Q20190729/Il Fatto Quotidiano - 29 luglio 2019.pdf:3
../Files/gccFiles/Giornali/A2019/Q20190728/Corriere della Sera - 28 luglio 2019.pdf:5
../Files/gccFiles/Giornali/A2019/Q20190728/Il Fatto Quotidiano - 28 luglio 2019.pdf:2
../Files/gccFiles/Giornali/A2019/Q20190725/Il Fatto Quotidiano - 25 luglio 2019.pdf:1
../Files/gccFiles/Giornali/A2019/Q20190725/Corriere della Sera - 25 luglio 2019.pdf:0
../Files/gccFiles/Giornali/A2019/Q20190724/Il Fatto Quotidiano - 24 luglio 2019.pdf:3
../Files/gccFiles/Giornali/A2019/Q20190724/Il Sole 24 Ore Norm & Tributi Focus - Decreto crescita - Tutti gli incentivi - - 24 luglio 2019 .pdf:0
../Files/gccFiles/Giornali/A2019/Q20190724/Il Manifesto - 24 luglio 2019 .pdf:0
../Files/gccFiles/Giornali/A2019/Q20190724/La Stampa - 24 luglio 2019 .pdf:2
../Files/gccFiles/Giornali/A2019/Q20190730/Corriere della Sera - 30 luglio 2019.pdf:6
../Files/gccFiles/Giornali/A2019/Q20190730/Il Fatto Quotidiano - 30 luglio 2019.pdf:1
../Files/gccFiles/Giornali/A2019/Q20190727/Il Fatto Quotidiano 27 Luglio 2019.pdf:2
../Files/gccFiles/Giornali/A2019/Q20190727/Corriere della Sera - 27 luglio 2019.pdf:5
../Files/gccFiles/Giornali/A2018/Q20180103/corriere_della_sera_-_03_gennaio_2018.pdf:15
../Files/gccFiles/Giornali/A2018/Q20180103/il Fatto Quotidiano 03 Gennaio 2018.pdf:4
../Files/gccFiles/Giornali/A2018/Q20180103/Libero - 3 Gennaio 2018.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180106/la Repubblica 6 Gennaio 2018.pdf:5
../Files/gccFiles/Giornali/A2018/Q20180106/Il Fatto Quotidiano 6 Gennaio 2018.pdf:4
../Files/gccFiles/Giornali/A2018/Q20180106/Corriere della Sera 6 Gennaio 2018.pdf:5
../Files/gccFiles/Giornali/A2018/Q20180105/Il Mattino Napoli 5 Gennaio 2018.pdf:6
../Files/gccFiles/Giornali/A2018/Q20180105/Il Fatto Quotidiano 5 Gennaio 2018.pdf:4
../Files/gccFiles/Giornali/A2018/Q20180105/La Verita 5 Gennaio 2018.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180105/Il Messaggero Roma 5 Gennaio 2018.pdf:16
../Files/gccFiles/Giornali/A2018/Q20180105/la Repubblica 5 Gennaio 2018.pdf:2
../Files/gccFiles/Giornali/A2018/Q20180105/Giornale di Sicilia Palermo e Provincia 5 Gennaio 2018v avxhm.se.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180105/Corriere della Sera 5 Gennaio 2018.pdf:8
../Files/gccFiles/Giornali/A2018/Q20180105/Il Romanista 5 Gennaio 2018v avxhm.se.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180104/La Verita 4 Gennaio 2018.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180104/Corriere della Sera 4 Gennaio 2018.pdf:7
../Files/gccFiles/Giornali/A2018/Q20180104/Giornale di Sicilia Palermo e Provincia 4 Gennaio 2018v avxhm.se.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180104/Il Messaggero Roma 4 Gennaio 2018.pdf:15
../Files/gccFiles/Giornali/A2018/Q20180104/Il Fatto Quotidiano 4 Gennaio 2018.pdf:5
../Files/gccFiles/Giornali/A2018/Q20180104/la Repubblica 4 Gennaio 2018.pdf:9
../Files/gccFiles/Giornali/A2018/Q20180104/Il Mattino Napoli 4 Gennaio 2018.pdf:8
../Files/gccFiles/Giornali/A2018/Q20180102/il Fatto Quotidiano 02 Gennaio 2018.pdf:1
../Files/gccFiles/Giornali/A2018/Q20180102/la_repubblica_-_02_gennaio_2018.pdf:3
../Files/gccFiles/Giornali/A2018/Q20180102/Libero - 2 Gennaio 2018.pdf:0
../Files/gccFiles/Giornali/A2018/Q20180102/corriere_della_sera_-_02_gennaio_2018.pdf:2
../Files/gccFiles/Giornali/Manzoni/manzoni_i_promessi_sposi.pdf:4

real    1m53,009s
user    1m50,873s
sys    0m2,136s



vincenzo@:~/MyJob/Progetti/myPdfSearch$ time mypdfsearch --path="../Files/gccFiles/Giornali" --words="Virginia Orbán branco"

File: '../Files/gccFiles/Giornali/Manzoni/manzoni_i_promessi_sposi.pdf'
    Key 'branco' found on page 254
    Key 'branco' found on page 270
    Key 'branco' found on page 319
    Key 'branco' found on page 558
File: '../Files/gccFiles/Giornali/A2018/Q20180102/corriere_della_sera_-_02_gennaio_2018.pdf'
    Key 'virginia' found on page 23
    Key 'virginia' found on page 27
File: '../Files/gccFiles/Giornali/A2018/Q20180102/Libero - 2 Gennaio 2018.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180102/la_repubblica_-_02_gennaio_2018.pdf'
    Key 'virginia' found on page 8
    Key 'orbán' found on page 30
File: '../Files/gccFiles/Giornali/A2018/Q20180102/il Fatto Quotidiano 02 Gennaio 2018.pdf'
    Key 'virginia' found on page 3
File: '../Files/gccFiles/Giornali/A2018/Q20180104/Il Mattino Napoli 4 Gennaio 2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 2
File: '../Files/gccFiles/Giornali/A2018/Q20180104/la Repubblica 4 Gennaio 2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 2
    Key 'virginia' found on page 3
    Key 'orbán' found on page 12
    Key 'virginia' found on page 32
    Key 'virginia' found on page 38
File: '../Files/gccFiles/Giornali/A2018/Q20180104/Il Fatto Quotidiano 4 Gennaio 2018.pdf'
    Key 'virginia' found on page 4
    Key 'virginia' found on page 5
File: '../Files/gccFiles/Giornali/A2018/Q20180104/Il Messaggero Roma 4 Gennaio 2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 2
    Key 'virginia' found on page 3
    Key 'virginia' found on page 4
    Key 'virginia' found on page 36
    Key 'virginia' found on page 37
    Key 'virginia' found on page 41
File: '../Files/gccFiles/Giornali/A2018/Q20180104/Giornale di Sicilia Palermo e Provincia 4 Gennaio 2018v avxhm.se.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180104/Corriere della Sera 4 Gennaio 2018.pdf'
    Key 'virginia' found on page 2
    Key 'virginia' found on page 10
File: '../Files/gccFiles/Giornali/A2018/Q20180104/La Verita 4 Gennaio 2018.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180105/Il Romanista 5 Gennaio 2018v avxhm.se.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180105/Corriere della Sera 5 Gennaio 2018.pdf'
    Key 'virginia' found on page 3
    Key 'virginia' found on page 8
    Key 'virginia' found on page 20
File: '../Files/gccFiles/Giornali/A2018/Q20180105/Giornale di Sicilia Palermo e Provincia 5 Gennaio 2018v avxhm.se.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180105/la Repubblica 5 Gennaio 2018.pdf'
    Key 'virginia' found on page 11
    Key 'virginia' found on page 15
File: '../Files/gccFiles/Giornali/A2018/Q20180105/Il Messaggero Roma 5 Gennaio 2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 8
    Key 'virginia' found on page 9
    Key 'virginia' found on page 12
    Key 'virginia' found on page 37
    Key 'virginia' found on page 39
File: '../Files/gccFiles/Giornali/A2018/Q20180105/La Verita 5 Gennaio 2018.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180105/Il Fatto Quotidiano 5 Gennaio 2018.pdf'
    Key 'virginia' found on page 2
    Key 'virginia' found on page 3
    Key 'virginia' found on page 14
    Key 'virginia' found on page 15
File: '../Files/gccFiles/Giornali/A2018/Q20180105/Il Mattino Napoli 5 Gennaio 2018.pdf'
    Key 'virginia' found on page 4
    Key 'virginia' found on page 27
File: '../Files/gccFiles/Giornali/A2018/Q20180106/Corriere della Sera 6 Gennaio 2018.pdf'
    Key 'virginia' found on page 6
    Key 'virginia' found on page 23
File: '../Files/gccFiles/Giornali/A2018/Q20180106/Il Fatto Quotidiano 6 Gennaio 2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 20
File: '../Files/gccFiles/Giornali/A2018/Q20180106/la Repubblica 6 Gennaio 2018.pdf'
    Key 'virginia' found on page 11
    Key 'virginia' found on page 29
File: '../Files/gccFiles/Giornali/A2018/Q20180103/Libero - 3 Gennaio 2018.pdf'
File: '../Files/gccFiles/Giornali/A2018/Q20180103/il Fatto Quotidiano 03 Gennaio 2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 3
    Key 'virginia' found on page 4
    Key 'virginia' found on page 10
File: '../Files/gccFiles/Giornali/A2018/Q20180103/corriere_della_sera_-_03_gennaio_2018.pdf'
    Key 'virginia' found on page 1
    Key 'virginia' found on page 12
    Key 'virginia' found on page 19
    Key 'virginia' found on page 33
    Key 'virginia' found on page 40
    Key 'virginia' found on page 47
File: '../Files/gccFiles/Giornali/A2019/Q20190727/Corriere della Sera - 27 luglio 2019.pdf'
    Key 'virginia' found on page 5
    Key 'virginia' found on page 7
File: '../Files/gccFiles/Giornali/A2019/Q20190727/Il Fatto Quotidiano 27 Luglio 2019.pdf'
    Key 'virginia' found on page 8
    Key 'branco' found on page 8
    Key 'virginia' found on page 9
    Key 'branco' found on page 9
File: '../Files/gccFiles/Giornali/A2019/Q20190730/Il Fatto Quotidiano - 30 luglio 2019.pdf'
    Key 'virginia' found on page 10
    Key 'virginia' found on page 11
File: '../Files/gccFiles/Giornali/A2019/Q20190730/Corriere della Sera - 30 luglio 2019.pdf'
    Key 'orbán' found on page 22
File: '../Files/gccFiles/Giornali/A2019/Q20190724/La Stampa - 24 luglio 2019 .pdf'
    Key 'virginia' found on page 32
File: '../Files/gccFiles/Giornali/A2019/Q20190724/Il Manifesto - 24 luglio 2019 .pdf'
File: '../Files/gccFiles/Giornali/A2019/Q20190724/Il Sole 24 Ore Norm & Tributi Focus - Decreto crescita - Tutti gli incentivi - - 24 luglio 2019 .pdf'
File: '../Files/gccFiles/Giornali/A2019/Q20190724/Il Fatto Quotidiano - 24 luglio 2019.pdf'
    Key 'virginia' found on page 8
    Key 'virginia' found on page 9
    Key 'virginia' found on page 16
    Key 'virginia' found on page 17
    Key 'virginia' found on page 20
    Key 'virginia' found on page 21
File: '../Files/gccFiles/Giornali/A2019/Q20190725/Corriere della Sera - 25 luglio 2019.pdf'
File: '../Files/gccFiles/Giornali/A2019/Q20190725/Il Fatto Quotidiano - 25 luglio 2019.pdf'
    Key 'branco' found on page 20
    Key 'branco' found on page 21
File: '../Files/gccFiles/Giornali/A2019/Q20190728/Il Fatto Quotidiano - 28 luglio 2019.pdf'
    Key 'virginia' found on page 4
    Key 'virginia' found on page 5
    Key 'virginia' found on page 24
File: '../Files/gccFiles/Giornali/A2019/Q20190728/Corriere della Sera - 28 luglio 2019.pdf'
    Key 'virginia' found on page 6
    Key 'virginia' found on page 15
    Key 'virginia' found on page 39
File: '../Files/gccFiles/Giornali/A2019/Q20190729/Il Fatto Quotidiano - 29 luglio 2019.pdf'
    Key 'virginia' found on page 2
    Key 'virginia' found on page 3
    Key 'orbán' found on page 12
    Key 'orbán' found on page 13
    Key 'virginia' found on page 18
    Key 'virginia' found on page 19
File: '../Files/gccFiles/Giornali/A2019/Q20190729/Corriere della Sera - 29 luglio 2019.pdf'
    Key 'virginia' found on page 8
File: '../Files/gccFiles/Giornali/A2019/Q20190723/Corriere della Sera - 23 luglio 2019.pdf'
File: '../Files/gccFiles/Giornali/A2019/Q20190723/Il Fatto Quotidiano - 23 luglio 2019.pdf'
File: '../Files/gccFiles/Giornali/A2019/Q20190726/Corriere della Sera - 26 luglio 2019.pdf'
    Key 'virginia' found on page 5
    Key 'virginia' found on page 6
File: '../Files/gccFiles/Giornali/A2019/Q20190726/Il Fatto Quotidiano - 26 luglio 2019.pdf'
    Key 'virginia' found on page 6
    Key 'virginia' found on page 7

real    1m7,328s
user    1m6,049s
sys    0m1,276s

The formatting of the extracted text should be improved. When, for example, within the pdf, the text is justified, it gets complicated.


vincenzo@:~/MyJob/Progetti/myPdfSearch$ ./mypdfsearch  --extracttextfrom="../Files/gccFiles/Giornali/Manzoni/manzoni_i_promessi_sposi.pdf" --frompage=254 --topage=254

File: '../Files/gccFiles/Giornali/Manzoni/manzoni_i_promessi_sposi.pdf'
TEXT EXTRACTED FROM PAGE 254:

CAPITOLO XI
Come   un   branco   di   segugi,   dopo   aver   inseguita   inva
-
no   una   lepre,   tornano   mortificati   verso   il   padrone,   co'
 
musi   bassi,   e   con   le   code   ciondoloni,   così,   in   quella
 
scompigliata   notte,   tornavano   i   bravi   al   palazzotto   di
 
don   Rodrigo.   Egli   camminava   innanzi   e   indietro,   al
 
buio, per una stanzaccia disabitata dell'ultimo piano, che
 
rispondeva   sulla   spianata.   Ogni   tanto   si   fermava,   tende
-
va   l'orecchio,   guardava   dalle   fessure   dell'imposte   intar
-
late,   pieno   d'impazienza   e   non   privo   d'inquietudine,   non
 
solo   per   l'incertezza   della   riuscita,   ma   anche   per   le   con
-
seguenze possibili; perché era la più grossa e la più arri
-
schiata   a   cui   il   brav'uomo   avesse   ancor   messo   mano.
 
S'andava però rassicurando col pensiero delle precauzio
-
ni   prese   per   distrugger   gl'indizi,   se   non   i   sospetti.   "In
 
quanto   ai   sospetti",   pensava,   "me   ne   rido.   Vorrei   un   po'
 
sapere   chi   sarà   quel   voglioso   che   venga   quassù   a   veder
 
se   c'è   o   non   c'è   una   ragazza.   Venga,   venga   quel   tanghe
-
ro,   che   sarà   ben   ricevuto.   Venga   il   frate,   venga.   La   vec
-
chia?   Vada   a   Bergamo   la   vecchia.   La   giustizia?   Poh   la
 
giustizia!   Il   podestà   non   è   un   ragazzo,   né   un   matto.   E   a
 
Milano?   Chi   si   cura   di   costoro   a   Milano?   Chi   gli  dareb
-
be   retta?   Chi   sa   che   ci   siano?   Son   come   gente   perduta
 
sulla   terra;   non   hanno   né   anche   un   padrone:   gente   di
 
254



vincenzo@:~/MyJob/Progetti/myPdfSearch$ ./mypdfsearch --extracttextfrom="../Files/JapaneseGrammarGuide.pdf" --frompage=21 --topage=21

File: '../Files/JapaneseGrammarGuide.pdf'
TEXT EXTRACTED FROM PAGE 21:

CHAPTER 2. THE WRITING SYSTEM
2.4. KATAKANA

けい」
,
「こ

こう」
,
「さ

さあ」
and so on. The reasoning for this is quite simple. Try
saying
「か」
and
「あ」
separately. Then say them in succession as fast as you can. You'll
notice that soon enough, it sounds like you're dragging out the / ka / for a longer duration than
just saying / ka / by itself. When pronouncing long vowel sounds, try to remember that they are
really two sounds merged together.
It's important to make sure you hold the vowel sound long enough because you can be saying
things like "here" (
こ こ
) instead of "high school" (
こ う こ う
) or "middle-aged lady" (
お ば さ ん
)
instead of "grandmother" (
おばあさん
) if you don't stretch it out correctly!
Examples
1.
がくせ

(ga-ku-s
e
) - student
2.
せんせ

(sen-s
e
) - teacher
3.
きょ

(ky
o
) - today
4.
おはよ

(o-ha-y
o
) - good morning
5.
おか

さん
(o-k
a
-san) - mother
There are rare exceptions where an / e / vowel sound is extended by adding
「え」
or an / o /
vowel sound is extended by
「お」
. Some examples of this include
「お ね え さ ん」 、 「お お
い」、
and
「おおきい」
. Pay careful attention to these exceptions but don't worry, there aren't
too many of them.
2.4 Katakana
As mentioned before,
Katakana
is mainly used for words imported from foreign languages. It can
also be used to emphasize certain words similar to the function of
italics
. For a more complete
list of usages, refer to the
Wikipedia entry on katakana
.
Katakana represents the same set of phonetic sounds as Hiragana except all the characters are
different. Since foreign words must fit into this limited set of [consonants+vowel] sounds, they
undergo many radical changes resulting in instances where English speakers can't understand
words that are supposed to be derived from English! As a result, the use of Katakana is ex-
tremely difficult for English speakers because they expect English words to sound like... well...
English. Instead, it is better to completely forget the original English word, and treat the word
as an entirely separate Japanese word, otherwise you can run into the habit of saying English
words with English pronunciations (whereupon a Japanese person may or may not understand
what you are saying).
21


Back to Top
 Post Reply Post Reply
  Share Topic   

Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 11.10
Copyright ©2001-2017 Web Wiz Ltd.

This page was generated in 0.077 seconds.