使用iText读取存储在图像列中的PDF文件

问题描述 投票:1回答:2

我有pdf文件存储在sql server数据库的image列中。我想把每个文件的内容读成一些东西(字符串是我正在使用的,但可以接受建议),我可以用来搜索string.Contains("what I am looking for")

我有以下代码:

        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        SqlCommand cmd = new SqlCommand("Select top 10 pdfData from Reports_Converted with (nolock)");
        cmd.Connection = conn;

        using (SqlDataReader sdr = cmd.ExecuteReader())
        {
            if (sdr.Read())
            {
                byte[] fileData = (byte[])sdr.GetValue(0);
                iTextPDF.PdfReader fileFromDpPdfReader = new iTextPDF.PdfReader(fileData);

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

                    currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8,
                        Encoding.Default.GetBytes(currentText)));

                    pdfTextFromDatabase.Append(currentText);

                }

                finalTextResultFromDatabase = pdfTextFromDatabase.ToString();

            }
        }

另外一点,我有类似的代码,我可以直接从笔记本电脑上的文件夹中读取文件。只有在从数据库中检索时才会出现问题。

我看到的错误是这行代码中的iTextSharp.text.exceptions.InvalidPdfException: 'PDF header signature not found.'

iTextPDF.PdfReader fileFromDpPdfReader = new iTextPDF.PdfReader(fileData);

我到目前为止在堆栈上找到的答案处理的是物理文件,而不是从数据库中提取pdf的情况。

c# itext
2个回答
1
投票

当pdf文件存储在Image列(SQL_LONGVARBINARY)中时,数据格式已经更改。因此,当有人读回它们时,在验证预期的文件格式时,很有可能出现故障。

可能是,处理这种情况的另一种方法是,首先创建一个所需格式的临时文件,然后读取该临时文件。

byte[] fileData = (byte[])sdr.GetValue(0);
FileStream fs = new FileStream(@"C:\Users\XXXXXX\AppData\Local\Temp\temp.pdf", FileMode.Create);
fs.Write(fileData , 0, fileData.Length);
fs.Close();

iTextPDF.PdfReader fileFromDpPdfReader = new iTextPDF.PdfReader(@"C:\Users\XXXXXX\AppData\Local\Temp\temp.pdf");

0
投票

问题是由于文件被压缩。我不知怎的错过了这个小伙伴,但是一旦我解压缩数据,一切都很好!

© www.soinside.com 2019 - 2024. All rights reserved.