iText PdfDictionary编码问题?

时间:2013-08-07 13:30:33

标签: java pdf character-encoding itext

当我创建PDF文件时,我会使用此代码附加一些信息,以使其对我的程序可读:

        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. 我也尝试在开放代码的第一行之前打印出目录的内容,不显示字符。
  6. 所以我不知道哪里出错了。 你呢?

1 个答案:

答案 0 :(得分: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()