PdfStamper被处置

时间:2015-01-28 11:44:01

标签: c# pdf itextsharp idisposable pdfstamper

我传入此方法的PdfStamper正在处理方法的最后处理 - 为什么,以及如何阻止它?我正在尝试从模板创建一个页面对象,然后我可以将其添加到PdfStamper X中。

//real code
public void DoSpecialAction(PdfStamper pdfStamper)
{
    using (var pdfTemplate = new PdfReader(_extraPageTemplatePath))
    using (var pdfReader = new PdfReader(pdfTemplate))
    {
        PdfImportedPage page = pdfStamper.GetImportedPage(pdfReader, 1);
        pdfStamper.InsertPage(3, pdfReader.GetPageSize(1));
        PdfContentByte pb = pdfStamper.GetUnderContent(3);
        pb.AddTemplate(page, 0, 0);
    }
}

程序结构如下:

//psuedocode
class PrintFieldsToPdf {
    foreach (normalfield) {
        PrintNormalFields();
    }

    foreach (specialaction) {
        DoSpecialAction(pdfStamper);
    }

    pdfStamper.Close(); //at this point the object has been deallocated
}

抛出以下异常:

An exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll but was not handled in user code

Additional information: Cannot access a closed file.

1 个答案:

答案 0 :(得分:1)

OP最终评论说:

  

我有预感,在PdfStamper调用Close并写入文件之前,页面对象永远不会被实际复制,因此我正在使用的PdfReader读取额外的页面模板导致问题,因为在PdfStamper关闭之前,我的方法已经处理掉了。

他的预感是正确的:至少复制原始页面的某些部分会延迟到PdfStamper被关闭。如果在单独的调用中导入来自同一PdfReader实例的多个页面,则允许进行某些优化。

iText(夏普)开发人员也在考虑从许多不同PdfReaders进口的用例。因此,他们提供了一种方法,告诉PdfStamper在用户确定不会复制其他内容时,复制给定PdfReader所需的所有内容:

public void DoSpecialAction(PdfStamper pdfStamper)
{
    using (var pdfTemplate = new PdfReader(_extraPageTemplatePath))
    using (var pdfReader = new PdfReader(pdfTemplate))
    {
        PdfImportedPage page = pdfStamper.GetImportedPage(pdfReader, 1);
        pdfStamper.InsertPage(3, pdfReader.GetPageSize(1));
        PdfContentByte pb = pdfStamper.GetUnderContent(3);
        pb.AddTemplate(page, 0, 0);
        // Copy everything required from the PdfReader
        pdfStamper.Writer.FreeReader(pdfReader);
    }
}