2014-10-15 2 views
1

Я использую IText v5.5.1 для чтения PDF и сделать краски текст из него:IText бросает ClassCastException: PdfNumber не может быть приведен к PdfLiteral

pdfReader = new PdfReader(new CloseShieldInputStream(is)); 
pdfParser = new PdfReaderContentParser(pdfReader); 

int maxPageNumber = pdfReader.getNumberOfPages(); 
int pageNumber = 1; 

StringBuilder sb = new StringBuilder(); 

SimpleTextExtractionStrategy extractionStrategy = new SimpleTextExtractionStrategy(); 

while (pageNumber <= maxPageNumber) { 
    pdfParser.processContent(pageNumber, extractionStrategy); 

    sb.append(extractionStrategy.getText()); 

    pageNumber++; 
} 

one PDF file На следующее исключение:

java.lang.ClassCastException: com.itextpdf.text.pdf.PdfNumber cannot be cast to com.itextpdf.text.pdf.PdfLiteral 
    at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.processContent(PdfContentStreamProcessor.java:382) 
    at com.itextpdf.text.pdf.parser.PdfReaderContentParser.processContent(PdfReaderContentParser.java:80) 

Это PDF-файл, кажется, сломана, но, возможно, его содержание по-прежнему имеет смысл ...

+0

Есть ли должен быть какой-либо видимый контент в этом PDF-файле? –

ответ

1

Действительно

Это PDF-файл, кажется, сломан

Контента потоков всех страниц выглядеть следующим образом:

/GS1 gs 
q 
595.00 0 0 

Похоже, все они отрезаны уже в последней строке не является полная работа. Это, безусловно, может сделать синтаксический анализатор, как это делает iText.

Кроме того, контент должен быть длиннее, потому что даже размер сжатого потока немного больше длины этого. Это означает, что потоки разбиты на уровне байта.

Глядя на байт файла PDF один не могу не заметить, что

  1. даже внутри бинарных потоков коды 13 и 10 встречаются только вместе и
  2. значения перекрестных ссылок смещение меньше, чем фактическая позиции.

Так я полагаю, что этот PDF был передан с использованием транспортного способа обработки как текстовые данные, особенно заменой любого вида предполагаемого разрыва строки (CR или LF или CR LF) с CR LF Теперь вездесущи в файле (CR = возврат каретки = 13; LF = подача линии = 10). Такие замены автоматически прерывают любой сжатый поток данных, как потоки контента в вашем файле.

К сожалению, хотя ...

но, возможно, его содержание по-прежнему имеет смысл

Не так много. Для каждой страницы есть одно большое изображение. Учитывая небольшой размер потоков контента и большой размер изображения, я бы предположил, что PDF-файл содержит только отсканированные страницы. Но изображения также нарушаются из-за упомянутых выше замен.

+0

Вы предлагаете замену CR/LF очень приятно, спасибо. Если вы уже знаете, что может быть смещением, может быть, вы могли бы вылечить? По крайней мере, возможно, вы можете сказать мне, где именно извлечь эти смещения и какие значения они должны иметь, чтобы я мог продолжить эксперимент с CR ← → LF-переводом. Кажется, что файл нуждается в очень простых манипуляциях (удалите CR или удалите LF). –

+0

* Кажется, что файл нуждается в очень простых манипуляциях (удалите CR или удалите LF). * - материал cr и lf был * очевидным * дефектом, но могут быть и другие дефекты. Таким образом, замена каждого crlf на cr или lf не может исправить весь документ. И вы не знаете, что раньше было crlf, это мог быть единственный cr, один lf или crlf. Тестирование каждого варианта будет означать пробовать очень много вариантов. – mkl

+0

Вы правы. Я попробовал наивный crlf → cr и еще один раз crlf → lf, но все еще не могу открыть PDF. Спасибо за советы. –

0

Это не лучшее решение, но у меня была эта точная проблема и, к сожалению, я не могу поделиться точными PDF-файлами, с которыми у меня возникли проблемы.

Я создал вилку itextpdf, которая улавливает ClassCastException и просто пропускает PdfObjects, с которой он сталкивается. Он печатает на System.out то, что содержит текст и какой тип itextpdf считает. Мне не удалось сопоставить это с какой-то системной проблемой с моими PDF-файлами (кто-то умнее меня должен будет это сделать), и это исключение происходит только один раз в голубой луне. В любом случае, если это помогает кому-то, эта вилка по крайней мере не разбивает ваш код, позволяет вам анализировать большинство ваших PDF-файлов и дает вам немного информации о том, какие типы байтов, похоже, дают itextpdf расстройство желудка.

https://github.com/njhwang/itextpdf

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