2015-01-28 4 views
1

PdfStamper Я перехожу к этому методу, который удаляется в конце метода - почему и как его остановить? Я пытаюсь создать объект страницы из шаблона, который я могу добавить в число PdfStamper X раз.PdfStamper размещается

//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

Можете ли вы предоставить [краткое, самодостаточно, компилируемый, пример] (http://sscce.org/)? – mkl

+0

Также укажите «disposed». Это очень странное слово. Вы имеете в виду, что он становится «нулевым»? И что такое экземпляр 'pdfTemplate'? Почему вы создаете два разных экземпляра 'PdfReader'? Ваш код выглядит неловко. Если вы хотите добавить * одну и ту же страницу * несколько раз, ваш подход приведет к раздутому файлу с теми же байтами, которые повторяются снова и снова. Используя элементарную логику, вы должны иметь возможность добавлять одну и ту же страницу несколько раз * повторно использовать * форму XObject. –

+0

PdfStamper поступает извне этого метода. Он заключен в класс, который в общем случае заполняет форму полями. Им все равно, что это за поля. Этот конкретный метод является частью класса, который обеспечивает дополнительные специальные действия для форм разных типов. Чтобы сохранить способность популяризации не заботиться о том, какую форму она заполняет, у нее есть словарь полей, который будет вызывать специальные действия и специальные действия, которые запускаются. Это специальное действие добавит дополнительную страницу для обработки переполнения текста из определенного поля. – Mark

ответ

1

ОП в конечном счете, отметил:

У меня есть подозрение, что может что объект страницы никогда не получает pied до 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); 
    } 
}