2013-05-11 1 views
2

iText/iTextSharp (iTextSharp 5.3.3 via NuGet)의 XFA Forms에 매우 이상한 문제가 있습니다. 정적 인 XFA 스타일의 양식을 작성하려고하지만 변경 사항이 적용되지 않습니다.iTextSharp의 고정 XFA 양식에서 XFA 데이터를 설정하고 저장하려면 어떻게해야합니까?

필자는 iText와 iTextSharp 코드 샘플의 두 번째 버전을 모두 컨설팅하고 있습니다.

배경 : 컴퓨터에서 Adobe Acrobat을 사용하여 수동으로 채울 수있는 XFA 양식이 있습니다. 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

정확하지 않으므로 답변을 upvoted했습니다 (데모에 대한 내 참조로 인해 코드를 다시 볼 수있게되어 기쁘게 생각합니다).하지만 이제 원래 코드를 다시 보았습니다. 당신이 볼 수 있듯이이 전체 XFA XML을 교체 할 필요는 없습니다,

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(); 
    } 
} 

: 더 book example를 사용합니다. FillXfaForm 방법을 사용하는 경우 데이터로 충분합니다.

참고 : C# 버전의 예제는 http://tinyurl.com/iiacsCH08 (다른 장의 예는 08에서 01에서 16으로 변경)을 참조하십시오.

관련 문제