itextsharp document.close上的堆栈溢出异常

时间:2014-02-25 10:14:57

标签: c# pdf exception itext

我正在将多个PDF合并为一个文件。 这是我的代码:

string[] files = Directory.GetFiles(FolderName);
        using (FileStream fs = new FileStream(PdfOutputFile, FileMode.Create))
        {
            Document doc = new Document();
            PdfWriter writer = PdfWriter.GetInstance(doc, fs);
            doc.Open();
            foreach (string percorsoFile in files)
            {
                PdfContentByte cb = writer.DirectContent;
                PdfReader reader = new PdfReader(percorsoFile);
                int numpagine = reader.NumberOfPages - PageAddedByWord;
                for (int pagina = 1; pagina <= numpagine; pagina++)
                {
                    int rotazione = reader.GetPageSizeWithRotation(pagina).Rotation;
                    PdfImportedPage page = writer.GetImportedPage(reader, pagina);
                    doc.NewPage();
                    if (rotazione == 90 || rotazione == 270)
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pagina).Height);
                    else
                        cb.AddTemplate(page, 0f, 0f);
                }
                reader.Close();
            }
            doc.Close();
        }

我在doc.Close()行上遇到堆栈溢出异常,但我无法理解原因。我完成该文件后立即关闭每个读者。我只用大量的pdf(比如2000)得到这个例外。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

已解决,我使用PdfSmartCopy而不是pdfwriter。现在代码看起来像这样

 Document doc = new Document();
            PdfSmartCopy pdfCopy = new PdfSmartCopy(doc, ms);
            doc.Open();
            foreach (var percorsoFilePdf in files)
            {
                PdfReader reader = new PdfReader(percorsoFilePdf);
                int numpagine = reader.NumberOfPages;
                for (int I = 1; I <= numpagine-PageAddedByWord; I++)
                {
                    doc.SetPageSize(reader.GetPageSizeWithRotation(1));
                    PdfImportedPage page = pdfCopy.GetImportedPage(reader, I);
                    pdfCopy.AddPage(page);
                }
                //Clean up
                //pdfCopy.FreeReader(reader);
                reader.Close();
            }
            //Clean up
            doc.Close();
            SharedMethods.MemoryStreamToFile(ms, PdfOutputFile);

使用内存流而不是文件流要快得多,而且流程也不会“变大”。