2017-07-13 31 views
0

Okだから、C#を使用してXFA PDFをプログラムで記入する必要があります。 PDFのXML構造を正常に抽出できました。しかし、私はAcroFields.Xfa.FillXfaForm(sourceXML)呼び出しを使用して問題に取り掛かりました。iTextでXFA PDFを編集する(ノード内のフィールドのみを編集する)

私はENTIRE XMLツリーをとり、XML内のフィールドを編集してから、新しいXMLでフォームフィールドを編集しようとしています。私はすべてのAcroFormフィールドを削除し、新しい入力を追加しなくて済むようになります。しかし、この編集されたPDFを解析してXMLツリーを抽出すると、編集内容が保存されていることがわかります。

この特定のXFA PDFのセキュリティ設定では、フォームフィールドを編集することができますが、PdfReader.unethicalreading = trueを使用することを余儀なくされています。私の現在の設定で(これはフォームフィールドが削除されていると思われる理由です)。私は、XFA PDFが自分のXML編集を文書そのもののフォーマットに合わせて編集していると考えています。ここで

は、これまでの私のコードです:

名前空間ConsoleApplication2 { クラスプログラム {

static void Main(string[] args) 
    { 
     System.IO.StreamWriter file = new System.IO.StreamWriter(@"E:\XMLOutPut\outPutTest.xml"); 
     file.WriteLine(ReadFileNames()); 
     file.Close(); 

     using (FileStream existingPdf = new FileStream(@"E:\ORIGINAL.pdf", FileMode.Open)) 
     { 
      using (PdfReader pdfReader = new PdfReader(existingPdf)) 
      { 
       using (FileStream sourceXML = new FileStream(@"E:\XMLOutPut\outPutTest.xml", FileMode.Open)) 
       { 
        using (FileStream targetPdf = new FileStream(@"E:\ORIGINAL.pdf", FileMode.Open)) 
        { 
         PdfReader.unethicalreading = true; 
         PdfStamper stamper = new PdfStamper(pdfReader, targetPdf,'\0', true); 
         stamper.AcroFields.Xfa.FillXfaForm(sourceXML); 
         stamper.Close(); 
        } 
       } 
      } 
     } 
    } 

    public static string ReadFileNames() 
    { 

     string SRC = @"E:\ORIGINAL.pdf"; 
     using (PdfReader reader = new PdfReader(SRC)) 
     { 
      return ReadXFA(reader); 
     } 
    } 

    public static string ReadXFA(PdfReader reader) 
    { 
     XfaForm xfa = new XfaForm(reader); 
     XmlDocument document = xfa.DomDocument; 
     reader.Close(); 

     if (!string.IsNullOrEmpty(document.DocumentElement.NamespaceURI)) 
     { 
      document.DocumentElement.SetAttribute("xmlns", ""); 
      XmlDocument newDoc = new XmlDocument(); 
      newDoc.LoadXml(document.OuterXml); 
      document = newDoc; 
     } 

     var sb = new StringBuilder(4000); 
     var Xsettings = new XmlWriterSettings() { Indent = true }; 
     using (var wrtier = XmlWriter.Create(sb, Xsettings)) 
     { 
      document.WriteTo(wrtier); 
     } 
     return sb.ToString(); 
    } 
} 

}

私は何とかXMLを反復処理する必要があることを信じるように始めていますしかし、私が編集したいと思う多くのフィールドを引き出し、そのようにしますか?

ご協力いただければ幸いです。

大切にしてください。

答えて

0
static void Main(string[] args) 
    { 
     using (FileStream existingPdf = new FileStream(SRC, FileMode.Open)) 
     using (PdfReader pdfReader = new PdfReader(existingPdf)) 
     using (FileStream targetPdf = new FileStream(Target, FileMode.Create)) 
     { 
      PdfReader.unethicalreading = true; 
      using (PdfStamper stamper = new PdfStamper(pdfReader, targetPdf, '\0', true)) 
      { 
       XfaForm form = new XfaForm(pdfReader); 
       XDocument xdoc = form.DomDocument.ToXDocument(); 
       var nodeElements = from nodeElement in xdoc.Descendants("form1").Descendants("A1") 
            select nodeElement; 
       foreach (XElement singleNodeElement in nodeElements) 
       { 
        if (singleNodeElement.Name == "A1") 
        { 
         singleNodeElement.Value = "LOLGG"; 
        } 
       } 
       XmlDocument xmlDoc = xdoc.ToXmlDocument(); 
       XmlNamespaceManager namespaces = new XmlNamespaceManager(xmlDoc.NameTable); 
       namespaces.AddNamespace("xfa", "http://www.xfa.org/schema/xfa-data/1.0/"); 
       XmlNode baseNode = xmlDoc.SelectSingleNode("//xfa:datasets", namespaces); 
       stamper.AcroFields.Xfa.FillXfaForm(baseNode); 
      } 
     } 

    } 
} 
public static class DocumentExtensions 
{ 
    public static XmlDocument ToXmlDocument(this XDocument xDocument) 
    { 
     var xmlDocument = new XmlDocument(); 
     using (var xmlReader = xDocument.CreateReader()) 
     { 
      xmlDocument.Load(xmlReader); 
     } 
     return xmlDocument; 
    } 

    public static XDocument ToXDocument(this XmlDocument xmlDocument) 
    { 
     using (var nodeReader = new XmlNodeReader(xmlDocument)) 
     { 
      nodeReader.MoveToContent(); 
      return XDocument.Load(nodeReader); 
     } 
    } 
} 

これはLinqとXml.Linqに加えてiTextでも可能ですので、上のコード例に示すように、これを行うことができます。

これを可能にするために、XMLDocumentを取得してXDocumentに変換し、Linqを使用してノードを走査しなければなりませんでした。いったん正しいノードを取得できたら、プレフィックスを正しく識別するための名前空間を追加する必要がありました。 iTextのFillXfaFormを使用するには、XDocフォーマットをXMLDocフォーマットに戻す必要がありました。

3

現在のところ、iTextを使用することはできません。ファイルからXFAを抽出する必要があります(iTextを使用してこれを行うことができます)。次に、XFA構造体を走査して別のツールを使用して編集を行い、XFAをPDF、iTextを使って行うことができます。

関連する問題