【问题标题】:iTextSharp exception: PDF header signature not foundiTextSharp 异常:未找到 PDF 标头签名
【发布时间】:2012-05-24 05:11:21
【问题描述】:

我正在使用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() 在
iTextSharp.text.pdf.PdfReader.ReadPdf() 在
iTextSharp.text.pdf.PdfReader..ctor(String filename, Byte[]> ownerPassword) at
Reader.PDF.DownloadPdf(String url) in

烦人的是我不能总是重现错误。有时有效,有时无效。有人遇到过这个问题吗?

【问题讨论】:

    标签: c# .net pdf itext


    【解决方案1】:

    您可能正在使用其他方法或程序打开文件,就像我的情况一样。验证您的文件没有任何工作,您还可以使用资源监视器来验证哪些进程正在处理您的文件。

    【讨论】:

    【解决方案2】:

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

    之前:

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

    之后:

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

    【讨论】:

      【解决方案3】:

      就我而言,这是因为我正在调用一个 .json 文件,而 iTextSharp 显然只接受 pdf 文件。

      【讨论】:

        【解决方案4】:

        经过一些研究,我发现此问题与生成 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;
        }
        

        【讨论】:

        • 我花了一段时间,但我终于发现文件确实已损坏。责任归咎于创建 PDF 的网站,而不是 iTextSharp 的错误。感谢您花时间回答我的问题。
        • 我可以确认,如果您从 Steam 和磁盘加载阅读器,就会发生这种情况:)
        • 原来我在查看错误的文件。文件名指的是我之前使用的资产(图像)之一,即 jpg 不是 pdf,doh :),因此它实际上是损坏的 PDF(或根本不是 PDF)。谢谢 - 让我走上了正确的道路。
        • 这个答案今天对我帮助很大。我建议使用reader.Close() 放置一个finally 块,以防止文件被进程锁定
        猜你喜欢
        • 2014-07-25
        • 2012-09-03
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多