2013-06-24 3 views
1

Я пытаюсь сохранить PDF файл, сохранив данные из FDF в PDFTemplate, в моем WPF приложения.Написать FDF в PDF с помощью iTextsharp

Итак, ситуация такая. У меня есть PDFTemplate.pdf, который служит в качестве шаблона и имеет заполнители (или поля). Теперь я произвожу этот FDF файл про грамматический, что, в свою очередь, содержит все имена полей, необходимые для PDFTemplate для заполнения. Кроме того, этот FDF содержит путь к файлу для PDFTemaplte также, так что при открытии, он знает, какой PDF использовать.

Теперь, когда попытка и дважды щелкните на FDF, это открыть Adober Acrobat Reader и отображает PDFTemplate с данными заполненными. Но я не могу сохранить этот файл с помощью меню Файл, поскольку он говорит, что этот файл будет сохранен без данных.

Итак, я решил использовать iTextsharp, читать PDFTemaplate файл, читать FDF файл и получить данные оттуда, и создать еще один PDF файл и сохранить его вместе с данными.

Ниже приведен код, который я использую, но когда я открываю вновь сохраненный файл, он говорит, что файл поврежден и не может быть восстановлен:

using (MemoryStream pdfFlat = new MemoryStream()) 
    using (PdfReader pdfReader = new PdfReader(templateLocation)) 
    using(PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfFlat)) 
    using(FdfReader fdfReader = new FdfReader(fdfFileNameAndPath)) 
    { 
     AcroFields pdfForm = pdfStamper.AcroFields; 
     pdfForm.SetFields(fdfReader); 
     pdfStamper.FormFlattening = true; 
     pdfStamper.Writer.CloseStream = false; 

     using (FileStream saveStream = 
      new FileStream(
       outputFileNameAndPath, 
       FileMode.Create, 
       FileAccess.Write)) 
     { 
      pdfFlat.WriteTo(saveStream); 
      pdfFlat.Flush(); 
      saveStream.Close(); 
     } 

     fdfReader.Close(); 
     pdfStamper.Close(); 
     pdfReader.Close(); 
     pdfFlat.Close(); 
    } 

Я не уверен относительно того, что я Я делаю неправильно. Пожалуйста помоги.

+0

Поздно к вечеринке, но, по-моему, вам нужно только сбросить позицию MemoryStream до 0 до сброса в поток файлов. – zbarrier

ответ

1

я был в состоянии сделать это, не используя MemoryStream:

File.Copy(formLocation, outputFileNameAndPath, true); 

    using (FileStream pdfFlat = new FileStream(outputFileNameAndPath,FileMode.Open)) 
    using (PdfReader pdfReader = new PdfReader(formLocation)) 
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfFlat)) 
    using (FdfReader fdfReader = new FdfReader(fdfFileNameAndPath)) 
    { 
     AcroFields pdfForm = pdfStamper.AcroFields; 

     pdfForm.SetFields(fdfReader); 
     pdfStamper.FormFlattening = true; 
     pdfStamper.Writer.CloseStream = false; 

     fdfReader.Close(); 
     pdfStamper.Close(); 
     pdfReader.Close(); 
     pdfFlat.Close(); 
    } 

Я не уверен, но, когда я использовал MemoryStream, чтобы открыть файл, а затем сохранить его в другой FileStream, что-то не работает, не уверен что.

Но я попытался сделать это проще, и это сработало.

+0

Является ли это пригодным для файлов foto annot? –

+1

Что вы подразумеваете под файлами annot fdf? Файлы fdf - это только текстовые файлы. –

+0

сбор комментариев (который извлекается из одного pdf) и сохраняется как файлы fdf. Я пытаюсь импортировать этот файл fdf в новый pdf. (HTTP: //www.k2e.com/tech-update/tips/131-marking-up-and-add-comments-to-pdf-documents) –

0

Ниже приведен пример использования потока памяти вместо потока файлов. Я считаю, что вам нужно было только установить позицию потока памяти в 0. Я также получаю имя файла шаблона pdf из свойства fdf FileSpec, которое полезно, если у вас есть несколько возможных шаблонов.

+0

Можно ли импортировать аннотацию fdf в pdf? –