Compilare Al Volo Moduli PDF con Domino Web

TIPS DEVELOPERS itext domino notes java agent stream form pdf

  • 9 commenti
Ciao a tutti,
oggi mi sono reso conto che è da  troppo tempo che non scrivo articoli su Dominopoint...

Ed eccomi qua a scrivere questo POST che spiega nel dettaglio come creare con Lotus Domino Web un PDF  utilizzando la libreria Itext.

Già in passato avevo postato esempi in grado di dimostrare la fattibilità della cosa :
ma ho notato che a tutti questi articoli mancano dei connettori che vi andrò a spiegare qui sotto.

L'obiettivo che mi sono prefissato in questo post è quello di far capire in maniera semplice a tutti i developer Notes quali siano gli step necessari per agganciare ITEXT a Domino e come utilizzare la libreria Java ITEXT per compilare un Modulo PDF al volo prendendo i dati dai campi di un documento notes web.

1 ) Come creare Moduli PDF compatibili con ITEXT?


La risposta è molto semplice...basta usare un Editor PDF! :-D
Io per comodità e per compatibilità con Itext preferisco usare Abobe LiveCycle Designer...un prodotto incluso nella suite di Acrobat Professional.
Con questo tools è molto semplice creare un Modulo PDF utilizzando gli oggetti UI per inserire campi, testo ed immagini con semplici drag&drop.

Image:Compilare Al Volo Moduli PDF con Domino Web

2) Caricare i Templates PDF in N documenti Notes...

Una volta realizzato il template PDF con tutti i campi annessi e connessi...possiamo crare una form in Notes chiamata Template PDF con un Field Rich-text al quale verrà attachato il nostro file template PDF ed un campo Testo chiave utile per selezionare il PDF nel nostro agent Java.
Successivamente bisognerà creare la relativa vista che tramite il campo chiave categorizzato permetta di @dblokuppare il PDF adatto.
Image:Compilare Al Volo Moduli PDF con Domino Web


3) Come visualizzare il Modulo PDF Compilato?


L'idea iniziale era quella di generare documenti notes temporanei sui quali avrei attachato il PDF compilato per poi visualizzare tale allegato con un classico redirect html ( che sfrutta i comandi ?Open.. per la visualizzazione)

Successivamente ho pensato di ridirezionare direttamente in streaming la compilazione del PDF utilizzando la classe Java che permetta di scrivere in formato binario il PDF ( quindi realizzare con un agent una servlet ).

Ma putroppo a causa di un baco presente nel metodo Java getAgentOutputStream della JVM 1.3 presente sino alla 7.02 di Domino quest'ultima soluzione non è applicabile poichè il metodo non esce grezzo e pulito ma sporco di caratteri che corrompono il PDF ( potremmo motivare la cosa come  "limite di piattaforma"? :-D ...pare che nella R 8.X di Domino questo problema sia stato fixato )
La problematica è stata ampiamente discussa anche da questo blogger (grazie anche a Daniele Vistalli per avermi suggerito questo Link )

Di conseguenza l'unica soluzione applicabile per generare PDF on-fly è la prima che permette all'agent Java che sfrutta ITEXT di compilare il PDF template e successivamente allegarlo ad un nuovo documento notes temporaneo e poi effettuare il redirect all'allegato appena creato con i comandi ?Open...

4) Come aggangiare il JAR di ITEXT in Domino?


Spesso si è discusso sia nel forum di Dominopoint che in Notes.net su quale fosse la strada corretta per per agganciare i JAR...
Volendo è possibile aggangaire i JAR direttamente nell'agent ...ma io preferisco aggangiarli all'interno di una script-library Java che successivamente aggancerò all'agent Java contente il code di compilazione,  di modo che sia la compilazione Java che il mantenimento dell'applicazione risulti + snello e facile da gestire.

Image:Compilare Al Volo Moduli PDF con Domino Web


Image:Compilare Al Volo Moduli PDF con Domino Web


5) Scrittura del Codice Agent Java che sfrutta la libreria contenente ITEXT.

Qui sotto riporto il codice Java inserito nell'agent che in questo caso riceve come parametro la UNID del documento
L'agente verrà quindi invocato tramite bottone o link html che utilizzerà il classico ?OpenAgent utilizzando la seguente sintassi :

--> NOMEAGENT?OpenAgent&id=UNID

L'agente qui sotto scritto è stato ampiamente commentato per permettere a qualunque developer di capirne il funzionamento.


-----------------------------------------------------------------------------------------------------------


import lotus.domino.*;

import java.io.*;
import java.awt.Color;

import java.io.FileOutputStream;

import java.io.IOException;

import com.lowagie.text.pdf.*;



public class JavaAgent extends AgentBase {


public void NotesMain() {


        try {

               
             Session session = getSession();

        AgentContext agentContext = session.getAgentContext();

        Database db = agentContext.getCurrentDatabase();

        Document context= agentContext.getDocumentContext();


          String newurl = context.getItemValueString("Query_String");

             String idkey = newurl.substring(newurl.indexOf("&id=")+4);

            Document dockey=db.getDocumentByUNID(idkey);

 
     
// INNAZITUTTO PRENDO L'ALLEGATO TEMPLATE DALLA VISTA
            View view = db.getView("template_pdf_view");

        Document tempDoc=null;

   
    // ORA PRENDO IL DOC CHIAVE PDF MODELLO
        tempDoc=view.getDocumentByKey("CHIAVEPDF", true);
       
      if (tempDoc != null)   {

              RichTextItem pdfAttach=(RichTextItem)tempDoc.getFirstItem("allegato");            

                EmbeddedObject eo=pdfAttach.getEmbeddedObject("NOMEPDF.pdf");

//SUPPONGO DI AVERE UN SERVER WINDOWS...QUINDI DI UTILIZZARE COME DIRECTORY DI APPOGGIO

//C:\TEMP ma si potrebbe pensare di usare come suggerito da Daniele Vistalli la classe Java universale che cattura il path temperaneo

// di qualunque sia il s.o della macchina server

// esempio http://java.sun.com/j2se/1.3/docs/api/java/io/File.html#createTempFile(java.lang.String,%20java.lang.String    
                   

                   String filePath ="C:\\TEMP\\documento"+context.getUniversalID()+".pdf";

               
               
               
// ORA DEVO DIRE AD ITEXT DI LEGGERE IL READER DIRETTAMETNE IN STREAM DALL'ATTACH TEMPLATE
                // E MI DOVRO' CREARE UN NUOVO FILE DI USCITA PER ORA CHIAMATO DOCUMENTO.PDF

                PdfReader reader = new PdfReader(eo.getInputStream());

                PdfStamper stamp = new PdfStamper(reader,  new FileOutputStream(filePath));

               
       
                // COMPILO ORA I CAMPI DEL PDF

                AcroFields form = stamp.getAcroFields();
                form.setField("campo1",dockey.getItemValueString("campo1"));

                form.setField("campo2",dockey.getItemValueString("campo2"));

               
                reader.eliminateSharedStreams();

                reader.close();                

//PREVIENE L'EVENTUALE MODIFICA DELLA FORM POST COMPILAZIONE

                stamp.setFormFlattening(true);

                stamp.close();
               
         
      // INIZIO LA CREAZIONE DEL RICHTEXT A CUI ALLEGO IL PDF
                tempDoc=null;

             
              tempDoc=db.createDocument();                  
              tempDoc.replaceItemValue("Form","TempPDF");                        

              pdfAttach = tempDoc.createRichTextItem("PDFAttach");

              pdfAttach.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null, filePath, null);

           
  // Salva nel Database il Documento Temporaneo PDF generato in Notes
              tempDoc.save(true, true);

             
              //Cancella dalla Folder TEMP il template e il PDF generato ed attachato

              File fPath = new File(filePath);  
              fPath.delete();


//ORA CHE IL PDF E' STATO COMPILATO PROCEDO A CRARE IL DOCUMENTO TEMPORANEO


              PrintWriter pw = getAgentOutput();

// Mi costruisco il PATH per la visualizzazione del PDF suppongo di avere una vista dedicata alla visualizzazione di tutti i pdf

              String fullFile = "/(TempPDFDocuments)/"+tempDoc.getUniversalID()+"/$File/"+"documento"+context.getUniversalID()+".pdf";

    if (session.isOnServer() ) {

                String path_ret="["+"/"+db.getFilePath() + fullFile+"]";

                pw.println (path_ret.replace('\\','/'));

     } else {
           pw.println( " PDF GENERATO"  );

            pw.println( "<html>Fatto - <a href="\"/"" + db.getFilePath() + fullFile + "\">APRI IL PDF</a>
<" );        
            pw.println ("");
            }

     session.recycle();

        }

       
//FINE IF CONTROLLO
        } catch(Exception e) {

                e.printStackTrace();

        }

}

}


-----------------------------------------------------------------------------------------------------------

9 Commenti:

  • #1 zczc 02/26/2009 9:33:23 PM

    aacxzc

  • #2 Marcello 01/23/2009 5:03:18 PM

    Ho seguito alla lettera e funziona. Adesso ho il problema della lentezza solo alla prima escuzione dell'agent.... se la seconda volta viene esegutito dopo pochi secondi tutto risulta veloce....ma perchè???? poi se non viene eseguito per un poco di tempo torna lento.....

  • #3 Prova 12/04/2008 2:42:12 PM

    Ciao

  • #4 Giuseppe 07/18/2007 12:54:57 PM

    @Gabriele: ottimo!

    @Mariano: puoi integrare con un tuo punto di vista, l'invito a proporre articoli è valido anche per te!

  • #5 Gabriele 07/18/2007 12:52:12 PM

    ok, appena posso invio un articolino su jasper.

  • #6 Mariano 07/18/2007 12:45:13 PM

    Daniele, ottimo articolo!

    Anche io ho avuto esperienze con iText e pensavo di proporre qualcosa a Dominopoint. Mi hai preceduto, ma ora vedo se posso integrare con qualche commento.

    Bravissimo!

  • #7 Daniele Grillo 07/18/2007 12:09:06 PM

    Concordo con giuseppe...non conoscevo questo prodotto e mi sembra molto valido.

  • #8 Giuseppe 07/18/2007 12:04:54 PM

    @Gabriele: JasperReport è molto interessante, hai voglia di proporci un articolo in proposito?

  • #9 Gabriele 07/18/2007 11:55:03 AM

    L'idea di usare Itext è buona però presenta degli svantaggi (uno su tutti se si deve andare a gestire un form testata-righe).

    Noi abbiamo sperimentato la soluzione di utilizzare jasper report (open source java che ha sua volta si serve di itext come motore pdf) e abbiamo ottenuto ottimi risultati.

Commenta articolo
 

Questo spazio web è stato creato da per un uso pubblico e gratuito. Qualsiasi tipo di collaborazione sarà ben accetta.
Per maggiori informazioni, scrivete a info@dominopoint.it

About Dominopoint
Social
Dominopoint social presence: