2012-04-17 84 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