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

本文关键字:提取 pdf 文件 服务器 itextsharp ftp 使用 | 更新日期: 2023-09-27 17:57:08

我正在从事文档管理项目,我想从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:''###'index'500199.pdf not found as file or resource.'

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

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

PdfReader有一堆构造函数重载,但它们中的大多数都依赖于RandomAccessSourceFactory将传入的任何内容转换为Stream格式。当您传递string时,将检查它是否是磁盘上的文件,如果不是,则检查它是否可以作为file:/http://https://链接之一转换为Uri。这是您的第一个故障点,因为这些检查都不处理 ftp 协议,并且您最终会使用不适合您的本地资源加载程序。

您可以尝试将string转换为显式Uri但这实际上也不起作用:

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

这不起作用的原因是因为iText告诉.Net在加载远程资源时使用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 构造函数。