20

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.PdfReader.ReadPdf()

iTextSharp.text.pdf.PdfReader..ctor(String filename, Byte[]> ownerPassword) 在
Reader 的 iTextSharp.text.pdf.PRTokeniser.CheckPdfHeader()。 PDF.DownloadPdf(String url) 在

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

4

4 回答 4

24

经过一番研究,我发现此问题与生成 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;
}
于 2012-05-20T19:50:59.487 回答
19

我发现这是因为我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);
于 2019-02-27T15:08:51.803 回答
0

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

于 2020-06-23T01:31:10.267 回答
0

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

于 2021-12-02T12:24:06.620 回答