2016-07-15 86 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'。 –

相关问题