2013-05-11 1 views
2

У меня очень странная проблема с форматами XFA в iText/iTextSharp (iTextSharp 5.3.3 через NuGet). Я пытаюсь заполнить статическую форму XFA, но мои изменения не принимаются.Как установить данные XFA в статической форме XFA в iTextSharp и получить ее для сохранения?

У меня есть оба варианта iText в действии, и вы консультировались со вторым изданием, а также с примерами конверсий кода iTextSharp из книги.

Справочная информация. У меня есть форма XFA, которую я могу заполнить вручную, используя Adobe Acrobat на своем компьютере. Используя iTextSharp, я могу прочитать, что такое Xfa XML-данные и посмотреть структуру данных. Я по существу пытаюсь имитировать это с помощью iText.

Что данные выглядит, когда я добавить данные и сохранить в Acrobat (примечание: это только специальный раздел для наборов данных)

enter image description here

Вот XML-файл Я пытаюсь читать, чтобы заменить существующие данные (примечание: это весь контекст этого файла):

enter image description here

Однако, когда я прохожу путь к замене XML-файл и попытаться установить данные, созданный новый файл (копия оригинала с замененными данными) без каких-либо ошибок, но данные не обновляются. Я вижу, что новый файл создан, и я могу его открыть, но в файле нет данных.

Вот код используется в целях замены данных или заполнения в первый раз, что является разновидностью http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/book/iTextExamplesWeb/iTextExamplesWeb/iTextInAction2Ed/Chapter08/XfaMovie.cs

public void Generate(string sourceFilePath, string destinationtFilePath, string replacementXmlFilePath) 
    { 
     PdfReader pdfReader = new PdfReader(sourceFilePath); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (PdfStamper stamper = new PdfStamper(pdfReader, ms)) 
      { 
       XfaForm xfaForm = new XfaForm(pdfReader); 
       XmlDocument doc = new XmlDocument(); 
       doc.Load(replacementXmlFilePath); 
       xfaForm.DomDocument = doc; 
       xfaForm.Changed = true; 
       XfaForm.SetXfa(xfaForm, stamper.Reader, stamper.Writer); 
      } 

      var bytes = ms.ToArray(); 
      File.WriteAllBytes(destinationtFilePath, bytes); 
     } 
    } 

Любая помощь будет очень высоко ценится.

+0

Вы попробовали онлайн-демо? См. Http://demo.itextsupport.com/xfademo. Если эта демонстрация работает, что-то не так с вашим кодом; если это не так, в iText что-то не так. В последнем случае, пожалуйста, заполните форму обратной связи после запуска демонстрации. –

+0

Спасибо, Бруно. Я не пробовал эту демонстрацию, но теперь у меня есть. Когда я пытаюсь выполнить онлайн-демонстрацию и не сглаживаю XFA-файл (что желательно), поля обновляются в демо. – jon333

ответ

1

Я нашел проблему. Заменой DomDocument должен быть весь объединенный XML нового документа, а не только часть данных или наборов данных.

+0

Надеюсь, это поможет другим людям, если у вас будет такая же проблема. – jon333

2

Я поддержал ваш ответ, потому что это неверно (я рад, что моя ссылка на демонстрацию привела вас к другому взгляду на ваш код), но теперь, когда у меня есть второй взгляд на ваш исходный код, я думаю, что это лучше использовать book example:

public byte[] ManipulatePdf(String src, String xml) { 
    PdfReader reader = new PdfReader(src); 
    using (MemoryStream ms = new MemoryStream()) { 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) { 
     AcroFields form = stamper.AcroFields; 
     XfaForm xfa = form.Xfa; 
     xfa.FillXfaForm(XmlReader.Create(new StringReader(xml))); 
    } 
    return ms.ToArray(); 
    } 
} 

Как вы можете видеть, это не нужно, чтобы заменить весь РФ XML. Если вы используете метод FillXfaForm, данных достаточно.

Примечание: для примеров примеров C# см. http://tinyurl.com/iiacsCH08 (измените значение 08 на число от 01 до 16 для примеров других разделов).

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

  • Нет связанных вопросов^_^