在C#中使用iTextSharp阅读pdf内容

时间:2012-04-17 05:32:31

标签: c# pdf itextsharp

我使用此代码使用iTextSharp读取pdf内容。当内容是英语时它工作正常,但当内容是波斯语或阿拉伯语时它不起作用
结果是这样的:
Here是非英语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();
        }

1 个答案:

答案 0 :(得分:13)

在.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屏障之外的任何内容。删除重新编码行,你应该很好。

旁注,完全有可能无论什么创建一个字符串都不正确,这实际上并不常见。但是您需要在<{em> <{em> 之前解决该问题<{1>},string级别。

修改

代码应与您的代码完全相同,但应删除一行。此外,无论您使用什么来显示文本,请确保它支持Unicode。另外,正如@kuujinbo所说,请确保您使用的是最近版本的iTextSharp。我用5.2.0.0进行了测试。

byte

编辑2

上面的代码修复了编码问题,但没有修复字符串本身的顺序。不幸的是,这个问题似乎是在PDF级别本身。

  

因此,在这种从右到左书写系统中显示文本   需要单独定位每个字形(这很乏味   和昂贵的)或表示带有显示字符串的文本(见9.2,   “字体的组织和使用”),其字符代码在   逆序。

PDF 2008 Spec - 14.8.2.3.3 - 反向显示字符串

当重新排序上述字符串时,内容是(如果我理解正确的规范)应该使用“标记内容”部分 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(); } 。但是,我查看和生成的少量示例PDF似乎并没有实际执行此操作。我绝对可能错在这一部分,因为这不是我的专长所以你不得不四处寻找。