Нужна помощь!!! Извлечение текста из PDF
От: SvatSergio  
Дата: 13.03.06 20:57
Оценка:
Возникла задача (а точнее проблема):
Необходимо извлечь текстовую информацию из файлов формата PDF. При этом есть одна особенность — файл поврежден и стандартными средствами инфу извлечь не возможно...
Я вроде разобрался как и где хранится текст. В принципе английский текст извлеч получается, но вот если документ был на руссском возникают проблемы:
1-я и пока основная после декомпрессии выводится абракодабра... Что с ней делать??? Может нужно изменить параметры декомпрессии???
Если кто занимался подобными вещами, помогите плиз!!!

P.S. Программирую на VS c++ для декомпресси использую zlib (точнее функцию uncompress).
Re: Нужна помощь!!! Извлечение текста из PDF
От: migel  
Дата: 14.03.06 07:07
Оценка:
Здравствуйте, SvatSergio, Вы писали:

SS>Возникла задача (а точнее проблема):

SS>Необходимо извлечь текстовую информацию из файлов формата PDF. При этом есть одна особенность — файл поврежден и стандартными средствами инфу извлечь не возможно...
SS>Я вроде разобрался как и где хранится текст. В принципе английский текст извлеч получается, но вот если документ был на руссском возникают проблемы:
SS>1-я и пока основная после декомпрессии выводится абракодабра... Что с ней делать??? Может нужно изменить параметры декомпрессии???
Нет не нужно
SS>Если кто занимался подобными вещами, помогите плиз!!!

Как минимум тебе придеться покапаться кроме content stream еще и в шрифтах — кодировка не ASCII символов в PDF эээээ.... несколько туманна — почитай спецификацию ПДФ касаемое TextEncoding
... << RSDN@Home 1.2.0 alpha rev. 644>>
Re[2]: Нужна помощь!!! Извлечение текста из PDF
От: SvatSergio  
Дата: 14.03.06 08:18
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, SvatSergio, Вы писали:


SS>>Возникла задача (а точнее проблема):

SS>>Необходимо извлечь текстовую информацию из файлов формата PDF. При этом есть одна особенность — файл поврежден и стандартными средствами инфу извлечь не возможно...
SS>>Я вроде разобрался как и где хранится текст. В принципе английский текст извлеч получается, но вот если документ был на руссском возникают проблемы:
SS>>1-я и пока основная после декомпрессии выводится абракодабра... Что с ней делать??? Может нужно изменить параметры декомпрессии???
M>Нет не нужно
SS>>Если кто занимался подобными вещами, помогите плиз!!!

M>Как минимум тебе придеться покапаться кроме content stream еще и в шрифтах — кодировка не ASCII символов в PDF эээээ.... несколько туманна — почитай спецификацию ПДФ касаемое TextEncoding



Спасибо, Migel, попробую разобраться..

Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???
Re[3]: Нужна помощь!!! Извлечение текста из PDF
От: migel  
Дата: 14.03.06 09:56
Оценка:
Здравствуйте, SvatSergio, Вы писали:

SS>Здравствуйте, migel, Вы писали:


SS>Спасибо, Migel, попробую разобраться..


SS>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

А в чем это проявляется? ZLIB ошибки дает?
... << RSDN@Home 1.2.0 alpha rev. 644>>
Re[4]: Нужна помощь!!! Извлечение текста из PDF
От: Аноним  
Дата: 14.03.06 10:32
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, SvatSergio, Вы писали:


SS>>Здравствуйте, migel, Вы писали:


SS>>Спасибо, Migel, попробую разобраться..


SS>>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

M>А в чем это проявляется? ZLIB ошибки дает?

Да, выдает ошибку: Z_DATA_ERROR
Re[5]: Нужна помощь!!! Извлечение текста из PDF
От: migel  
Дата: 16.03.06 08:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, migel, Вы писали:


M>>Здравствуйте, SvatSergio, Вы писали:


SS>>>Здравствуйте, migel, Вы писали:


SS>>>Спасибо, Migel, попробую разобраться..


SS>>>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

M>>А в чем это проявляется? ZLIB ошибки дает?

А>Да, выдает ошибку: Z_DATA_ERROR

Файл точно не битый? Акробат нориально читает? А то некоторые генерилки такого создают что долго в чувство приходиш после прочтения — например некоторые в потоках неправильно длину указывают.
В общем случае разбирать контент поток страницы нужно до первой ошибки в потоке.
... << RSDN@Home 1.2.0 alpha rev. 644>>
Re[6]: Нужна помощь!!! Извлечение текста из PDF
От: Аноним  
Дата: 16.03.06 09:38
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, <Аноним>, Вы писали:


А>>Здравствуйте, migel, Вы писали:


M>>>Здравствуйте, SvatSergio, Вы писали:


SS>>>>Здравствуйте, migel, Вы писали:


SS>>>>Спасибо, Migel, попробую разобраться..


SS>>>>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

M>>>А в чем это проявляется? ZLIB ошибки дает?

А>>Да, выдает ошибку: Z_DATA_ERROR

M>Файл точно не битый? Акробат нориально читает? А то некоторые генерилки такого создают что долго в чувство приходиш после прочтения — например некоторые в потоках неправильно длину указывают.
M>В общем случае разбирать контент поток страницы нужно до первой ошибки в потоке.


Не понял...
Разбирать в смысле декомпрессить???
Если декомпрессить, то каким образом поток можно разжимать последовательно, а не весь сразу...
(может я не до конца разобрался с zlib ???)
Re[7]: Нужна помощь!!! Извлечение текста из PDF
От: migel  
Дата: 16.03.06 11:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, migel, Вы писали:


M>>Здравствуйте, <Аноним>, Вы писали:


А>>>Здравствуйте, migel, Вы писали:


M>>>>Здравствуйте, SvatSergio, Вы писали:


SS>>>>>Здравствуйте, migel, Вы писали:


SS>>>>>Спасибо, Migel, попробую разобраться..


SS>>>>>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

M>>>>А в чем это проявляется? ZLIB ошибки дает?

А>>>Да, выдает ошибку: Z_DATA_ERROR

M>>Файл точно не битый? Акробат нориально читает? А то некоторые генерилки такого создают что долго в чувство приходиш после прочтения — например некоторые в потоках неправильно длину указывают.
M>>В общем случае разбирать контент поток страницы нужно до первой ошибки в потоке.


А>Не понял...

А>Разбирать в смысле декомпрессить???
А>Если декомпрессить, то каким образом поток можно разжимать последовательно, а не весь сразу...
А>(может я не до конца разобрался с zlib ???)

Код декомпрессии ZLib по кусочкам
    bool FlateStream::FillBuffer()
    {
        if (m_IsEOS)
            return false;
        uint outBuffSize = sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]);
        z_stream* pStm = (z_stream*)m_pZlibStream;
        if (!m_pZlibStream)
        {
            pStm = new z_stream;
            ZeroMemory(pStm, sizeof(z_stream));

            int ret = inflateInit(pStm);
            if (ret != Z_OK)
                return false;
            m_pZlibStream = pStm;
        }

        int size = 0; 
        if (pStm->next_in == NULL || pStm->next_in >= m_InBuffer + sizeof(m_InBuffer)/sizeof(m_InBuffer[0]))
        {
            for (int i = 0; 
                    i < sizeof(m_InBuffer)/sizeof(m_InBuffer[0]) && !GetStream()->IsEOF(); 
                    ++i, ++size)
                m_InBuffer[i] = GetStream()->GetChar();

            pStm->avail_in = size; 
            pStm->next_in = m_InBuffer;
            if (pStm->avail_in == 0)
                return false; 
        }
        
        pStm->avail_out = sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]);
        pStm->next_out = m_OutBuffer; 
        int ret = inflate(pStm, Z_NO_FLUSH);
        
        m_pBufferEnd = m_OutBuffer + sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]) - pStm->avail_out;
        m_pBufferPtr = m_OutBuffer;
        m_IsEOS = ret == Z_STREAM_END;

        if (ret != Z_OK)
        {
            m_pZlibStream = NULL;
            inflateEnd(pStm);
            delete pStm;
            return ret == Z_STREAM_END;
        }
        return m_pBufferPtr != m_pBufferEnd;
    }
... << RSDN@Home 1.2.0 alpha rev. 644>>
Re[8]: Нужна помощь!!! Извлечение текста из PDF
От: Аноним  
Дата: 16.03.06 13:50
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, <Аноним>, Вы писали:


А>>Здравствуйте, migel, Вы писали:


M>>>Здравствуйте, <Аноним>, Вы писали:


А>>>>Здравствуйте, migel, Вы писали:


M>>>>>Здравствуйте, SvatSergio, Вы писали:


SS>>>>>>Здравствуйте, migel, Вы писали:


SS>>>>>>Спасибо, Migel, попробую разобраться..


SS>>>>>>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

M>>>>>А в чем это проявляется? ZLIB ошибки дает?

А>>>>Да, выдает ошибку: Z_DATA_ERROR

M>>>Файл точно не битый? Акробат нориально читает? А то некоторые генерилки такого создают что долго в чувство приходиш после прочтения — например некоторые в потоках неправильно длину указывают.
M>>>В общем случае разбирать контент поток страницы нужно до первой ошибки в потоке.


А>>Не понял...

А>>Разбирать в смысле декомпрессить???
А>>Если декомпрессить, то каким образом поток можно разжимать последовательно, а не весь сразу...
А>>(может я не до конца разобрался с zlib ???)

M>Код декомпрессии ZLib по кусочкам

M>
M>    bool FlateStream::FillBuffer()
M>    {
M>        if (m_IsEOS)
M>            return false;
M>        uint outBuffSize = sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]);
M>        z_stream* pStm = (z_stream*)m_pZlibStream;
M>        if (!m_pZlibStream)
M>        {
M>            pStm = new z_stream;
M>            ZeroMemory(pStm, sizeof(z_stream));

M>            int ret = inflateInit(pStm);
M>            if (ret != Z_OK)
M>                return false;
M>            m_pZlibStream = pStm;
M>        }

M>        int size = 0; 
M>        if (pStm->next_in == NULL || pStm->next_in >= m_InBuffer + sizeof(m_InBuffer)/sizeof(m_InBuffer[0]))
M>        {
M>            for (int i = 0; 
M>                    i < sizeof(m_InBuffer)/sizeof(m_InBuffer[0]) && !GetStream()->IsEOF(); 
M>                    ++i, ++size)
M>                m_InBuffer[i] = GetStream()->GetChar();

            pStm->>avail_in = size; 
            pStm->>next_in = m_InBuffer;
M>            if (pStm->avail_in == 0)
M>                return false; 
M>        }
        
        pStm->>avail_out = sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]);
        pStm->>next_out = m_OutBuffer; 
M>        int ret = inflate(pStm, Z_NO_FLUSH);
        
M>        m_pBufferEnd = m_OutBuffer + sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]) - pStm->avail_out;
M>        m_pBufferPtr = m_OutBuffer;
M>        m_IsEOS = ret == Z_STREAM_END;

M>        if (ret != Z_OK)
M>        {
M>            m_pZlibStream = NULL;
M>            inflateEnd(pStm);
M>            delete pStm;
M>            return ret == Z_STREAM_END;
M>        }
M>        return m_pBufferPtr != m_pBufferEnd;
M>    }
M>




Спасибо за пример, только я не все разобрал ...
Что подается в потоке??? — Поток stream ... endstream ?
Каким образом оперделяется длина потока stream ... endstream??? (т.е. каким образом вычисляется скоко байт загружат в инфлятор)

Может тут на самом деле все элементарно, но я не очень искушен в программировании...
Заранее спасибо!!!

Чуть не забыл...
Не проще ли использовать uncompress(), вместо inflate()??
Если нет, то почему??? Ведь она делает по сути тоже самое...
Re[9]: Нужна помощь!!! Извлечение текста из PDF
От: Аноним  
Дата: 16.03.06 14:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, migel, Вы писали:


M>>Здравствуйте, <Аноним>, Вы писали:


А>>>Здравствуйте, migel, Вы писали:


M>>>>Здравствуйте, <Аноним>, Вы писали:


А>>>>>Здравствуйте, migel, Вы писали:


M>>>>>>Здравствуйте, SvatSergio, Вы писали:


SS>>>>>>>Здравствуйте, migel, Вы писали:


SS>>>>>>>Спасибо, Migel, попробую разобраться..


SS>>>>>>>Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???

M>>>>>>А в чем это проявляется? ZLIB ошибки дает?

А>>>>>Да, выдает ошибку: Z_DATA_ERROR

M>>>>Файл точно не битый? Акробат нориально читает? А то некоторые генерилки такого создают что долго в чувство приходиш после прочтения — например некоторые в потоках неправильно длину указывают.
M>>>>В общем случае разбирать контент поток страницы нужно до первой ошибки в потоке.


А>>>Не понял...

А>>>Разбирать в смысле декомпрессить???
А>>>Если декомпрессить, то каким образом поток можно разжимать последовательно, а не весь сразу...
А>>>(может я не до конца разобрался с zlib ???)

M>>Код декомпрессии ZLib по кусочкам

M>>
M>>    bool FlateStream::FillBuffer()
M>>    {
M>>        if (m_IsEOS)
M>>            return false;
M>>        uint outBuffSize = sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]);
M>>        z_stream* pStm = (z_stream*)m_pZlibStream;
M>>        if (!m_pZlibStream)
M>>        {
M>>            pStm = new z_stream;
M>>            ZeroMemory(pStm, sizeof(z_stream));

M>>            int ret = inflateInit(pStm);
M>>            if (ret != Z_OK)
M>>                return false;
M>>            m_pZlibStream = pStm;
M>>        }

M>>        int size = 0; 
M>>        if (pStm->next_in == NULL || pStm->next_in >= m_InBuffer + sizeof(m_InBuffer)/sizeof(m_InBuffer[0]))
M>>        {
M>>            for (int i = 0; 
M>>                    i < sizeof(m_InBuffer)/sizeof(m_InBuffer[0]) && !GetStream()->IsEOF(); 
M>>                    ++i, ++size)
M>>                m_InBuffer[i] = GetStream()->GetChar();

            pStm->>>avail_in = size; 
            pStm->>>next_in = m_InBuffer;
M>>            if (pStm->avail_in == 0)
M>>                return false; 
M>>        }
        
        pStm->>>avail_out = sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]);
        pStm->>>next_out = m_OutBuffer; 
M>>        int ret = inflate(pStm, Z_NO_FLUSH);
        
M>>        m_pBufferEnd = m_OutBuffer + sizeof(m_OutBuffer)/sizeof(m_OutBuffer[0]) - pStm->avail_out;
M>>        m_pBufferPtr = m_OutBuffer;
M>>        m_IsEOS = ret == Z_STREAM_END;

M>>        if (ret != Z_OK)
M>>        {
M>>            m_pZlibStream = NULL;
M>>            inflateEnd(pStm);
M>>            delete pStm;
M>>            return ret == Z_STREAM_END;
M>>        }
M>>        return m_pBufferPtr != m_pBufferEnd;
M>>    }
M>>




А>Спасибо за пример, только я не все разобрал ...

А>Что подается в потоке??? — Поток stream ... endstream ?
А>Каким образом оперделяется длина потока stream ... endstream??? (т.е. каким образом вычисляется скоко байт загружат в инфлятор)

А>Может тут на самом деле все элементарно, но я не очень искушен в программировании...

А>Заранее спасибо!!!

А>Чуть не забыл...

А>Не проще ли использовать uncompress(), вместо inflate()??
А>Если нет, то почему??? Ведь она делает по сути тоже самое...


Еще один вопрос: после декомпрессии потока с латинской кодировкой получается структура: ВТ ... (text)Tj...ET
А что выводится после декомпрессии потоков из файла с другими кодировками (например с русским языком)???
Re[10]: Нужна помощь!!! Извлечение текста из PDF
От: migel  
Дата: 16.03.06 14:25
Оценка:
А>Еще один вопрос: после декомпрессии потока с латинской кодировкой получается структура: ВТ ... (text)Tj...ET
А>А что выводится после декомпрессии потоков из файла с другими кодировками (например с русским языком)???
Все же спецификацию лучше почитать
Это разметка контент потока страницы
в частности команды PDF в потоке всегда начинаются с мнемокода за которым идут несколько параметров
Мнемокод команды всегда ASCII текст же может быть в любой кодировке
... << RSDN@Home 1.2.0 alpha rev. 644>>
Re[11]: Нужна помощь!!! Извлечение текста из PDF
От: Аноним  
Дата: 16.03.06 20:10
Оценка:
Здравствуйте, migel, Вы писали:

А>>Еще один вопрос: после декомпрессии потока с латинской кодировкой получается структура: ВТ ... (text)Tj...ET

А>>А что выводится после декомпрессии потоков из файла с другими кодировками (например с русским языком)???
M>Все же спецификацию лучше почитать
M>Это разметка контент потока страницы
M>в частности команды PDF в потоке всегда начинаются с мнемокода за которым идут несколько параметров
M>Мнемокод команды всегда ASCII текст же может быть в любой кодировке

Я читал спецификацию...
да здесь идет описание начертания символов и т.д. и т.п. , плюс сам текст из документа в круглых скобках: (текст документа)Tj

Вопрос в другом (этого я из спецификации не совсем уяснил): Если как раз другие кодировки, то текст вроде тоже хранится в сжатом виде в потоках???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.