C# 正在处理PdfStamper

C# 正在处理PdfStamper,c#,pdf,itextsharp,idisposable,pdfstamper,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 PdfRe

我传递给这个方法的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.

OP最终评论道:

我有一种预感,在
PdfStamper
调用
Close
并写入文件之前,页面对象可能永远不会被复制,因此我用来读取额外页面模板的
PdfReader
会导致问题,因为它在我的方法结束时被处理,在
PdfStamper
关闭之前

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

iText(Sharp)开发人员还考虑了从许多不同的
PDF阅读器导入的用例。因此,他们提供了一种方法,让
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);
    }
}

你能提供一份清单吗?还可以定义“已处置”。这是个很奇怪的词。您的意思是它变为
null
?那么
pdfTemplate
实例是关于什么的呢?为什么要创建两个不同的
PdfReader
实例?你的代码看起来很笨拙。如果您想多次添加同一页面,您的方法将导致一个臃肿的文件,并且重复使用相同的字节。使用基本逻辑,您应该能够重复使用表单XObject多次添加同一页面。PdfStamper来自此方法之外。它包含在一个类中,该类一般用字段填充表单。它不在乎那些字段是什么。此特定方法是类的一部分,该类为各种类型的表单提供额外的特殊操作。为了保持填充器不关心填充的表单类型的能力,它有一个字段字典,用于触发特殊操作和被触发的特殊操作。此特殊操作将添加一个额外页面来处理来自特定字段的文本溢出。您可以更具体地说,而不仅仅是说它正在被“处置”吗?
IDisposable
契约只强制调用名为
Dispose
的方法,而不强制调用它实际执行的操作。相反,您是否得到了一个关于封闭流的异常?而且,我并没有编写所有这些代码。使用语句是由其他人编写的。我没有改变他们,因为我认为他们这样做是有原因的。当该方法退出时,调用方法将调用PdfStamper.Close()。这是在对象不存在的基础上抛出异常。我在这一点上达到了顶点,它的所有成员都是空的