Часто спрашивают, как получить текст из Ворда, Екселя, PDF.
Часто отвечаю, что сложно, но есть способ простой, и зовут его IFilter. Давно думаю, что надо QA написать, но постоянно руки не доходят. Посему, пока руки не доходят и в этот раз, публикую текст, который даст представление о том, как этот механизм можно использовать. Сразу скажу, что использовать его можно только на Win2000 или WinNT, но для последней нужны некие приблуды, коими она по умолчанию не обладает (Option Pack).
Данная утилита вынимает текст в UNICODE из файла, переданного в качестве параметра (если для класса файлов, к которому документ принадлежит, установлен фильтр), и выдает его либо в файл, либо в стандартный вывод.
Это баг этой версии PDF IFilter, проблема усугубляется тем, что PDFFILT.dll (реализация IFilter) ссылается на PDFL60.dll исп-я механизм delay-load,
т.е. даже после выгрузки PDFFILT.dll проблемная dll (PDFL60.dll) остается "висеть" в памяти.
Решение в лоб:
— самому загружать\выгружать PDFFILT.dll (CoLoadLibrary\CoFreeLibrary),
— вручную создавать экземпляр IFilter (DllGetClassObject\IClassFactory, правда придется еще достать из реестра CLSID класса реализующего pdf IFilter, ну и путь к dll по этому CLSID),
— вручную инициализировать IFilter (IPersistFile, pdf IFilter реализует только его),
— после выгрузки PDFFILT.dll принудительно выгружать проблемную dll (PDFL60.dll) (GetModuleHandle\FreeLibrary).
Re[3]: SRC: QA Извлечение текста документов (IFilter)
AZ>Это баг этой версии PDF IFilter AZ>Решение в лоб: AZ>- самому загружать\выгружать PDFFILT.dll (CoLoadLibrary\CoFreeLibrary),
Хм, попробую. Как я понимаю, ключевой момент здесь — самому инициализировать iFilter? Ведь нет же разницы, как я выгружаю PDFFILT — в любом случае код уйдёт в
PDFFILT.dll!010a63a7() // DllMain(PROCESS_DETACH)
... и дальше по стеку — к багу.
Сейчас вот попробовал установить Adobe Reader 8 — он тоже идёт со (своим?) PDF iFilter. Такого бага не наблюдается. Пойду искать правды на адобовских форумах...
Garbage In Garbage Out
Re[4]: SRC: QA Извлечение текста документов (IFilter)
Здравствуйте, fuurin, Вы писали:
F>Хм, попробую. Как я понимаю, ключевой момент здесь — самому инициализировать iFilter? Ведь нет же разницы, как я выгружаю PDFFILT — в любом случае код уйдёт в F>PDFFILT.dll!010a63a7() // DllMain(PROCESS_DETACH) F>... и дальше по стеку — к багу.
Нет, ключевой момент в контроле над выгрузкой pdf dlls. Насколько я понял у них проблема вот в чем: при выгрузке процесса DLL_PROCESS_DETACH получает сначала delay-loaded dll (PDFL60.dll), происходит освобождение каких-то ресурсов; затем DLL_PROCESS_DETACH получает та dll, которая загрузила delay-load dll (PDFFILT.dll) и в которой происходит обращение (вызов функции, опять же с целью освобождения ресурсов) к уже почти выгруженной dll(PDFL60.dll), проверки на то, что финализация уже выполнена нет, отсюда и AV. Т.е. порядок выгрузки не соотв. порядку загрузки.
Кстати, то решение которое я приводил можно упростить: работаетет с IFilter's как и прежде, но перед завершением процесса делаем хак, что-то типа:
F>Сейчас вот попробовал установить Adobe Reader 8 — он тоже идёт со (своим?) PDF iFilter. Такого бага не наблюдается. Пойду искать правды на адобовских форумах...
Если есть возможность исп-ть конкретную (рабочую) версию PDF IFilter — используйте его, танцы с бубном никому не нужны.
Re[5]: SRC: QA Извлечение текста документов (IFilter)
AZ>Если есть возможность исп-ть конкретную (рабочую) версию PDF IFilter — используйте его, танцы с бубном никому не нужны.
Так выбирать-то особо и не из чего: на сайте PDF IFilter версии 5.0 и 6.0. Обе, как оказывается, с багами. Теперь вот разбираться с лицензиями на Reader — можно ли IFilter из его инсталляции использовать в своём приложении.
Текст на иврите из PDF возвращается странным образом перевёрнутым: буквы в словах в обратном порядке, как и сами слова в обратном порядке между двумя разделителями. Проверял на DOC-файлах — те отображаются правильно. Для примера можно взять этот документ.
Написал в Foxit — те признали баг, но ничего не обещали. (Фильтр от Foxit хоть нормально форматирует текст, в отличие от Adobe, где весь текст возвращается в одну строку.)
Написал в Adobe — оттуда вряд ли будет ответ.
IMPORTANT NOTE: Starting with Acrobat and Reader 7.0.5, iFilter functionality is now bundled within the Acrobat and Reader products. Improvements to iFilter in Acrobat and Reader 8 include support for Vista and Windows Desktop Search, as well as improved performance and stability. It is recommended that you update your copy of Adobe Acrobat or Adobe Reader in order to get the most current iFilter functionality, rather than download and install the stand-alone iFilter plug-in.
Теперь вот думаю, что делать — то ли переворачивать вывод из IFilter, то ли писать свой экстрактор непосредственно из PDF ): Второе удручает — беглый взгляд на доступные библиотеки (Xpdf, iTextSharp) показал, что никто с ивритом работать не умеет. Вероятно, как и с другими двунаправленными языками.