Специальные символы неправильно преобразованы из PDF в текст

У меня есть набор PDF-файлов, которые содержат символы Центральной Европы, такие как č, Ď, Š и так далее. Я хочу преобразовать их в текст, и я попытался pdftotext а также PDFBox через Apache Tika, но всегда некоторые из них не конвертируются правильно.

Странно то, что один и тот же символ в одном и том же тексте корректно преобразуется в некоторых местах и ​​некорректно в некоторых других! Примером этого является PDF.

В случае pdftotext я использую эти параметры:

pdftotext -nopgbrk -eol dos -enc UTF-8 070612.pdf

Мой код Тика выглядит так:

          String newname = f.getCanonicalPath().replace(".pdf", ".txt");
          OutputStreamWriter print = new OutputStreamWriter (new FileOutputStream(newname), Charset.forName("UTF-16"));
          String    fileString = "path\to\myfiles\"
          try{

              is = new FileInputStream(f);

              ContentHandler contenthandler = new BodyContentHandler(10*1024*1024);
              Metadata metadata = new Metadata();
              PDFParser pdfparser = new PDFParser();

              pdfparser.parse(is, contenthandler, metadata, new ParseContext());
              String outputString = contenthandler.toString();

              outputString = outputString.replace("\n", "\r\n");
              System.err.println("Writing now file "+newname);
              print.write(outputString);

          }catch (Exception e) {
              e.printStackTrace();
            }
            finally {
               if (is != null) is.close();
               print.close();
            }

Изменить: Забыл упомянуть, что я сталкиваюсь с той же проблемой при преобразовании в текст из Acrobat Reader XI, а также.

1 ответ

Помимо всего прочего, этот код будет использовать кодировку платформы по умолчанию:

PrintWriter print = new PrintWriter(newname);
print.print(outputString);
print.close();

Я предлагаю вам использовать OutputStreamWriter вместо того, чтобы обернуть FileOutputStreamи укажите UTF-8 в качестве кодировки (так как он может кодировать весь Unicode и, как правило, хорошо поддерживается).

Вы также должны закрыть писателя в finally блок, и я бы, вероятно, отделить часть "чтение" от части "запись". (Я бы не стал ловить Exception тоже, но вдаваться в детали обработки исключений немного выходит за рамки этого ответа.)

Другие вопросы по тегам