我传递给该方法的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.发布于 2015-01-29 11:55:50
“任择议定书”最后评论说:
我预感到,在
PdfStamper调用Close并写入文件之前,页面对象可能永远不会被复制,因此,我用来读取额外页面模板的PdfReader导致了问题,因为在关闭PdfStamper之前,它会在我的方法结束时被释放。
他的直觉是正确的:至少复制原始页面的某些部分被推迟到PdfStamper关闭。这允许在同一个PdfReader实例的多个页面在单独调用中导入时进行某些优化。
从许多不同的PdfReaders导入的用例也引起了iText(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);
}
}https://stackoverflow.com/questions/28191429
复制相似问题