Использование iText для чтения PDF-файла, хранящегося в столбце изображения - PullRequest
1 голос
/ 15 марта 2019

У меня есть файлы PDF, хранящиеся в столбце изображения в базе данных сервера SQL. Я хочу прочитать содержимое каждого файла во что-то (строка - это то, что я использую, но открыт для предложений), которую я могу использовать для поиска в 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 извлекается из базы данных.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Если 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");
0 голосов
/ 15 марта 2019

Проблема была связана со сжатием файла.Я как-то пропустил эту маленькую Дидди, но как только я распаковал данные, все хорошо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...