2014-02-10 2 views
0

У меня есть xml и отображение в поле формы pdf с помощью iTextsharp. Он работает хорошо для одной записи. Но при наличии нескольких записей он не добавляет 2-ю запись в выходной файл pdf. Вот кодКак добавить новую страницу в pdf для нескольких записей iTextsharp

public static void GeneratePdf(string sin, List<XElement> elements) 
     { 
      var pdfTemplate = HttpContext.Current.Server.MapPath("~/input.pdf"); 

      var newFile = HttpContext.Current.Server.MapPath("~/output.pdf"); 

      var pdfReader = new PdfReader(pdfTemplate); 
      var pdfStamper = new PdfStamper(pdfReader, new FileStream(
       newFile, FileMode.Create)); 

      foreach (var element in elements) 
      { 
       foreach (var elem in elements.Elements()) 
       { 
        pdfStamper.AcroFields.SetField(elem.Name.ToString(), (string)elem); 
       } 
      } 

      pdfStamper.FormFlattening = false; 
      pdfStamper.Close(); 
     } 

ответ

0

Ваш вопрос непонятен, потому что вы ничего нам не рассказываете о характере вашей формы.

ЕСЛИ ВЫ ФОРМУ НА ОСНОВАНИИ AcroForm ТЕХНОЛОГИИ

Пожалуйста, обратите внимание на этом видео-учебник: http://itextpdf.com/codenvy_webapp

Вы можете найти примеры, используемые в данном руководстве здесь: https://github.com/blowagie/itextsamples

Вы также можете найти отдельные примеры здесь: http://itextpdf.com/sandbox/acroforms/reporting

Обратите внимание, что есть пример «КАК НЕ СДЕЛАТЬ ЭТО». Убедитесь, что вы используете правильный пример: FillFlattenMerge2

Document document = new Document(); 
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest)); 
document.open(); 
ByteArrayOutputStream baos; 
PdfReader reader; 
PdfStamper stamper; 
AcroFields fields; 
while (myApp.hasMoreRecords()) { 
    baos = new ByteArrayOutputStream(); 
    reader = new PdfReader(SRC); 
    stamper = new PdfStamper(reader, baos); 
    fields = stamper.getAcroFields(); 
    myApp.processNextRecord(fields); 
    stamper.setFormFlattening(true); 
    stamper.close(); 
    reader.close(); 
    // add the PDF to PdfCopy 
    reader = new PdfReader(baos.toByteArray()); 
    copy.addDocument(reader); 
    reader.close(); 
} 
document.close(); 

Обратите внимание, что myApp является экземпляром пользовательского класса можно было бы написать, чтобы перебрать в наборе записей. Вы должны реализовать метод hasMoreRecords() и processNextRecord(), чтобы перебирать записи и обрабатывать их один за другим.

Если форма НА ОСНОВЕ XML ФОРМЫ АРХИТЕКТУРА

В этом случае, вы используете неправильные методы. Вы не можете заполнить динамическую форму, используя метод setField(). Тот факт, что он работает для одной записи, является признаком того, что ваша форма представляет собой либо AcroForm, либо гибридную форму XFA. В обоих случаях вы не можете достичь того, чего хотите, не меняя форму в чистую, динамичную форму XFA.

Как только у вас есть чистый, динамичный вид РФА, вам нужно использовать этот код:

PdfReader reader = new PdfReader(src); 
PdfStamper stamper = new PdfStamper(reader, 
     new FileOutputStream(dest)); 
AcroFields form = stamper.getAcroFields(); 
XfaForm xfa = form.getXfa(); 
xfa.fillXfaForm(new FileInputStream(xml)); 
stamper.close(); 
reader.close(); 

повторяет: этот фрагмент код будет работать только если у вас есть правильная форма. Элементы вашего вопроса указывают на то, что это не так. Если ваша форма не является динамической формой XFA, вы не найдете никакого программного обеспечения, которое может достичь того, чего вы хотите !!!

смотреть эти фильмы для получения дополнительной информации: http://itextpdf.com/product/xfa_worker

+0

спасибо за ссылочный пример. На самом деле, у меня есть pdf, который содержит форму. Я могу сопоставить xml с полем формы для одной записи. Теперь, если у меня есть несколько записей, я хочу повторить эту форму для следующей записи. Я пробовал приведенный выше фрагмент, но получаю исключение, когда он пытался добавить новый документ copy.addDocument (reader); Любое предложение? – user2866746

+0

Это невозможно при использовании AcroForms. Вам нужна форма XFA. У вас есть форма XFA? Это непонятно, потому что вы используете код для заполнения AcroForm. Вы знаете разницу между AcroForms и формами XFA? –

+0

Нет, я не знаю разницы между ними. Я могу поделиться с вами, если хотите. – user2866746

Смежные вопросы