iTextSharp给我错误:&“未找到PDF标头签名". [英] iTextSharp is giving me the error: "PDF header signature not found"

查看:98
本文介绍了iTextSharp给我错误:&“未找到PDF标头签名".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我所读到的关于此错误的所有信息都表明该文件的顶部必定缺少%PDF-1.4"或类似内容;但是,我的文件包含了它.我不是PDF格式专家,但是我仔细检查了我是否没有多个%% EOF或预告片标签,所以现在我对导致我的PDF标头签名损坏的原因不知所措.如果您要查看文件,请点击以下链接:格式不正确的PDF

Everything I have read about this error says the file must be missing a "%PDF-1.4" or something similar at the top; however, my file includes it. I am not an expert in PDF formatting, but I did double check that I don't have multiple %%EOF or trailer tags, so now I'm at a loss as to what is causing my PDF header signature to be bad. Here is a link to the file if you would like to look at it: Poorly formatted PDF

这就是我在做什么.我以MemoryStream的形式获取PDF的每一页,因此我必须将每一页附加到前几页的末尾.为此,我使用了iTextSharp的PdfCopy类.这是我正在使用的代码:

Here is what I'm doing. I am getting each page of the PDF in the form of a MemoryStream, so I have to append each page to the end of the previous pages. In order to do this, I am using iTextSharp's PdfCopy class. Here is the code I am using:

    /// <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为null,从而导致将secondPdf作为结果返回.第二次,第一页作为firstPdf传入,新的第二页作为secondPdf传入.串联工作正常,结果实际上在上面链接的First.pdf文件中.

Every time I receive a new PDF page, I pass the previously concatenated pages (firstPdf) along with the new page (secondPdf) to this function. For the first page, I don't have any previously concatenated pages, so firstPdf is null, thereby resulting in secondPdf being returned as the result. The second time I go through, the first page is passed in as firstPdf and the new second page is passed in as secondPdf. The concatenation works just fine and the results are actually in the First.pdf file linked above.

问题是当我去添加第三页时.我将前一遍的输出(前两页)与新的PDF流一起用作第三遍的输入.当我尝试使用先前连接的PDF页面初始化PdfReader时发生异常.

The problem is when I go to add a third page. I am using the output of the previous pass (the first two pages) as the input for the third pass, along with a new PDF stream. The exception occus when I try to initialize the PdfReader with the PDF previously concatenated pages.

我发现特别有趣的是它无法读取自己的输出.我觉得我一定做错了,但是我既无法弄清楚该如何避免该问题,也无法弄清楚该页眉为什么有问题.对我来说看起来很正常.如果有人可以告诉我我的代码有什么问题,或者至少是PDF文件有什么问题,我将不胜感激.

What I find particularly interesting is that it fails to read its own output. I feel like I must be doing something wrong, but I can neither figure out how to avoid the problem, nor why there is a problem with the header; it looks perfectly normal to me. If someone could show me either what I'm doing wrong with the my code or at least what is wrong with the PDF file, I would really appreciate it.

推荐答案

(评论留意)

我强烈建议不要将原始流本身传递过来,而是通过在MemoryStream上调用.ToArray()来传递字节数组. iTextSharp假定其中有一个专用的空流用于写入,因为它无法就地"编辑现有文件.尽管流本质上映射为字节,但它们也具有诸如OpenClosedPosition之类的固有属性,它们可能使事情变得混乱.

I strongly recommend not passing the raw streams themselves around and instead pass around a byte array by calling .ToArray() on your MemoryStream. iTextSharp assumes that is has a dedicated empty stream for writing to since it can't edit existing files "in-place". Although streams essentially map to bytes, they also have inherent properties like Open and Closed and Position that can mess things up.

这篇关于iTextSharp给我错误:&amp;“未找到PDF标头签名".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆