2012-04-17 114 views
4

我使用此代码使用iTextSharp阅读pdf内容。当内容是英语时它工作正常,但当内容是波斯语或阿拉伯语时不起作用
结果是这样的:
Here是样本非英文PDF测试。使用iTextSharp在C#中阅读pdf内容

UZU>ناUU”بÙ~طثیؿیÙ> U〜زؾاUU>ÙØÙ”Ù,Ù>Ù... O یٔ欧•Ø³Â ©卡尔·塞甘foppersian.codeplex.com www.codebetter.com 11个UU”بÙ~طثUZU>نایؿیÙ> U〜

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

什么方案?

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

我认为阿拉伯字符,它正在打印他们相应的Unicode字符。所以在打印之前,你需要将它们转换成正常的字符串/字符。 – vikiiii 2012-04-17 06:01:35

+0

@vikiiii谢谢,你有什么想法我该怎么做? – Shahin 2012-04-17 06:20:03

+1

[查看此答案](http://stackoverflow.com/questions/9447648/parse-a-persian-pdf-file-to-txt-and-its-images/9454073#9454073)为例。但即使如此,那里**是一个问题(IIRC与5.1.2),因为波斯语/阿拉伯语是从右到左的语言。建议您尝试最新版本或SVN并查看问题是否已得到解决。 – kuujinbo 2012-04-17 09:49:59

回答

11

在.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 ی 

代码将混淆的任何ASCII 127以上屏障。删除重新编码的行,你应该很好。

附注:完全可能的是,无论创建一个字符串是否会造成错误,实际上并不罕见。但是,您需要在之前解决该问题它变为string,在byte级别。

EDIT

的代码应该是完全相同的作为你的上述不同之处在于一个线应被删除。另外,无论你用什么来显示文本,都要确保它支持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似乎并未实际执行此操作。我绝对可能在这方面是错误的,因为这不是我的专业,所以你必须更多地徘徊。

+0

谢谢主席先生,我 尝试修复我的功能根据你的答案,但我没有成功,你会请复制功能完全在你的答案? – Shahin 2012-04-17 13:38:21

+0

您的解决方案可以用于正常的文本,但是当数据来自PDF 与内容PDF它不工作“سلام”返回“ملاس” – Shahin 2012-04-17 13:44:58

+0

shaahin,我的代码将修复这只是一个编码问题,你的第一个问题。你的第二个问题是LTR vs RTL,正如kuujunbo所说的那样,这可能需要在iText/iTextSharp层面修复。 – 2012-04-17 14:13:02