Возникла задача (а точнее проблема):
Необходимо извлечь текстовую информацию из файлов формата PDF. При этом есть одна особенность — файл поврежден и стандартными средствами инфу извлечь не возможно...
Я вроде разобрался как и где хранится текст. В принципе английский текст извлеч получается, но вот если документ был на руссском возникают проблемы:
1-я и пока основная после декомпрессии выводится абракодабра... Что с ней делать??? Может нужно изменить параметры декомпрессии???
Если кто занимался подобными вещами, помогите плиз!!!
P.S. Программирую на VS c++ для декомпресси использую zlib (точнее функцию uncompress).
Здравствуйте, SvatSergio, Вы писали:
SS>Возникла задача (а точнее проблема): SS>Необходимо извлечь текстовую информацию из файлов формата PDF. При этом есть одна особенность — файл поврежден и стандартными средствами инфу извлечь не возможно... SS>Я вроде разобрался как и где хранится текст. В принципе английский текст извлеч получается, но вот если документ был на руссском возникают проблемы: SS>1-я и пока основная после декомпрессии выводится абракодабра... Что с ней делать??? Может нужно изменить параметры декомпрессии???
Нет не нужно SS>Если кто занимался подобными вещами, помогите плиз!!!
Как минимум тебе придеться покапаться кроме content stream еще и в шрифтах — кодировка не ASCII символов в PDF эээээ.... несколько туманна — почитай спецификацию ПДФ касаемое TextEncoding
Здравствуйте, migel, Вы писали:
M>Здравствуйте, SvatSergio, Вы писали:
SS>>Возникла задача (а точнее проблема): SS>>Необходимо извлечь текстовую информацию из файлов формата PDF. При этом есть одна особенность — файл поврежден и стандартными средствами инфу извлечь не возможно... SS>>Я вроде разобрался как и где хранится текст. В принципе английский текст извлеч получается, но вот если документ был на руссском возникают проблемы: SS>>1-я и пока основная после декомпрессии выводится абракодабра... Что с ней делать??? Может нужно изменить параметры декомпрессии??? M>Нет не нужно SS>>Если кто занимался подобными вещами, помогите плиз!!!
M>Как минимум тебе придеться покапаться кроме content stream еще и в шрифтах — кодировка не ASCII символов в PDF эээээ.... несколько туманна — почитай спецификацию ПДФ касаемое TextEncoding
Спасибо, Migel, попробую разобраться..
Еще один вопрос: по непонятной для меня причине не все потоки с фильтром /FlateDecode поддаются декомпрессии, есть ли этому объяснение???
Здравствуйте, 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 ошибки дает?
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, 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 ???)
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, 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
А что выводится после декомпрессии потоков из файла с другими кодировками (например с русским языком)???
А>Еще один вопрос: после декомпрессии потока с латинской кодировкой получается структура: ВТ ... (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
Вопрос в другом (этого я из спецификации не совсем уяснил): Если как раз другие кодировки, то текст вроде тоже хранится в сжатом виде в потоках???