2016-07-15 80 views
1

我正在處理文檔管理項目,我想從pdf中提取文本。我怎樣才能做到這一點。我正在使用Itextsharp在本地系統上提取PDF使用itextsharp提取ftp服務器上的pdf文件

這是我用於此目的的功能。 Path是一個FTP服務器路徑

public static string ExtractTextFromPdf(string path) 
    { 
     using (PdfReader reader = new PdfReader(path)) 
     { 
      StringBuilder text = new StringBuilder(); 

      for (int i = 1; i <= reader.NumberOfPages; i++) 
      { 
       text.Append(PdfTextExtractor.GetTextFromPage(reader, i)); 
      } 

      return text.ToString(); 
     } 
    } 

它拋出一個異常

'ftp:\\###\index\500199.pdf not found as file or resource.' 

[###是我的FTP服務器]

+0

請說明您的具體問題。 –

+0

想要從pdf中提取文本在ftp上..問題是當我寫PdfReader reader = new PdfReader(path)時,它會引發異常'file not found as file or resource' – Munavvar

+0

在問題中提供附加信息。 –

回答

2

PdfReader有一堆構造函數重載,但他們大多依靠RandomAccessSourceFactory將任何通過的內容轉換爲Stream格式。當您通過string時,如果它是checked如果它是磁盤上的文件,如果不是,則檢查它是否可以轉換爲Uri作爲file:/,http://https://鏈接之一。這是你的第一個失敗點,因爲這些檢查都沒有處理ftp協議,最終你會以local resource loader結束,這對你不起作用。

可以嘗試轉換您string一個明確Uri但實際上是行不通的,無論是:

//This won't work 
new PdfReader(new Uri(path)) 

,這將無法正常工作的原因是因爲iText tells .Net to use CredentialCache.DefaultCredentials加載遠程資源。然而,當概念在FTP世界中不存在。

長話短說,當使用FTP時,你會想自己下載文件。根據它們的大小,你需要將它們下載到磁盤或將它們下載到一個字節數組中。下面是後者的一個示例:

Byte[] bytes; 
if(path.StartsWith(@"ftp://")) { 
    var wc = WebRequest.Create(path); 
    using (var response = wc.GetResponse()) { 
     using (var responseStream = response.GetResponseStream()) { 
      bytes = iTextSharp.text.io.StreamUtil.InputStreamToArray(responseStream); 
     } 
    } 
} 

然後,可以通過在本地文件或字節數組PdfReader構造函數。

+0

謝謝@chirs哈斯..實際的問題是:我想從其他服務器提取PDF ..我不知道如何實現這一點。請在這方面給我建議。謝謝 – Munavvar

+1

我上面發佈的代碼將允許您通過FTP(HTTP(S)也可以從另一個服務器下載文件(PDF,無論))。這是第一步,與iText完全無關,它只是直接.Net。第二步是從第一步獲取字節數組,並將其傳遞給'PdfReader'構造函數而不是'path'。 –

相關問題