IText - редактирование испанского документа с использованием PdfDictionary и PDF Stamper

Я пытаюсь прочитать документ с использованием itext и заменить строку в нем. Но однажды манипулируя всем испанским персонажем становится ненужным персонажем. Ниже приведен код для изменения PDF.

    PdfReader     reader = new PdfReader(src);
    PdfDictionary dict   = reader.getPageN(1);
    PdfObject     object = dict.getDirectObject(PdfName.CONTENTS);
    if (object instanceof PRStream) {
        PRStream stream     = (PRStream) object;
        byte[]   data       = PdfReader.getStreamBytes(stream);
        String   dataString = new String(data);
        dataString = dataString.replace(sourceString, replacementString);
        stream.setData(dataString.getBytes("UTF-8"));
    }
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close();

В настоящем pdf есть строка ${address-line-one}, которую я заменяю на "20th Street"

Это работает, но с этим испанским словом, которое находится в потоке

Documentación становится Documentaci�n

и то же самое для другого испанского слова.

Я также напечатал bytes[] в консоли Java и обнаружил, что само чтение не получает этот символ должным образом.

Любое предложение?

1 ответ

Ты используешь

new String(data)

превратить байты в строку (используя некоторую кодировку по умолчанию) и

dataString.getBytes("UTF-8")

превратить строку обратно в байты (используя utf-8).

Таким образом, если кодировка по умолчанию в первой операции не соответствует utf-8, эти преобразования создадут артефакты, как вы видели выше.

Поэтому, пожалуйста, используйте

new String(data, encoding)

а также

dataString.getBytes(encoding)

вместо.


Как уже было сказано, utf-8 является очень неподходящей кодировкой, используйте вместо этого что-то вроде Latin-1 / ISO-8559-1.


Тем не менее, ваш подход к редактированию контента будет работать только в очень специфических PDF-файлах. В частности, кодировки используемых шрифтов должны быть WinAnsiEncoding, а строки или "поля" должны быть нарисованы в одной инструкции каждая. Кроме того, ваши замены не должны быть намного длиннее заменяемого текста и не должны содержать символов, для которых Latin-1 и WinAnsiEncoding отличаются или которые имеют особое значение в PDF-файлах, и вы должны убедиться, что случайно не изменили инструкции за пределами строки.

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