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

我使用这个代码来阅读使用iTextSharp的PDF内容。 当内容是英语时它工作正常,但当内容是波斯语或阿拉伯语时它不工作
结果是这样的:
这里是非英文PDF样本的testing。

</s>Ùنن†††</s></s></s>·</s>ØØØØØØÙÙÙÙÙÙÙÙ</s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s> www.codebetter.com 1 1ØØØØØØ</s>ÙÙÙاØØØØØØØÙÙÙ</s>

همانرب لوصا یسیون مرن دیلوت رتهب رازÙا 

解决办法是什么 ?

  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(); } 

在.Net中,一旦你有一个string, 你就有一个string ,而且它总是 Unicode。 实际的内存中实现是UTF-16,但这并不重要。 永远不要将string分解为字节,并尝试将其重新解释为不同的编码,并将其作为string打回,因为这没有意义,并且几乎总是失败。

你的问题是这一行:

 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以上的任何屏障。 放弃重新编码的行,你应该是好的。

注意,不pipe怎样创build一个string都是不正确的,实际上并不罕见。 但是,在byte级别变成string 之前 ,你需要解决这个问题。

编辑

代码应该与上面的完全相同,只是应该删除一行。 另外,无论你用什么来显示文本,都要确保它支持Unicode。 另外,正如@kuujinbo所说,确保你使用的是最新版本的iTextSharp。 我用5.2.0.0testing了这个。

  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

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

因此,在这样的从右到左的书写系统中显示文本需要分别定位每个字形(这是繁琐且昂贵的)或者用显示string来表示字符(参见9.2,“字体的组织和使用”),其字符代码在相反的顺序。

PDF 2008规范 – 14.8.2.3.3 – 反序显示string

当重新排列上述string时,内容(如果我理解了正确的说法)应该使用“标记内容”部分BMC 。 但是,我查看和生成的less数示例PDF似乎并未实际执行此操作。 我绝对可能在这方面是错的,因为这不是我的专长,所以你不得不捅这么多。