Когда я извлекаю испанский текст из PDF с помощью PDFBox, акценты меняются на «странные» символы - PullRequest
0 голосов
/ 12 марта 2019

У меня есть этот код в Java, чтобы взять файл PDF и извлечь весь текст:

File file= new File("C:/file.pdf");
PDDocument doc= PDDocument.load(file);
PDFTextStripper s = new PDFTextStripper();
content= s.getText(doc);
System.out.println(content)

Если мы запускаем приложение с Windows, оно работает правильно и извлекает весь текст.Однако когда мы передаем приложение на сервер, который использует Linux, испанские акценты преобразуются в «странные» символы, такие как -> «carÃccter» (это должно быть «carácter»).Я попытался преобразовать строку в байты, а затем в кодировку UTF8:

byte[] b = content.getBytes(Charset.forName("UTF-8"));
String text= new String(b);
System.out.println(text);

Но это не работает, в Windows он продолжает работать хорошо, но на сервере Linux он все еще показывает неправильные испанские акценты и т.д.... Я понимаю, что если в среде Windows это работает правильно, то в среде Linux оно должно работать тоже ... Любое представление о том, что это может быть или что я могу сделать?Спасибо

1 Ответ

0 голосов
/ 13 марта 2019

á - это то, что вы получаете, когда кодированная в UTF-8 форма á неверно интерпретируется как Latin-1.

Для этого есть две возможности:

  1. ошибка в PDFTextStripper.getText() - строки Java кодируются в UTF-16, но getText() может возвращать string, содержащий байтовые октеты UTF-8, которые были расширены как есть до 16-битных символов Java, таким образом, получая 2 символа 0x00C3 0x00A1 вместо 1 символа 0x00E1 для á.Впоследствии вызов content.getBytes(UTF8) для такого искаженного string просто даст вам больше поврежденных данных.

    Чтобы "исправить" ошибку такого рода, выполните цикл string, копируя его символы как есть в byte[] массив, а затем декодировать этот массив как UTF-8:

    byte[] b = new byte[content.length()];
    for (int i = 0; i < content.length(); ++i) {
        b[i] = (byte) content[i];
    }
    String text = new String(b, "UTF-8");
    System.out.println(text);
    
  2. несоответствие конфигурации - PDFTextStripper.getText() может возвращать правильно закодированный UTF-16 string, содержащийá char, как и ожидалось, но затем System.out.println() выводит кодированную UTF-8 форму этого string, и ваш терминал / консоль неверно интерпретирует вывод как Latin-1, а не как UTF-8.

    В этом случае с кодом, который вы показали, все в порядке, вам просто нужно дважды проверить среду Java и конфигурацию терминала / консоли, чтобы убедиться, что они согласуются с набором символов, используемым для вывода на консоль.

Вам необходимо проверить фактические значения символов в content, чтобы узнать, какой случай на самом деле происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...