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. また、オープンコードの最初の行の1行前のカタログの内容を印刷しようとしましたが、文字が表示されませんでした。

そのため、どこですべてがうまくいかないのかわかりません。あなたは?

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 に答える