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

bro*_*oke 13 .net c# pdf itext

我正在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();
                }
Run Code Online (Sandbox Code Playgroud)

99%的时间它运作得很好.但是,有一个PDF文件有时会抛出此异常:

找不到PDF标题签名.StackTrace:在iTextSharp.text.pdf.PRTokeniser.CheckPdfHeader()位于iTextSharp.text.pdf.PdfReader.ReadPdf(),位于Reader.PDF的iTextSharp.text.pdf.PdfReader..ctor(String filename,Byte [] ownerPassword) .DownloadPdf(String url)在C:\ Documents\Visual Studio中

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

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我花了一段时间,但我终于发现该文件确实已损坏.责任归咎于创建PDF的网站,而不是iTextSharp的错误.感谢您抽出宝贵时间回答我的问题. (4认同)
  • 我可以确认,如果你从蒸汽和磁盘加载读卡器会发生这种情况:) (2认同)

Ber*_*ern 17

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

前:

// Throws: InvalidPdfException: PDF header signature not found.
var pdfReader = new PdfReader(pdf);
Run Code Online (Sandbox Code Playgroud)

后:

// Works correctly.
pdf.Position = 0;
var pdfReader = new PdfReader(pdf);
Run Code Online (Sandbox Code Playgroud)