C# 正在处理PdfStamper
我传递给这个方法的PdfStamper将在方法的末尾被处理-为什么,如何停止它?我正在尝试从模板创建一个页面对象,然后可以多次将其添加到PdfStamper XC# 正在处理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
//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()。这是在对象不存在的基础上抛出异常。我在这一点上达到了顶点,它的所有成员都是空的