Suche // Search:

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