Suche // Search:

Posts mit dem Label XML-File werden angezeigt. Alle Posts anzeigen
Posts mit dem Label XML-File werden angezeigt. Alle Posts anzeigen

15.07.2014

XML per Skript in Adobe Reader importieren
//
Import XML via Script into Adobe Reader

Wenn es im den Import und Export von Daten geht, gibt es im Adobe Reader viele Hürden.
Der Export klappt hier noch relativ einfach über eine E-Mail aber der Import bleibt einen ohne LiveCycle Reader Extensions ersteinmal verwehrt.

Dabei kann man schon seit Version 9.2 externe Dateien mit dem Reader importieren.
Möglich macht das die JavaScript-Methode readFileIntoStream().

Dieses Beispiel zeigt, wie man damit Daten einer XML-Datei in ein XFA-Formular importieren kann – in Adobe Reader natürlich!


When it comes to import and export of data you'll be faced to many barriers, especially in Adobe Reader.
Ok, you can export your data quite easily by sending an email, but the import is a forbidden fruit unless you have LiveCycle Reader Extensions at hand.

Well, since Reader version 9.2 you're already able to import files with Reader.
This is possible through the JavaScript method readFileIntoStream().

This example shows, how you can import data into XFA forms from external XML files – In Adobe Reader of course!

Skript zum Importieren einer XML-Datei
//
Script to import a XML file

var vStream = util.readFileIntoStream();
if (vStream) {
    var vImport, vImportData, vImportXML;
    vImport = util.stringFromStream(vStream)
    .replace(/(\<\?.*\?\>\s*)|(\<!-{2}(.|\n|\r)*-{2}\>)|(\r\n|\r|\n)/g, "");
    vImportData = eval(vImport);
    vImportXML = vImportData.toXMLString();
    xfa.datasets.data.loadXML(vImportXML, false, true);
}

Beispiel Dateien
//
Sample files
https://files.acrobat.com/a/preview/4bbd94e6-c3e9-413a-badc-5154731720a7

01.07.2014

XML-Daten mit XSLT umwandeln
//
Transform XML Data with XSLT

Eine Anfrage eines Kunden hatte mich vor einiger Zeit auf das Thema XSLT (XSL Transformation) gebracht.
Ziel war es Daten in einer Excel-Datei zu pflegen, diese als XML-Datei zu exportieren und diese dann in ein XFA-Formular zu importieren.
XSLT war hier zwingend erforderlich, da Excel nur sehr flache XML-Strukturen unterstützt, die nicht zum Aufbau des XFA-Formulars passen wollten.

Generell bietet sich XSLT immer an wenn importierte/exportierte Daten umstrukturiert werden sollen.
XSLT erlaubt vielfältige Manipulationen, wie z.B. Attribute und Elemente hinzufügen, entfernen oder umbenennen.

Dieses Beispiel soll einmal die Möglichkeiten zeigen, die XSLT bei Verwendung einer Datenbindung mitbringt.


A while ago a customers request brought me to the topic XSLT in XFA forms.
The goal was to fill data in a Excel file, export those data as XML file and import it into a XFA form.
XSLT became neccessary because Excel only allows very plain XML structures that didn't fit the structure of the XFA form.

XSLT is always the first choice if you need to restructure the imported/exported data.
It allows a variety of manipulations as adding, removing or renaming attributes and elements.

In this example I would like to show what you can do with XSLT in a data connection.


1. Als Ausgang dient wieder eine Excel-Datei, in der man Kundendaten pflegt und dann als XML-Datei exportiert.
//
We're starting with an Excel file where we fill some customer data and export those as a XML file.
Excel-Datei mit XML-Zuordnung
//
Excel file with XML mapping

<!-- XML-Struktur aus Excel // XML structure from Excel --> <CustomerList>
    <Customer Firstname="String" Middlename="String" Lastname="String" Sex="String" Birthday="YYYY-MM-DD"/>
    <Info Address="String" ZIP="String" City="String"/>
    </Customer>
    ...
</CustomerList>

2. Das XFA-Formular, in das die Daten dann importiert werden sollen, hat in diesem Fall eine Datenbindung an ein Schema (XSD), das eine andere Struktur als die XML-Datei aufweist.
//
The XFA form has a data connection to a schema (XSD) with a different structure than the XML file we're going to import.

<!-- XML-Struktur in XFA-Formular // XML structure in XFA form -->
<MyCustomers>
  <Customer>
  <General>
   <FirstName>String</FirstName>
   <MiddleName>String</MiddleName>
   <LastName>String</LastName>
   <Gender>String</Gender>
   <BirthDay>YYYY-MM-DD</BirthDay>
  </General>
  <Address>
   <Street>String</Street>
   <ZipCode>String</ZipCode>
   <Town>String</Town>
  </Address>
  <Contact>
   <Phone>String</Phone>
   <Mobile>String</Mobile>
   <Email>String</Email>
  </Contact>
 </Customer>
  ...
</MyCustomers>


3. Damit die eingehenden (importierten) Daten dennoch korrekt zugewiesen werden, wird der Datenverbindung auch ein XSLT-Stylesheet zugewiesen, das die erforderliche Transformierung vornimmt.
Auch die ausgehenden (exportierten) Daten werden umgewandelt, sodass die XML-Datei ebenso eine andere Struktur aufweist.

//
To allow an correct assigment of the incomming (imported) data the data connection additionally uses a XSLT stylesheet to transform the data.
Also the outgoing (exported) data is transformed, so an exported XML file has a different structure too.
Datenverbindung mit XSLT
//
Data Connection with XSLT

<!-- XSLT-Stylesheet -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <xsl:template match="CustomerList">
  <MyCustomers>
   <xsl:comment>NOTE: XML data was transformed by XSLT during import to conform the embedded XML schema</xsl:comment>
   <xsl:variable name="Customer" select="Customer"/>
   <xsl:for-each select="$Customer">
    <xsl:variable name="Info" select="./Info"/>
    <Customer>
     <General>
      <FirstName>
       <xsl:value-of select="@Firstname"/>
      </FirstName>
      <MiddleName>
       <xsl:value-of select="@Middlename"/>
      </MiddleName>
      <LastName>
       <xsl:value-of select="@Lastname"/>
      </LastName>
      <Gender>
       <xsl:value-of select="@Sex"/>
      </Gender>
      <BirthDay>
       <xsl:value-of select="@Birthday"/>
      </BirthDay>
     </General>
     <Address>
      <Street>
       <xsl:value-of select="$Info/@Address"/>
      </Street>
      <ZipCode>
       <xsl:value-of select="$Info/@ZIP"/>
      </ZipCode>
      <Town>
       <xsl:value-of select="$Info/@City"/>
      </Town>
     </Address>
    </Customer>
   </xsl:for-each>
  </MyCustomers>
 </xsl:template>
</xsl:stylesheet>


Beispiel-Dateien
//
Sample files
https://files.acrobat.com/a/preview/509c0f0c-1a3c-4ce5-8f0e-0378f391ef0a

31.01.2011

Formulare durch Anhänge vorbefüllen
//
Populate forms from attachments

Haben Sie sich nicht schon mal gewünscht, Formulare einfach durch eine externe Datei zu aktualisieren, anstatt sie bei jeder Kleinigkeit wieder in Designer öffnen zu müssen?
Das ist sogar möglich.
Sie können Formularobjekte wie z.B. Texte und Textfelder zur Laufzeit verändern und z.B. durch eine angehängte XML-Datei vorbefüllen zu lassen.
Diese Methode ist beispielsweise praktisch, wenn Sie nur ihre AGB's im Formular aktualisieren wollen oder sie einen Fragebogen haben, bei dem Sie die Fragen je nach Abteilung nur etwas variieren müssen.

Dieses Beispiel verwendet dazu eine relativ kompakte JavaScript-Funktion in einen Skriptobjekt, dass beim docReady:Event ausgeführt wird.
Das Skript prüft, ob Anhänge vorhanden sind, und wenn ja, ob ein Anhang einen ganz bestimmten Namen hat.
Dieser Anhang ist dann die Quelldatei, aus der die XML-Daten herausgelesen und vorbefüllt werden.

AKTUALISIERUNG: Ich habe mein Bespiel etwas ergänzt. Sie könne jetzt auch Dropdown-Listen und Listboxen aus den Anhängen heraus vorbefüllen.


Have you ever thought of updating your existing forms through an external file instead of opening them each time again in Designer?
This is even possible.
You can manipulate form objects such as a text or text field at runtime and populate them from an attached XML-file.
This method is handy for example if you only need to update the GTC in your form or you have a questionnaire with slight varying questions for each division.

This example uses a relatively short JavaScript function in a script object, which is executed on the docReady:Event.
The script determines if there are files attached to the form and if one has a specific file name.
This specific file is the source file where the XML data is extracted from and populated.

UPDATE: My sample got a bit more complemented. Now you also can populate drop down lists and list boxes from the attachments.


JavaScript-Funktion
//
JavaScript function
form1.#variables[0].Populate - (JavaScript, client)
 
function Presets () {
     var oDoc = event.target,
  oAttachment = oDoc.dataObjects,
  oAttachmentName,
  oAttachmentData,
  oAttachmentString,
  oXMLData;        

 if (oAttachment !== null) {
  for (var i = 0; i < oAttachment.length; i += 1) {
   oAttachmentName = oAttachment[i].path; 
   if (oAttachmentName == "LCB_FormPresets.xml") {
    oAttachmentData = oDoc.getDataObjectContents(oAttachmentName); 
    oAttachmentString = util.stringFromStream(oAttachmentData);
    oXMLData = XMLData.parse(oAttachmentString, true);

    xfa.form.form1.pageSet.Master.Headline.value.text.value = oXMLData.Preset01.value;
    xfa.form.form1.Page.Name.rawValue = oXMLData.Preset02.value; 
    xfa.form.form1.Page.Address.rawValue = oXMLData.Preset03.value; 
    xfa.form.form1.Page.Mail.rawValue = oXMLData.Preset04.value; 
    xfa.form.form1.Page.Phone.caption.value.text.value = oXMLData.Preset05.value; 
    xfa.form.form1.Page.Fax.caption.value.text.value = oXMLData.Preset06.value; 
    xfa.form.form1.Page.Mail.caption.value.text.value = oXMLData.Preset07.value;
    xfa.form.form1.Page.Explaination.value.text.value = oXMLData.Preset08.value;  
    xfa.form.form1.Page.Explaination.font.fill.color.value = oXMLData.Preset09.value;  
    
    var DDLValues = oXMLData.Preset10.value.split(", ");
       for (var d = 0; d < DDLValues.length; d += 1) {
         xfa.form.form1.Page.DropDown.addItem(DDLValues[d]);
         }
         
        var LBValues = oXMLData.Preset11.value.split(", ");
       for (var l = 0; l < LBValues.length; l += 1) {
         xfa.form.form1.Page.ListBox.addItem(LBValues[l]);
         }
   }
  }
 }
}
Schritt 1 – Leeres Formulare mit Platzhalter-Texten oder leeren Feldern
//
Step 1 – Empty form with placeholder texts or empty fields


Schritt 2 – XML-Datei mit den gewünschten Daten als Anhang hinzufügen
//
Step 2 – Attach XML-file with the desired data

Schritt 3 – Automatisch vorbefülltes Formular nach dem Schließen und Öffnen
//
Step 3 – Automatically populated form after closing and opening


Beispielformular
//
Sample form
https://documentcloud.adobe.com/link/track?uri=urn:aaid:scds:US:e3f5ce39-e8f7-4af6-943b-069e2071d223