2013-02-20 1 views
1

У меня есть сценарий, где мне нужно согласовать два документа, документ Word (.docx) и PDF. Эти два должны быть «indentical» друг к другу (PDF-файл является только PDF-версией файла DOCX); что они должны содержать один и тот же текст, содержание и т. д.Получение абзаца от Tika для Word и PDF

В частности, мне нужно убедиться, что оба документа содержат одинаковое количество абзацев. Поэтому мне нужно прочитать DOCX, получить количество абзацев, затем прочитать PDF-файл и захватить его количество абзацев. Если оба числа одинаковы, тогда я в бизнесе.

Похоже, что Apache Tika (Я интересуюсь 1.3) является правильным инструментом для работы здесь. Я вижу в this source file, что Тика поддерживает понятие подсчета абзацев, но пытается выяснить, как получить счет из обоих документов. Вот моя лучшая попытка, но я захлебываясь подключения некоторых конечных точек:

InputStream docxStream = new FileInputStream("some-doc.docx"); 
InputStream pdfStream = new FileInputStream("some-doc.pdf"); 

ContentHandler handler = new DefaultContentHandler(); 
Metadata docxMeta = new Metadata(); 
Metadata pdfMeta = new Metadata(); 
Parser parser = new OfficeParser(); 
ParseContext pc = new ParseContext(); 

parser.parse(docxStream, handler, docxMeta, pc); 
parser.parse(pdfStream, handler, pdfMeta, pc); 

docxStream.close(); 
pdfStream.close(); 

int docxParagraphCount = docxMeta.getXXX(???); 
int pdfParagraphCount = pdfMeta.getXXX(???); 

if(docxParagraphCount == pdfParagraphCount) 
    setInBusiness(myself, true); 

Так я спрашиваю: у меня установить это правильно или я способ покинуть базу? Если вы находитесь вне базы, одолжите мне помощь, чтобы вернуть меня в нужное русло. И если я правильно настроил ситуацию, то как мне получить желаемые счета из двух экземпляров Metadata? Заранее спасибо.

ответ

1

Прежде всего, Тика вернет вам метаданные, содержащиеся в ваших документах. Он ничего не вычислит для вас. Итак, если в одном из ваших документов отсутствуют метаданные с абзацем, вам не повезло. Если в одном из ваших документов есть данные Duff (т. Е. Программа, которая написала файл, неправильно), вам не повезет.

В противном случае ваш код находится почти там, но не совсем. Вы, скорее всего, хотите использовать DefaultParser или AutoDetectParser - OfficeParser предназначен только для форматов файлов Microsoft, а остальные автоматически загружают все доступные парсеры и выбирают правильный.

Недвижимость, которую вы хотите, это PARAGRAPH_COUNT, которая исходит из пространства имен метаданных Office. Ваш код будет что-то вроде:

TikaInputStream docxStream = TikaInputStream.get(new File("some-doc.docx")); 
TikaInputStream pdfStream = TikaInputStream.get(new File("some-doc.pdf")); 

ContentHandler handler = new DefaultContentHandler(); 
Metadata docxMeta = new Metadata(); 
Metadata pdfMeta = new Metadata(); 
ParseContext pc = new ParseContext(); 

Parser parser = TikaConfig.getDefaultConfig().getParser(); 

parser.parse(docxStream, handler, docxMeta, pc); 
parser.parse(pdfStream, handler, pdfMeta, pc); 

int docxParagraphCount = docxMeta.getInt(Office.PARAGRAPH_COUNT); 
int pdfParagraphCount = pdfMeta.getInt(Office.PARAGRAPH_COUNT); 

Если вы не заботитесь о тексте на всех, только метаданные, проходят в фиктивном содержимом обработчика

+0

Высоких - благодаря @Gagravarr (+1) - быстрому вопрос - в вашем ответе вы найдете сайт 'Office.PARAGRAPH_COUNT'. Должен ли второй быть чем-то вроде 'Pdf.PARAGRAPH_COUNT' или работает' Office.PARAGRAPH_COUNT' для обоих типов документов? Если да, то как/почему? Я предполагаю, что я просто предвидел тип PDF, определяющий его собственные свойства, а не 'Office.PARAGRAPH_COUNT' применительно ко всем документам. Например, как я могу узнать, для каких типов документов 'Office.PARAGRAPH_COUNT' ** не работает **? И т.д. Еще раз спасибо! – 2013-02-20 23:04:38

+0

Пространство имен метаданных, охватывающее количество абзацев, определено в [Класс Office] (http://tika.apache.org/1.3/api/org/apache/tika/metadata/Office.html). Одна из вещей, которые делает Тика, - это нормализация метаданных на общий набор определений, поэтому вам не нужно знать особенности каждого формата – Gagravarr

Смежные вопросы