5

このコードを使用して、iTextSharp を使用して pdf コンテンツを読み取ります。コンテンツが英語の場合は正常に機能しますが、コンテンツがペルシア語またはアラビア語の場合は機能しません
。結果は次のよう になります。テスト用の英語以外の PDF のサンプルは 次の
とおりです。

َٛنا Ùٔب٘طث یؿیٛ٘ زؾا ÙÙ›ÙØÙ” Ù‚Ù›Ù…Ø ÛŒÙ”Ø¨Ù•Ø³ © Karl Seguin foppersian.codeplex. com www.codebetter.com 1 1 Ùٔب٘طث َٛنا یؿیٛ٘

همانرب لوصا یسیون  مرن دیلوت رتهب Ø±Ø§Ø²ÙØ§

解決策は何ですか?

  public string ReadPdfFile(string fileName)
        {
            StringBuilder text = new StringBuilder();

            if (File.Exists(fileName))
            {
                PdfReader pdfReader = new PdfReader(fileName);

                for (int page = 1; page <= pdfReader.NumberOfPages; page++)
                {
                    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                    string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                    currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));
                    text.Append(currentText);
                    pdfReader.Close();
                }
            }
            return text.ToString();
        }
4

1 に答える 1

14

.Net では、文字列を取得すると、文字列が取得され、常にUnicode になります。実際のメモリ内実装は UTF-16 ですが、それは問題ではありません。文字列をバイトに分解し、それを別のエンコーディングとして再解釈して、文字列として平手打ちしようとすることは絶対に絶対にしないでください。これは意味がなく、ほとんどの場合失敗するためです。

あなたの問題はこの行です:

currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));

説明するために、それを数行に分けて説明します。

byte[] bytes = Encoding.UTF8.GetBytes("ی"); //bytes now holds 0xDB8C
byte[] converted = Encoding.Convert(Encoding.Default, Encoding.UTF8, bytes);//converted now holds 0xC39BC592
string final = Encoding.UTF8.GetString(converted);//final now holds ی

このコードは、127 ASCII バリアを超えるものを混同します。再エンコード行をドロップすると、うまくいくはずです。

補足として、文字列を作成するものは何でも間違って作成する可能性が十分にありますが、実際にはそれほど珍しいことではありません。しかし、レベルで、それが になるに、その問題を修正する必要があります。stringbyte

編集

コードは、1 行を削除する必要があることを除いて、上記とまったく同じにする必要があります。また、テキストを表示するために使用しているものが何であれ、それが Unicode をサポートしていることを確認してください。また、@kuujinbo が言ったように、最新バージョンの iTextSharp を使用していることを確認してください。これを 5.2.0.0 でテストしました。

    public string ReadPdfFile(string fileName) {
        StringBuilder text = new StringBuilder();

        if (File.Exists(fileName)) {
            PdfReader pdfReader = new PdfReader(fileName);

            for (int page = 1; page <= pdfReader.NumberOfPages; page++) {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

                text.Append(currentText);
            }
            pdfReader.Close();
        }
        return text.ToString();
    }

編集2

上記のコードはエンコーディングの問題を修正しますが、文字列自体の順序は修正しません。残念ながら、この問題は PDF レベル自体にあるようです。

したがって、このような右から左への書記体系でテキストを表示するには、各グリフを個別に配置するか (これは面倒でコストがかかります)、テキストを表示文字列 (9.2.「フォントの編成と使用」を参照) で表す必要があります。逆順。

PDF 2008 仕様 - 14.8.2.3.3 - 逆順の表示文字列

上記のような文字列を並べ替える場合、コンテンツは (仕様を正しく理解していれば) 「マークされたコンテンツ」セクションを使用することになっていますBMC。ただし、私が見て生成したいくつかのサンプル PDF は、実際にはこれを行っていないようです。これは私の専門ではないので、私は絶対に間違っている可能性があります。

于 2012-04-17T13:07:30.187 に答える