2013-09-12 4 views
0

Я, наконец, успешно понял, как заполнить PDF форму XFA своими пользовательскими данными, используя iTextSharp.Форма PDF XFA только для чтения с iTextSharp

Проблема в том, что я потерял код, который у меня был, что позволило мне сделать XFA только для чтения. Я сделал ужасную ошибку, изменив свой код, прежде чем переносить рабочую версию в исходный элемент управления. А теперь, после поиска Google, как за час я до сих пор не могу найти :(Если кто-то может напомнить мне о коде, который будет высоко ценится.

  PdfReader.unethicalreading = true; 
      PdfReader reader = new PdfReader(pdfFileName); 
      PdfStamper stamper = new PdfStamper(reader, ms); 

      XfaForm xfa = new XfaForm(reader); 

      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(CreateXmaData(XDocument.Parse(xfa.DomDocument.InnerXml))); 

      xfa.DomDocument = doc; 
      xfa.Changed = true; 

      XfaForm.SetXfa(xfa, stamper.Reader, stamper.Writer); 

      PdfAction action = new PdfAction(PdfAction.PRINTDIALOG); 
      stamper.Writer.SetOpenAction(action); 


      // Somewhere here I had the code that made my XFA form read only... 


      stamper.Writer.CloseStream = false; 

      stamper.Close(); 
      reader.Close(); 

      byte[] buffer = new byte[ms.Position]; 
      ms.Position = 0; 
      ms.Read(buffer, 0, buffer.Length); 

      return buffer; 

ответ

0

Не уверен, что если я снился, что я имел только для чтения работает или что, и я сомневаюсь, что это лучший способ, но вот как я, наконец, смог это сделать:

... 
    doc.LoadXml(CreateXmaData(XDocument.Parse(xfa.DomDocument.InnerXml))); 

    PdfAction readOnlyAction = PdfAction 
     .JavaScript(MakeReadOnly(xfa.DomDocument.InnerXml), stamper.Writer); 
    stamper.Writer.AddJavaScript(readOnlyAction); 

    xfa.DomDocument = doc; 
... 



    private string MakeReadOnly(string xml) 
    { 
     string formName = string.Empty; 
     int subFormStart = xml.IndexOf("<subform", 0); 
     if (subFormStart > -1) 
     { 
      int nameTagStart = xml.IndexOf("name", subFormStart); 
      int nameStart = xml.IndexOf("\"", nameTagStart); 
      int nameEnd = xml.IndexOf("\"", nameStart + 1); 

      formName = xml.Substring(nameStart + 1, (nameEnd - nameStart) - 1); 
     } 

     string readOnlyFunction = "ProcessAllFields(xfa.form." + formName + ");"; 
     readOnlyFunction += "function ProcessAllFields(oNode) {"; 
     readOnlyFunction += " if (oNode.className == \"exclGroup\" || oNode.className == \"subform\" || oNode.className == \"subformSet\" || oNode.className == \"area\") { "; 
     readOnlyFunction += " for (var i = 0; i < oNode.nodes.length; i++) {"; 
     readOnlyFunction += " var oChildNode = oNode.nodes.item(i); ProcessAllFields(oChildNode);"; 
     readOnlyFunction += " }"; 
     readOnlyFunction += " } else if (oNode.className == \"field\") {"; 
     readOnlyFunction += " oNode.access = \"readOnly\""; 
     readOnlyFunction += " }"; 
     readOnlyFunction += "}"; 

     return readOnlyFunction; 
    } 
-1

Это работало для меня

String script = "for (var nPageCount = 0; nPageCount < xfa.host.numPages; nPageCount++) { var oFields = xfa.layout.pageContent(nPageCount, \"subform\"); var nNodesLength = oFields.length;"; 
     script += "for (var nNodeCount = 0; nNodeCount < nNodesLength; nNodeCount++) { oFields.item(nNodeCount).access = \"readOnly\"; } } "; 
Смежные вопросы