2015-10-13 70 views
0

我正在使用ItextSharp從pdf讀取數據。檢查結果字符串看起來是正確的,但是string.Replace無法替換文本。String.Replace來自ItextSharp的數據

因此,我猜這是某種編碼問題,但我沒有把它固定下來。

我的代碼來導入PDF文本應該轉換成UTF8

PdfReader pdfReader = new PdfReader("file.pdf"); 

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

        currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); 
        text.AppendLine(currentText); 
       } 
       pdfReader.Close(); 

然後我試圖更換三塊連字符和空格( - - )轉換爲3連字符( - )

input = input.Replace("-- -­", "---"); 

刪除從PDF導入UTF8轉換不會有所作爲(見下面的截圖 - 替換功能後斷點,但文本仍然存在):

Shows the result of the string replace in the text visualiser

編輯:

這裏是一個sample file的鏈接。當以記事本或++打開時,它會顯示一系列空格和連字符(請參見帶有空白渲染的npp屏幕截圖)。但是,在c#中讀取時,此文件不會被解釋爲unicode連字符和Unicode空間。 enter image description here

+4

請看[this](http://stackoverflow.com/a/10191879/231316)爲什麼你應該刪除整行'currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert ...'。行總是,總是錯,最好什麼也不做,最壞的情況是破壞數據。 –

+0

謝謝,但我的字符串。替換仍然失敗。 –

+0

請參閱編輯,我已經上傳了一個演示此問題的示例txt文件。 –

回答

0

事實證明,無論是iTextSharp的或源PDF使用一種叫做軟連字符來表示一個標準的連字符,所以雖然記事本,記事本++和Visual Studio文本Visualiser的所有渲染軟連字符作爲一個標準的連字符,它們不是相同的字符,這就是爲什麼String.Replace不執行任何替換。

從我對軟連字符的理解中,通常不應該渲染,這會在嘗試將字符粘貼到Web瀏覽器或其他程序(如charmap - 甚至是Visual Studio本身)時導致奇怪的行爲。

這導致了以下工作代碼:

input = input.Replace("­­ ­", "---"); 

在Firefox,這將呈現爲三個連字符替換空間,但是粘貼到記事本中顯示(這說明我的真實意圖)。

input = input.Replace("-- -", "---"); 

https://en.wikipedia.org/wiki/Soft_hyphen

軟連字符: http://www.fileformat.info/info/unicode/char/ad/index.htm

連字符(標準連字符) http://www.fileformat.info/info/unicode/char/2010/index.htm

我的解決辦法是添加下列行:

 input = input.Replace((char)173, '-'); 

tl; dr: 字符編碼非常好,並不是所有連字符都相等。