Expérience avec la gestion des processus d’AEM Forms on JEE, programmation Java™ de base et création de composants personnalisés.
Autres produits nécessaires
Éditeur Java™ tel que Eclipse ou IDE Netbeans
Intermédiaire
AEM Forms on JEE permet aux développeurs de créer un ASC personnalisé (Acrobat Services Container) pour créer des fonctionnalités prêtes à l’emploi enrichies. Ces composants que vous créez sont enfichables dans l’environnement d’exécution AEM Forms sur JEE afin de remplir la fonction qui leur a été donnée. Cet article explique comment créer un service ZIP personnalisé, qui peut être utilisé pour compresser une liste de fichiers dans un fichier .zip et décompresser un fichier .zip vers une liste de documents.
Créez un composant ASC personnalisé avec deux opérations de service afin de pouvoir compresser et décompresser une liste de documents. Ce composant utilise le package java.util.zip pour la compression et la décompression.
Pour créer un composant ASC personnalisé :
Le code se trouve ci-dessous :
/*
* Custom DSC : ZIP Utility
* Purpose: This is a LiveCycle ES2 custom component used to Compress & Decompress List of Documents
* Author: Nithiyanandam Dharmadass
* Organization: Ministry of Finance, Kingdom of Bahrain
* Last modified Date: 18/Apr/2011
*/
package nith.lces2.dsc;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import com.adobe.idp.Document;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipOutputStream;
public class ZIPService {
static final int BUFFER = 2048; // 2MB buffer size
public java.util.List UnzipDocument(com.adobe.idp.Document zipDocument) throws Exception {
ZipInputStream zis = new ZipInputStream(zipDocument.getInputStream());
ZipEntry zipFile;
List resultList = new ArrayList();
while ((zipFile = zis.getNextEntry()) != null) {
ByteArrayOutputStream byteArrayOutStream = new ByteArrayOutputStream();
int count; // an int variable to hold the number of bytes read from input stream
byte data[] = new byte[BUFFER];
while ((count = zis.read(data, 0, BUFFER)) != -1) {
byteArrayOutStream.write(data, 0, count); // write to byte array
}
com.adobe.idp.Document unzippedDoc = new Document(byteArrayOutStream.toByteArray()); // create an idp document
unzippedDoc.setAttribute("file", zipFile.getName());
unzippedDoc.setAttribute("wsfilename", zipFile.getName()); // update the wsfilename attribute
resultList.add(unzippedDoc);
}
return resultList; // List of uncompressed documents
}
public com.adobe.idp.Document ZipDocuments(java.util.List listOfDocuments,java.lang.String zipFileName) throws Exception {
if (listOfDocuments == null || listOfDocuments.size() == 0) {
return null;
}
ByteArrayOutputStream byteArrayOutStream = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(byteArrayOutStream); // ZIP Output Stream
for (int i = 0; i < listOfDocuments.size(); i++) {
Document doc = (Document) listOfDocuments.get(i);
InputStream docInputStream = doc.getInputStream();
ZipEntry zipEntry = new ZipEntry(doc.getAttribute("file").toString());
zos.putNextEntry(zipEntry);
int count;
byte data[] = new byte[BUFFER];
while ((count = docInputStream.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count); // Read document content and add to zip entry
}
zos.closeEntry();
}
zos.flush();
zos.close();
Document zippedDoc = new Document(byteArrayOutStream.toByteArray());
if(zipFileName==null || zipFileName.equals(""))
{
zipFileName = "CompressedList.zip";
}
zippedDoc.setAttribute("file", zipFileName);
return zippedDoc;
}
}
Un fichier component.xml doit être créé dans le dossier racine du package qui a défini les opérations de service et leurs paramètres.
Le fichier component.xml est affiché ci-dessous :
<?xml version="1.0" encoding="UTF-8"?>
<component xmlns="https://adobe.com/idp/dsc/component/document">
<!-- Unique id identifying this component -->
<component-id>ZipService</component-id>
<!-- Version -->
<version>1.0</version>
<!-- Start of the Service definition -->
<services>
<!-- Unique name for service descriptor.
The value is used as the default name for
deployed services -->
<service name="ZipService">
<!-- service implementation class definition -->
<implementation-class>nith.lces2.dsc.ZIPService</implementation-class>
<!-- description -->
<description>Compress or Decompress list of documents</description>
<!-- You can provide your own icons for a distinct look -->
<small-icon>icons/Zip_icon16.png</small-icon>
<large-icon>icons/Zip_icon32.png</large-icon>
<!-- automatically deploys the service and starts it after installation -->
<auto-deploy service-id="ZipService" />
<operations>
<!-- method name in the interface setSmtpHost-->
<operation name="UnzipDocument">
<!-- input parameters to the "send" method -->
<input-parameter name="zipDocument" title="Input ZIP Document" type="com.adobe.idp.Document">
<hint>A ZIP File to be decompressed</hint>
</input-parameter>
<output-parameter name="resultList" title="Decompressed list of documents" type="java.util.List">
<hint>Decompressed ZIP list</hint>
</output-parameter>
</operation>
<operation name="ZipDocuments">
<!-- input parameters to the "send" method -->
<input-parameter name="listOfDocuments" title="List of Documents" type="java.util.List">
<hint>A list of documents to be Compressed</hint>
</input-parameter>
<input-parameter name="zipFileName" title="Result File Name" type="java.lang.String">
<hint>The name of compressed file (optional)</hint>
</input-parameter>
<output-parameter name="zippedDoc" title="Compressed Zip file" type="com.adobe.idp.Document">
<hint>Compressed ZIP File</hint>
</output-parameter>
</operation>
</operations>
</service>
</services>
</component>
L’opération UnzipDocument du service personnalisé peut désormais accepter une variable de document comme entrée et retourner une liste de variables de document comme sortie.
De même, l’opération ZipDocuments du composant personnalisé peut accepter une liste de documents comme entrée, les compresser sous forme de fichier zip et retourner le document compressé.
L’orchestration de workflow suivante montre comment décompresser le fichier ZIP donné, le compresser à nouveau dans un autre fichier ZIP et renvoyer la sortie (voir l’illustration ci-dessous).
Vous pouvez utiliser ce service ZIP dans les cas d’utilisation suivants :
Rechercher tous les fichiers dans un dossier donné et les renvoyer sous forme de document compressé
Fournissez un fichier ZIP contenant plusieurs documents de PDF qui peuvent être complétés par le lecteur après les avoir décompressés. Ceci nécessite le module Reader Extensions pour AEM Forms sur JEE
Fournissez un fichier ZIP contenant un type hétérogène de document qui peut être décompressé et converti en document PDF à l’aide du service Generate PDF.
La politique protège une liste de documents et renvoie un fichier ZIP
Permet aux utilisateurs de télécharger toutes les pièces jointes d’une instance de processus sous la forme d’un fichier ZIP unique.