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-файлах, и вы должны убедиться, что случайно не изменили инструкции за пределами строки.