Вопрос по c#, itext, .net, pdf – Исключение iTextSharp: подпись заголовка PDF не найдена

13

Я используюiTextSharp читать содержимоеPDF документы:

  PdfReader reader = new PdfReader(pdfPath);

                using (StringWriter output = new StringWriter())
                {
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                        output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));

                    reader.Close();
                    pdfText = output.ToString();
                }

99% времени это работает просто отлично. Тем не менее, есть этотPDF файл, который иногда выдает это исключение:

PDF header signature not found. StackTrace: at iTextSharp.text.pdf.PRTokeniser.CheckPdfHeader() at iTextSharp.text.pdf.PdfReader.ReadPdf() at iTextSharp.text.pdf.PdfReader..ctor(String filename, Byte[] ownerPassword) at Reader.PDF.DownloadPdf(String url) in C:\Documents\Visual Studio

Что раздражает, так это то, что я не всегда могу воспроизвести ошибку. Иногда это работает, иногда это не так. Кто-нибудь сталкивался с этой проблемой?

Ваш Ответ

2   ответа
17

что эта проблема связана либо с повреждением файла во время генерации PDF, либо с ошибкой, связанной с объектом в документе, который не соответствует стандарту PDF, реализованному в iTextSharp. Похоже, что это происходит только при чтении файла PDF с диска.

Я не нашел полного решения проблемы, а нашел обходной путь. Что я сделал, так это прочитал PDF-документ с использованием объекта itextsharp PdfReader и выяснил, произошла ли ошибка или исключение перед чтением файла в нормальной работе.

Так работает что-то похожее на это:

private bool IsValidPdf(string filepath)
{
    bool Ret = true;

    PdfReader reader = null;

    try
    {
        reader = new PdfReader(filepath);
    }
    catch
    {
        Ret = false;
    }

    return Ret;
}
Этот ответ мне очень помог сегодня. Я рекомендую поставитьfinally блокировать с помощьюreader.Close() чтобы файлы не блокировались процессом Guilherme Batista
Это заняло у меня некоторое время, но я наконец понял, что файл действительно поврежден. Виновата в этом веб-сайт, создавший PDF, а не ошибка iTextSharp. Спасибо, что нашли время ответить на мой вопрос. broke
Я могу подтвердить, что это может произойти, если вы загружаете ридер как с диска, так и с диска JoshBerke
Выходит, я искал не тот файл в моем деле. Имя файла было связано с одним из ресурсов (изображений), которые я ранее использовал, то есть jpg - это не pdf, так что :), так что на самом деле это был поврежденный PDF (или вообще не один). Спасибо - вывели меня на правильный путь. Anthony Horne
0

new PdfReader(pdf) с положением потока PDF в конце файла. Установив позицию в ноль, он решил проблему.

До

// Throws: InvalidPdfException: PDF header signature not found.
var pdfReader = new PdfReader(pdf);

После

// Works correctly.
pdf.Position = Number.Zero;
var pdfReader = new PdfReader(pdf);

Похожие вопросы