2016-06-12 4 views
0

Мне нужна помощь. Я хочу заменить текст другим в файле PDF (я использую библиотеку iText), но когда я пытаюсь сделать это с помощью букв с акцентом, у него есть проблемы с кодировкой.Как заменить текст в PDF на iText без проблемы с кодировкой? (Android)

public static void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    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 eredeti = "öüóá"; 
     final String s = new String(eredeti.getBytes(), BaseFont.CP1250); 

     stream.setData(new String(data).replace("Hello World", s).getBytes()); 
    } 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    stamper.close(); 
    reader.close(); 
} 

Но когда я открываю файл PDF, я вижу это: Wrong PDF

Я уже пробовал все типы кодирования, чтобы получить правильные буквы (öüóá), но он никогда не работал для меня.

Кто-нибудь знает, что мне делать?

+0

вы используя юникод шрифт? – SML

+0

Словарь страниц, который вы получаете с 'getPageN()', имеет запись '/ Resources'. Эта запись содержит ссылки на шрифт. Если это простой шрифт, он определяет не более 256 символов. Вполне возможно, что вам не нужны персонажи. Если это сложный шрифт, он скорее всего будет содержать подмножество символов, которые уже используются в документе. Вам не нужны персонажи. В общем, это плохой вопрос. Код, который вы используете, не должен использоваться. Проблема, которую вы пытаетесь решить, задокументирована как «не пытайтесь это сделать». –

+0

Ákos, есть не только возможные проблемы, намеченные @Bruno (символы, отсутствующие в шрифте) и, очевидно, проблемы с кодировкой, также очень опасно обрабатывать поток контента, как если бы это была символьная строка с одной кодировкой: если вы знаете, что делаете, и соответствующим образом обработали ваши входы, у вас есть хороший шанс сделать контент потока недействительным. У PDFBox обычно был пример с подобными примерами, и по всем причинам, упомянутым выше, они удалили его из своего дистрибутива и теперь предупреждают о том, чтобы делать что-то подобное. – mkl

ответ

0

я уже нашел решение;)

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

stream.setData(new String(data).replace("Hello World", s).getBytes("ISO-8859-2")); 

Вы можете увидеть окончательную форму моего кода здесь:

public static void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    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 eredeti = "öűóá"; 
     final String s = new String(eredeti.getBytes()); 

     stream.setData(new String(data).replace("Hello World", s).getBytes("ISO-8859-2")); 
    } 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    stamper.close(); 

    Paragraph preface = new Paragraph(); 
    preface.setAlignment(Element.ALIGN_CENTER); 

    reader.close(); 
} 
+0

Есть несколько PDF-файлов, для которых это работает. Их больше нет, это не работает. – mkl

+0

Я тестировал несколько файлов PDF, но каждый раз работал для меня:/ –

+0

Возьмем, к примеру, [свободную копию спецификации PDF] (http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf), стр. 1, титульную страницу и попытайтесь заменить «Первый» (из «Первого издания») «Второй»; или «управление» (из «Управление документами») посредством «отображения»; или «2008» (с «2008-7-1») на «1234». И этот документ очень ручен внутри ... – mkl

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