1

当我创建一个 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. 我还尝试在开放代码中的第一行之前打印出目录的内容,字符未显示。

所以我不知道哪里会出错。你?

4

1 回答 1

4

你错误地使用了这个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()
于 2013-08-07T14:20:18.860 回答