2014-04-07 2 views
1

필자는 채워진 필드가있는 PDF 양식을 가지고 있습니다. 내가 acrofields를 읽으려고하면 그들은 비어 있습니다. 그러나 PDF에서는 값을 변경하고 저장할 수 있습니다.ItextSharp - Acrofields가 비어 있습니다.

private static string GetFormFieldNamesWithValues(PdfReader pdfReader) 
{ 
    return string.Join("\r\n", pdfReader.AcroFields.Fields 
            .Select(x => x.Key + "=" + 
            pdfReader.AcroFields.GetField(x.Key)) 
            .ToArray()); 
} 

var reader = new PdfReader((DataContext as PDFContext).Datei); 
AcroFields form = reader.AcroFields; 
txt.Text = GetFormFieldNamesWithValues(reader); 

필드를 읽는 방법?

+0

귀하의 코드 내 샘플 PDF에서 작동 : 여기 –

+0

내 PDF에서는 xfapresent가 false입니다. 그러나 다른 PDF에서 필드를 읽을 수있는 곳도 틀립니다. 어떻게하면 pdf를 추가 할 수 있습니까? –

+0

그래서 파일 업로드를 허용하지 않습니다. http://meta.stackexchange.com/q/4637 –

답변

1

분명히 PDF가 손상되었습니다. 필드는 페이지 레벨에서 위젯 주석으로 정의되지만 문서 루트 레벨에 설정된 /AcroForm 필드에서 참조되지 않습니다.

당신은 FixBrokenForm 코드 샘플을 사용하여 PDF를 해결할 수 :

PdfReader reader = new PdfReader(src); 
PdfDictionary root = reader.getCatalog(); 
PdfDictionary form = root.getAsDict(PdfName.ACROFORM); 
PdfArray fields = form.getAsArray(PdfName.FIELDS); 

PdfDictionary page; 
PdfArray annots; 
for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
    page = reader.getPageN(i); 
    annots = page.getAsArray(PdfName.ANNOTS); 
    for (int j = 0; j < annots.size(); j++) { 
     fields.add(annots.getAsIndirectObject(j)); 
    } 
} 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
stamper.close(); 
reader.close(); 

당신은 자신의 PDF 파일은 PDF 기준을 준수하지 않은 것으로 양식을 생산하는 데 사용 된 도구의 제작자을 알려야한다. 당신은 작동하지 않습니다 PDF를 제공 할 수

PdfReader reader = new PdfReader(src); 
     PdfDictionary root = reader.Catalog; 
     PdfDictionary form = root.GetAsDict(PdfName.ACROFORM); 
     PdfArray fields = form.GetAsArray(PdfName.FIELDS); 

     PdfDictionary page; 
     PdfArray annots; 
     for (int i = 1; i <= reader.NumberOfPages; i++) 
     { 
      page = reader.GetPageN(i); 
      annots = page.GetAsArray(PdfName.ANNOTS); 
      for (int j = 0; j < annots.Size; j++) 
      { 
       fields.Add(annots.GetAsIndirectObject(j)); 
      } 
     } 
     PdfStamper stamper = new PdfStamper(reader, new FileStream(dest, FileMode.Create)); 
     stamper.Close(); 
     reader.Close(); 
+0

감사합니다, Lowagie; PDF를 수정 한 후에 양식 값을 읽을 수 있습니다. 도구 개발자에게 알려 드리겠습니다. –

1

내 C#을 -code입니까? 또한 PDF 양식이이 속성을 검사하여 XFA를 사용하는지 확인할 수 있습니까? form.Xfa.XfaPresent
관련 문제