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

Posted

技术标签:

【中文标题】iTextSharp 异常:未找到 PDF 标头签名【英文标题】:iTextSharp exception: PDF header signature not found 【发布时间】: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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案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 块,以防止文件被进程锁定

以上是关于iTextSharp 异常:未找到 PDF 标头签名的主要内容,如果未能解决你的问题,请参考以下文章

Itextsharp:未调用OnEndPage事件

让PdfStamper使用MemoryStreams(c#,itextsharp)

.jpg 到 .pdf 转换 - iTextSharp.text.PageSize' 在 Windows Phone 8.1 中引发异常

样式未使用ITextSharp在PDF中实现[复制]

iTextSharp 正在生成损坏的 PDF

itextsharp去掉PDF加密