2013-11-23 4 views
2

Я использую itext sharp для заполнения полей формы на моем шаблоне со значениями.Itext Sharp Merge Pdfs с acrofields

Я создал шаблон, используя pdfescape.com

Вот мой код, который я использую, чтобы поместить значения в шаблоне PDF.

private static byte[] GeneratePdf(Dictionary<String, String> formKeys, String pdfPath) 
    { 
     var templatePath = System.Web.HttpContext.Current.Server.MapPath(pdfPath); 
     var reader = new PdfReader(templatePath); 
     var outStream = new MemoryStream(); 
     var stamper = new PdfStamper(reader, outStream); 

     var form = stamper.AcroFields; 
     var fieldKeys = form.Fields.Keys; 

     // "Flatten" the form so it wont be editable/usable anymore 
     // stamper.FormFlattening = true; 

     foreach (KeyValuePair<String, String> pair in formKeys) 
     { 
      if (fieldKeys.Any(f => f == pair.Key)) 
      { 
       form.SetField(pair.Key, pair.Value); 
       form.SetFieldProperty(pair.Key, "setfflags", PdfFormField.FF_READ_ONLY, null); 
      } 
     } 
     stamper.Close(); 
     reader.Close(); 

     return outStream.ToArray(); 
    } 

я впервые использовал stamper.FormFlattening = верно, но тогда значения не были видны. Поэтому вместо использования сглаживания формы я просто устанавливаю значения как готовые, и все работает нормально.

Теперь я хочу, чтобы объединить несколько из этих PDF-файлов с помощью the pdf merger by smart-soft

После завершения слияния значения не видно. Когда я выделяю форму, она выделяет весь текст, но я не могу его прочитать. Я исследовал это и читал, что поля должны быть сплющены.

Вот изображение того, как он выглядит на PDF, когда я выделить все: Image of pdf highlighted Text

Я не знаю, почему мои поля не видны, когда они сглажены, даже если я не использую Слияние. Что-то не так с кодом или шаблоном? Также будут оценены альтернативы.

Btw мой проект является проектом asp-mvc, если это актуально.

EDIT

Я добавил следующий код, чтобы я сначала прочитал шаблон, записать значения в поля формы, закрыть его, открыть его, расплющить, а затем закрыть его снова, как предложил один комментариев. Я просто передать результат я получаю от функции GeneratePdf этой функции:

private static byte[] flattenPdf(byte[] pdf) 
    { 
     var reader = new PdfReader(pdf); 

     var outStream = new MemoryStream(); 
     var stamper = new PdfStamper(reader, outStream); 

     stamper.FormFlattening = true; 

     stamper.Close(); 
     reader.Close(); 

     return outStream.ToArray(); 
    } 

Я до сих пор получить тот же результат

+0

* Теперь я хочу объединить несколько этих pdf-файлов, используя [слияние PDF-файлов с помощью smart-soft] (http://www.codeproject.com/Articles/28283/Simple-NET-PDF-Merger) * - Этот код отбрасывает все элементы формы. Лучше использовать iTextSharp для слияния образцов с помощью iText. – mkl

+0

* Я не знаю, почему мои поля не видны, когда они сплющены, даже если я не использую слияние. * - заполнять и сглаживать заполнение в отдельных проходах, т.е. сначала читать, заполнять элементы формы, писать, читать снова, сгладить, написать. – mkl

+0

@mkl, спасибо, я дам, что попытаюсь посмотреть, работает ли он –

ответ

4

Я нашел решение этой проблемы благодаря this answer by rhens

Все, что я должен был сделать, это изменить свою функцию GeneratePdf, добавив одну строку:

form.GenerateAppearances = true; 

Вот конечный результат:

private static byte[] GeneratePdf(Dictionary<String, String> formKeys, String pdfPath) 
    { 
     var templatePath = System.Web.HttpContext.Current.Server.MapPath(pdfPath); 
     var reader = new PdfReader(templatePath); 
     var outStream = new MemoryStream(); 
     var stamper = new PdfStamper(reader, outStream); 

     var form = stamper.AcroFields; 
     form.GenerateAppearances = true; //Added this line, fixed my problem 
     var fieldKeys = form.Fields.Keys; 

     foreach (KeyValuePair<String, String> pair in formKeys) 
     { 
      if (fieldKeys.Any(f => f == pair.Key)) 
      { 
       form.SetField(pair.Key, pair.Value); 
      } 
     } 
     stamper.Close(); 
     reader.Close(); 

     return flattenPdf(outStream.ToArray()); 
    } 

и flattenPdf остается таким же, как в моем вопросе.

+0

Хорошо. Таким образом, это был один из этих файлов '/ NeedAppearances true'. Ну что ж. – mkl

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