1

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

1 回答 1

1

OP最终评论说:

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

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

PdfReadersiText(Sharp) 开发人员还考虑了从许多不同的导入的用例。因此,他们提供了一种方法来告诉用户在用户确定他不会从中复制任何其他内容时复制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);
    }
}
于 2015-01-29T11:55:50.960 回答