iTextSharp给了我错误:“未找到PDF头签名”

本文关键字:PDF 未找到 错误 iTextSharp | 更新日期: 2023-09-27 18:06:38

我所读到的关于这个错误的一切都说文件必须在顶部缺少"%PDF-1.4"或类似的东西;但是,我的文件中包含了它。我不是PDF格式方面的专家,但我确实仔细检查了一下,我没有多个%%EOF或结尾标签,所以现在我不知道是什么导致我的PDF头签名不好。如果你想看的话,这里有一个文件的链接:格式差的PDF

这就是我正在做的。我以MemoryStream的形式获取PDF的每一页,所以我必须将每一页附加到前一页的末尾。为了做到这一点,我使用iTextSharp的PdfCopy类。下面是我使用的代码:

    /// <summary>
    /// Takes two PDF streams and appends the second onto the first.
    /// </summary>
    /// <param name="firstPdf">The PDF to which the other document will be appended.</param>
    /// <param name="secondPdf">The PDF to append.</param>
    /// <returns>A new stream with the second PDF appended to the first.</returns>
    public Stream ConcatenatePdfs(Stream firstPdf, Stream secondPdf)
    {
        // If either PDF is null, then return the other one
        if (firstPdf == null) return secondPdf;
        if (secondPdf == null) return firstPdf;
        var destStream = new MemoryStream();
        // Set the PDF copier up.
        using (var document = new Document())
        {
            using (var copy = new PdfCopy(document, destStream))
            {
                document.Open();
                copy.CloseStream = false;
                // Copy the first document
                using (var reader = new PdfReader(firstPdf))
                {
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        copy.AddPage(copy.GetImportedPage(reader, i));
                    }
                }
                // Copy the second document
                using (var reader = new PdfReader(secondPdf))
                {
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        copy.AddPage(copy.GetImportedPage(reader, i));
                    }
                }
            }
        }
        return destStream;
    }

每次收到一个新的PDF页面时,我将先前连接的页面(firstPdf)和新页面(secondPdf)一起传递给该函数。对于第一个页面,我没有任何先前连接的页面,因此firstPdf为空,从而导致返回secondPdf作为结果。第二次浏览时,第一页以firstPdf的形式传入,新的第二页以secondPdf的形式传入。连接工作得很好,结果实际上在上面链接的First.pdf文件中。

问题是当我去添加第三页。我使用前一遍的输出(前两页)作为第三遍的输入,并使用一个新的PDF流。当我尝试用先前连接的PDF页面初始化PdfReader时,会出现异常。

我发现特别有趣的是,它不能读取自己的输出。我觉得我一定是做错了什么,但我既不知道如何避免这个问题,也不知道为什么有一个问题的头;在我看来很正常。如果有人能告诉我我的代码有什么问题,或者至少是PDF文件有什么问题,我将非常感激。

iTextSharp给了我错误:“未找到PDF头签名”

(评论回答)

我强烈建议不要传递原始流本身,而是通过在MemoryStream上调用.ToArray()来传递字节数组。iTextSharp假定它有一个专门的空流用于写入,因为它不能"就地"编辑现有文件。虽然流本质上映射为字节,但它们也有固有的属性,如OpenClosedPosition,这可能会把事情搞砸。