iTextSharp异常:找不到PDF标头签名

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

我正在使用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标题签名。 StackTrace:在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)在C:\ Documents \ Visual Studio中

令人讨厌的是我不能总是重现错误。有时候它有效,有时则不然。有谁遇到过这个问题?

c# .net pdf itext
2个回答
17
投票

经过一些研究,我发现这个问题与PDF生成过程中文件被破坏有关,或与文档中不符合iTextSharp中实现的PDF标准的对象有关的错误。它似乎只有在您从磁盘中读取PDF文件时才会发生。

我还没有找到问题的完整解决方案,但只有一个解决方法。我所做的是使用PdfReader itextsharp对象读取PDF文档,并在正常操作中读取文件之前查看是否发生错误或异常。

所以运行与此类似的东西:

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

    PdfReader reader = null;

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

    return Ret;
}

1
投票

我发现这是因为我在文件末尾用PDF流位置调用new PdfReader(pdf)。通过将位置设置为零,它解决了问题。

之前:

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

后:

// Works correctly.
pdf.Position = Number.Zero;
var pdfReader = new PdfReader(pdf);
© www.soinside.com 2019 - 2024. All rights reserved.