使用 itextsharp 在 ftp 服务器上提取 pdf 文件

Extract pdf file on ftp server using itextsharp

我正在从事文档管理项目,我想从 pdf 中提取文本。我怎样才能做到这一点。我正在使用 Itextsharp 在本地系统上提取 pdf

这是我为此目的使用的功能。路径是 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:\###\index0199.pdf not found as file or resource.'

[### 是我的 ftp 服务器]

PdfReader 有一堆构造函数重载,但其中大部分依赖于 RandomAccessSourceFactory to convert whatever is passed in into a Stream format. When you pass a string in it is checked if it is a file on disk and if not it is checked if it can be converted to a Uri as one of file:/, http:// or https:// link. This is your first point of failure because none of these checks handle the ftp protocol and you ultimately end up at a 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 构造函数。