我传入此方法的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.
答案 0 :(得分:1)
我有预感,在
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);
}
}