2013-08-07 2 views
2

При создании файла PDF, я прилагаю некоторую информацию к нему с этим кодом, чтобы сделать его доступным для чтения в мою программу:iText Проблемы с кодировкой PdfDictionary?

 PdfDictionary dictionary = new PdfDictionary(); 

     PdfObject object; 
     PdfName index; 

     ArrayList<String> content = getCompactData(document); 

     for (int i = 0; i < content.size(); i++) 
     { 
      object = new PdfString(content.get(i)); 
      index = new PdfName(Integer.toString(i+1)); 

      dictionary.put(index, object); 
     } 

     writer.getExtraCatalog().putAll(dictionary); 

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

   PdfDictionary dictionary = reader.getCatalog(); 

       PdfName index; 
       PdfObject line; 

       ArrayList<String> data = new ArrayList<String>(); 

       for (int i = 1; i < dictionary.size()-2; i++) 
       { 
        index = new PdfName(Integer.toString(i)); 
        line = dictionary.getAsString(index); 
        data.add(line.toString()); 
       } 

Это все работает отлично, за исключением одной маленькой детали. По какой-то причине такие персонажи, как čšđćž, не переходят к процессу должным образом. Когда я пытаюсь извлечь данные, моя программа получает путаницу и не может распознать буквы.

Несколько нот:

  1. Моя рабочая область кодировка UTF-8
  2. При работе с моей программой я могу войти в эти письма без каких-либо проблем, они будут отображаться правильно.
  3. Я использую пользовательский шрифт .ttf (truetype), который, как я знаю, поддерживает эти символы.
  4. Я попытался распечатать содержимое каталога после последней строки сохраненного кода, который я предоставил, все было распечатано правильно.
  5. Я также попытался распечатать содержимое каталога строки до первого в открытом коде, символы не отображались.

Поэтому я понятия не имею, где все это может пойти не так. Вы?

ответ

5

Вы неправильно используете класс PdfString. Вместо

object = new PdfString(content.get(i)); 

использования

object = new PdfString(content.get(i), PdfObject.TEXT_UNICODE); 

и вместо

data.add(line.toString()); 

использования

data.add(line.toUnicodeString()); 

Некоторые справочная информация:

Конструктор вы использовали попытки использовать PDFDocEncoding:

/** 
* Constructs a <CODE>PdfString</CODE>-object containing a string in the 
* standard encoding <CODE>TEXT_PDFDOCENCODING</CODE>. 
* 
* @param value the content of the string 
*/ 
public PdfString(String value) 

Ваши персонажи čšđćž не присутствуют в этой кодировке.

Другой конструктор позволяет выбрать UTF-16BE кодировку вместо:

/** 
* Constructs a <CODE>PdfString</CODE>-object containing a string in the 
* specified encoding. 
* 
* @param value the content of the string 
* @param encoding an encoding 
*/ 
public PdfString(String value, String encoding) 

Для извлечения символов toString только возвращает внутреннее представление в то время как toUnicodeString заботится о кодировании:

/** 
* Returns the Unicode <CODE>String</CODE> value of this 
* <CODE>PdfString</CODE>-object. 
* 
* @return A <CODE>String</CODE> 
*/ 
public String toUnicodeString() 
+0

Спасибо вы, это сработало! P.S. Вы также можете написать для изменения 'line' из' PdfObject' в 'PdfString' – Karlovsky120

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