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

C# 使用iText读取存储在图像列中的PDF文件,c#,itext,C#,Itext,我将pdf文件存储在sql server数据库的图像列中。我想将每个文件的内容读入我可以用来搜索string.Contains(“我正在寻找的内容”) 我有以下代码: if (conn.State != ConnectionState.Open) { conn.Open(); } SqlCommand cmd = new SqlCommand("Select top 10 pdfData from Repo

我将pdf文件存储在sql server数据库的图像列中。我想将每个文件的内容读入我可以用来搜索
string.Contains(“我正在寻找的内容”)

我有以下代码:

        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();

            }
        }

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

当pdf文件存储在图像列(即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");

当pdf文件存储在图像列(即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");

问题是由于文件正在压缩。不知何故,我错过了这个小玩意儿,但一旦我解压缩了数据,一切都很好

问题是由于文件被压缩。不知何故,我错过了这个小玩意儿,但一旦我解压缩了数据,一切都很好

您可能无法将PDF读入字符串,因为PDF允许任意二进制内容,而字符串不允许。此外,PDF不一定将字符串存储为ASCII或Unicode字符序列。@DourHighArch当我在本地文件上调用此方法时,它会将其转换为我可以搜索的字符串<代码>GetTextFromPage(fileFromDpPdfReader,page,strategy)您可能无法将PDF读入字符串,因为PDF允许任意二进制内容,而字符串不允许。此外,PDF不一定将字符串存储为ASCII或Unicode字符序列。@DourHighArch当我在本地文件上调用此方法时,它会将其转换为我可以搜索的字符串<代码>GetTextFromPage(fileFromDpPdfReader,page,strategy)