如果不配置Document和PdfWriter,则无法配置PdfReader

时间:2019-01-09 11:54:38

标签: c# itext

要制作由许多PDF的第一页组成的PDF,请使用以下代码:

using (FileStream fs = new FileStream(Path.Combine(pathPorducedPDFs, "function1.pdf"), FileMode.Create))
using (Document document = new Document(PageSize.A2))
using (PdfWriter writer = PdfWriter.GetInstance(document, fs))
{
    document.Open();

    PdfContentByte cb = writer.DirectContent;

    foreach (string pdfPath in Directory.GetFiles(pathOriginalPDFs).OrderBy(x => x).ToList())
    {
        using (PdfReader reader = new PdfReader(pdfPath))
        {
            PdfImportedPage page = writer.GetImportedPage(reader, 1);
            document.NewPage();
            cb.AddTemplate(page, 0, 0);
            document.Add(new Paragraph(pdfPath));
        }
    }

    document.Close();
    writer.Close();
    fs.Close();
}

但是看起来,处置PdfReader也会使Document和Writer也处置。

实际上,第document.Close();行引发了异常:

  

System.ObjectDisposedException

为什么会这样?


通过不处理PdfReader,可以避免该错误,但是从我的角度来看,这样做是错误的,而这个问题是要了解为什么会发生这种情况!


感谢@mkl的解决方案:

using (FileStream fs = new FileStream(Path.Combine(pathPorducedPDFs, "function1.pdf"), FileMode.Create))
using (Document document = new Document(PageSize.A2))
using (PdfWriter writer = PdfWriter.GetInstance(document, fs))
{
    document.Open();

    PdfContentByte cb = writer.DirectContent;

    foreach (string pdfPath in Directory.GetFiles(pathOriginalPDFs).OrderBy(x => x).ToList())
    {
        using (PdfReader reader = new PdfReader(pdfPath))
        {
            PdfImportedPage page = writer.GetImportedPage(reader, 1);
            document.NewPage();
            cb.AddTemplate(page, 0, 0);
            document.Add(new Paragraph(pdfPath));
            writer.FreeReader(reader);
        }
    }

    document.Close();
    writer.Close();
    fs.Close();
}

1 个答案:

答案 0 :(得分:2)

使用

writer.FreeReader(reader);

reader的{​​{1}}块的右括号之前。

从阅读器导入页面后,using会跟踪该阅读器,但实际上尚未将所有数据从该页面复制到目标文档。仅在PdfWriter调用期间或关闭时,复制完成并释放到该阅读器的链接。

当从同一源文档的多个页面复制页面内容时,这使iText不必不必要地复制资源。