该文档没有目录对象(意思是:它是无效的PDF)

时间:2018-04-24 08:28:29

标签: c# itext

我正在阅读和写入相同的PDF同时我收到错误“文档没有目录对象(意思是:它是无效的PDF)”这一行“PdfReader pdfReader = new PdfReader(inputPdf2);”在下面的代码段中。

       iTextSharp.text.pdf.PdfCopy pdfCopy = null;
        Document finalPDF = new Document();
         //pdfReader = null;
        FileStream fileStream = null;
        int pageCount = 1;
        int TotalPages = 20;
        try
        {
            fileStream = new FileStream(finalPDFFile, FileMode.OpenOrCreate, FileAccess.Write);
            pdfCopy = new PdfCopy(finalPDF, fileStream);
            finalPDF.Open();              
                foreach (string inputPdf1 in inputPDFFiles)
                {
                    if (File.Exists(inputPdf1))
                    {
                        var bytes = File.ReadAllBytes(inputPdf1);
                        PdfReader pdfReader = new PdfReader(bytes);
                        fileStream = new FileStream(inputPdf1, FileMode.Open, FileAccess.Write);
                        var stamper = new PdfStamper(pdfReader, fileStream);
                        var acroFields = stamper.AcroFields;

                            stamper.AcroFields.SetField(acrofiled.Key, "Page " + 1+ " of " + 16);

                        stamper.FormFlattening = true;
                        stamper.Close();
                        stamper.Dispose();
                        fileStream.Close();
                        fileStream.Dispose();
                        pdfReader.Close();
                        pdfReader.Dispose();
                    }
                }

            foreach (string inputPdf2 in inputPDFFiles)
            {
                if (File.Exists(inputPdf2))
                {                        
                    PdfReader pdfReader = new PdfReader(inputPdf2);
                    int pageNumbers = pdfReader.NumberOfPages;
                    for (int pages = 1; pages <= pageNumbers; pages++)
                    {
                        PdfImportedPage page = pdfCopy.GetImportedPage(pdfReader, pages);
                        PdfCopy.PageStamp pageStamp = pdfCopy.CreatePageStamp(page);
                        pdfCopy.AddPage(page);
                    }
                    pdfReader.Close();
                    pdfReader.Dispose();
                }
            }
            pdfCopy.Close();
            pdfCopy.Dispose();
            finalPDF.Close();
            finalPDF.Dispose();
            fileStream.Close();
            fileStream.Dispose(); 

请帮助我解决问题或给我任何替代方法

1 个答案:

答案 0 :(得分:1)

在第一个循环中,使用如下操作版本覆盖每个文件:

var bytes = File.ReadAllBytes(inputPdf1);
PdfReader pdfReader = new PdfReader(bytes);
fileStream = new FileStream(inputPdf1, FileMode.Open, FileAccess.Write);
var stamper = new PdfStamper(pdfReader, fileStream);
[...]

在此处使用FileMode.Open是一个错误。您想要用新的文件替换现有文件,对于这样的用例,您必须使用FileMode.Create或{ {1}}。

使用FileMode.Truncate会导致原始文件内容保留在那里并写入其中。因此,如果您的新文件内容比原始文件内容短(在展平表单时可能会发生),则新文件会保留原始文件的尾部段。在PDF中,最后有相关的查找信息,因此在阅读这个新文件后,FileMode.Open会找到旧文件的查找信息,而这些信息根本不会与新内容相匹配。

顺便说一句,您可以像这样创建PdfReader

PdfCopy

出于同样的原因,这是错误的:如果那里已有PDF,fileStream = new FileStream(finalPDFFile, FileMode.OpenOrCreate, FileAccess.Write); pdfCopy = new PdfCopy(finalPDF, fileStream); 就像FileMode.OpenOrCreate一样,具有上述不良影响。

因此,您应该使用FileMode.Open替换您写入的流的FileMode值。