JasperReport, iReport e java

JasperReport, iReport e java

Dobbiamo produrre dei report in pdf da java?
Le soluzioni sono tante. Noi oggi ne tratteremo una in particolare: jasperReport!
Non è semplicissimo, ma cercheremo di seguire tutti i passi necessari per renderlo facile…
Ecco cosa faremo:
1. produzione file jrxml e compilazione del file jrxml in jasper
2. uso del file jasper in java per produrre un file PDF

1. PRODUZIONE FILE JRXML E COMPILAZIONE IN FILE JASPER
Per eseguire i suoi compiti jasperReport usa file con estensione jrxml, ossia file xml nei quali scrive tutto quello che serve per produrre il report. Compilando il file jrxml si ottiene poi un file con estensione jasper.
Da ciò deriva che la prima cosa da fare è produrre un file jrxml.
Per farlo, scarichiamo un IDE creato appositamente: iReport.
Ora dobbiamo usare iReport per disegnare il nostro report.
iReport si presenta più o meno come mostrato nella figura qui in basso e ci indica sin da subito la strada da seguire per creare un report:
– creare una fonte dati
– disegnare il report
– visualizzare/salvare il report
iReport - Schermata di benvenuto
E’ bene chiarire che non siamo di certo costretti a seguire l’iter appena indicato. Possiamo tranquillamente selezionare “File/Nuovo…”, scegliere il nostro layout preferito e premere “Open this template”. In questo caso però è bene aprire il file appena creato in visualizzazione XML ed eliminare l’attributo “language” del tag  <jasperReport>.
Si, ma allora perché fare tutto quel giro? Perché in quel modo iReport ci consente di vedere in diretta quello che creiamo. Vediamo allora di seguire l’iter indicato.
Clicchiamo sul “passo 1”.
Ci troveremo di fronte all’elenco di tutte le fonti dati da cui jasperReport può prelevare i dati da stampare (praticamente tutte). Noi qui prenderemo in esame quelle che più da vicino interessano un javista: Database JDBC connection, XML file datasource e JavaBeans.

Database JDBC connection
Questa è l’opzione da scegliere se vogliamo che il nostro report prelevi i dati da stampare da un DB. Selezioniamo quindi questa voce e premiamo “Avanti >”. Qui di seguito possiamo osservare la schermata che ci viene proposta da iReport dopo la pressione del pulsante “Avanti>”.
iReport_02 - Database JDBC connection
Dobbiamo ovviamente avere le informazioni che servono per collegarci al DB (nella figura stiamo utilizzando una connessione JDBC a Oracle).
ATTENZIONE: Se vogliamo usare Oracle dobbiamo scaricare la libreria ojdbc14.jar e posizionarla nella sottocartella “ide10\modules\ext” della cartella in cui abbiamo installato iReport e poi strumenti/opzioni/Classpath/Add Jar e aggiungiamo il jar.
Una volta inseriti tutti i dati, scegliamo “Prova” per vedere se abbiamo fatto tutto bene e quando tutto è OK premiamo “Salva”.
Ora, in alto al centro della schermata principale di iReport possiamo notare la nostra fonte dati (nell’immagine qui sotto indicata con “Fasi”).
Sorgente dati DB
E adesso? Ora che abbiamo la fonte dati possiamo usarla per compilare il nostro report. Clicchiamo con il destro sul nome del report e scegliamo la voce “Edit Query” (come mostrato nella figura che segue).
iReport: Edit Query
Si aprirà l’interfaccia mostrata qui di seguito, nella quale non dobbiamo fare altro che inserire la nostra query SQL e premere il pulsante “Read fields”.
iReport: ReportQueryCome per miracolo in basso vedremo l’elenco dei campi del DB. Scegliamo “OK” e torniamo sul nostro report. Nella sezione “Report inspector” (sulla sinistra) avremo la voce “Campi” riempita con i nomi delle colonne del DB. Non ci resta che selezionare una colonna e trascinarla sul nostro report, nella sezione in cui vogliamo che compaia.

XML file datasource
Se la nostre fonte dati è un file XML, ci basta scegliere XML file datasource al “Passo 1” e premere “Avanti >”. Diamo poi un nome e scegliamo il file XML di riferimento.
C’è però un caso in cui ci si può trovare in difficoltà nell’uso di un file XML come sorgente dati. E’ il caso in cui si cerca di inserire in una jr:table i dati contenuti nel file xml. In tal caso dopo aver creato il dataset dal quale la tabella andrà a prendere i dati, è opportuno entrare nella visualizzazione XML e modificare la seguente stringa:

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource(1)]]></dataSourceExpression>

in quest’altra:

<dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression>

Ok, facciamo un piccolo esempio 🙂
Ammettiamo che questo sia il nostro file XML:

<documento>
    <voce>
        <testo>Testo 1</testo>
        <valore>Valore 1</valore>
    </voce>
    <voce>
        <testo>Testo 2</testo>
        <valore>Valore 2</valore>
    </voce>
</documento>
</code>
Ammettiamo inoltre di dover inserire i dati contenuti nel tag "testo" nella prima colonna della jr:table e i dati del tag "valore" nella seconda colonna.
Trasciniamo quindi l'oggetto "Table" nella zona "Detail" del nostro report. Si presenterà la seguente schermata:
<a rel="lytebox" href="http://www.alessandrostella.it/blog/wp-content/uploads/2010/07/iReportNewTable.jpg"><img class="aligncenter size-medium wp-image-1225" title="creazione nuova Table" src="http://www.alessandrostella.it/blog/wp-content/uploads/2010/07/iReportNewTable-450x325.jpg" alt="creazione nuova Table" width="450" height="325" /></a>
dalla quale dobbiamo associare la nostra tabella al dataset. Premiamo quindi "New dataset". Nella schermata successiva diamo un nome al dataset (ad esempio SorgenteDatiXML) e scegliamo "Create new dataset...". Premiamo "Avanti&gt;". Nella schermata successiva andiamo a cercare la sorgente dati che fa riferimento al file XML. Ora sempre "Avanti&gt;" fino alla fine, quindi "Termina".
Ora nel "Report inspector", sulla sinistra, sarà comparsa la voce "SorgenteDatiXML".
Clicchiamoci sopra con il tasto destro e scegliamo "Edit query". Dalla schermata che si apre, nella combo "Query language" scegliamo "XPath" come nella figura qui sotto.
<a rel="lytebox" href="http://www.alessandrostella.it/blog/wp-content/uploads/2010/07/iReportQueryLanguage.jpg"><img class="aligncenter size-medium wp-image-1227" title="iReport - Query Language" src="http://www.alessandrostella.it/blog/wp-content/uploads/2010/07/iReportQueryLanguage-450x355.jpg" alt="iReport - Query Language" width="450" height="355" /></a>
A questo punto tramite XPath andiamo a cercare i dati che ci interessano (documento/voce). Sulla destra apriamo il tag "voce" e trasciniamo i tag "testo" e "valore" nella parte bassa della figura. Premiamo "OK".
Ora, sotto "SorgenteDatiXML" troveremo i campi "testo" e "valore".
Portiamoci nell'edit della tabella e trasciniamo i campi nelle rispettive colonne, come nella sottostante figura.
<a rel="lytebox" href="http://www.alessandrostella.it/blog/wp-content/uploads/2010/07/iReportEditTable.jpg"><img class="aligncenter size-medium wp-image-1229" title="iReport - Edit table" src="http://www.alessandrostella.it/blog/wp-content/uploads/2010/07/iReportEditTable-450x316.jpg" alt="iReport - Edit table" width="450" height="316" /></a>
Ora effettuiamo la sostituzione di cui si è parlato all'inizio di questo paragrafo ("dataSourceExpression").

<span style="text-decoration: underline;">JavaBeans set datasource</span>
Questa è la scelta più complicata, ma forse più utile per un javista. In questo modo possiamo dire a jasperReport di prelevare le informazioni da stampare da un elenco (collezione o array) di beans! Procediamo.
Dobbiamo innanzitutto sapere che
<blockquote>"this datasource need a spacial factory class that provides a static method to generate a collection or an array of JavaBeans"</blockquote>
ossia <strong>dobbiamo creare una classe che abbia un metodo statico e tale metodo DEVE restituire una collection o un array riempiti con i nostri beans</strong>.
Qui di seguito vi porto un esempio di tale metodo (si presuppone l'esistenza di una classe di nome Bean che rappresenta il nostro bean):

public static java.util.Collection dammiLista() {
    java.util.Collection persone = new ArrayList();
    for (int i=0; i<5; i++) {
        Bean persona = new Bean();
        persona.setCodiceFiscale("CODFISC"+i);
        persona.setCognome("Cognome"+i);
        persona.setNome("Nome"+i);
        persone.add(persona);
    }
    return persone;
}

Fatto questo, creiamo un .jar dal nostro progetto. Poi da iReport "Strumenti/Opzioni/Classpath". Scegliamo "Add JAR" e aggiungiamo il nostro jar. Ora, aggiungendo un datasource di tipo "JavaBeans set datasource", nel campo "Factory class" possiamo aggiungere la classe (completa di percorso del package in cui si trova). Nell'altro campo (il metodo statico) aggiungiamo il nome del metodo statico (nell'esempio "dammiLista) che ci restituisce la collection o l'array di beans, come mostrato nella figura qui sotto.
iReport - JavaBeans datasource
Premiamo il pulsate "Prova". Deve venire fuori un "successo", altrimenti abbiam sbagliato qualcosa... Se tutto è ok, clicchiamo sul destro sul nome del nostro progetto e scegliemo "Edit query". Comparirà la schermata qui sotto
iReport - Recupero dati dalla collection
Dobbiamo quindi premere su "JavaBean Datasource" e inserire il nome della classe che rappresenta il singolo bean (nel nostro caso proprio Bean). Poi premiamo "Read attributes". Al centro, come mostrato, comparirà l'elenco degli attributi del singolo Bean 🙂 Selezioniamo quelli che ci interessano e premiamo "Aggiungi il campo(i) selezionati. Poi diamo "ok".
Adesso nei campi del nostro report sono comparsi quelli selezionati e, trascinandoli sul report possiamo stamparne i valori 🙂
Ue', sia chiaro! Tutto questo discorso sui javabeans serve esclusivamente per vedere da iReport l'anteprima del nostro report. Nella nostra applicazione poi le cose son diverse! Non è che dobbiamo creare un metodo statico nel codice!!!
Procediamo nella lettura per capire...

Bene.
Qualunque sia stata la nostra scelta, ora prcediamo e creiamo il nostro report.
Ritorniamo nella schermata principale e clicchiamo sul "Passo 2".
Ci verrà proposto un insieme di layout. Senza complicarci la vita dietro a layout più o meno belli e complicati, scegliamo il primo se vogliamo un report con stampa verticale o il secondo se preferiamo una stampa orizzontale. Clicchiamo quindi sul layout scelto e premiamo "Open this template". Ora siamo pronti a disegnare il nostro report.
Le guide sull'argomento non mancano, quindi vi rimando ad una qualunque di esse per prendere dimestichezza con iReport.
Una volta terminato il nostro lavoro sul report è opportuno compilarlo per ottenere il file jasper. Per farlo basta premere il bottone evidenziato nelle figura qui sotto.
iReport: Compile

2.USO DI JASPERREPORT IN JAVA
Usare jasperReport in java significa semplicemente aggiungere la sua jar (attualmente jasperreports-3.7.3.jar) nelle librerie del progetto. Fatto questo possiamo accedere alle sue classi.
Se, ad esempio, il nostro file jasper compilato si chiama "ricevutaTrasfProgrTriennale.jasper" e deve recuperare i dati da un file XML, inviato tramite post in una web application, con il codice qui di seguito recuperiamo l'inputstream, modifichiamo il file XML (tramite jaxp) e richiamiamo jasperReport per la realizzazione del file PDF:

private void sendReportElencoReportXmlPdf(HttpServletRequest request,
HttpServletResponse response) throws IOException {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
    String pathFile = request.getSession().getServletContext().getRealPath("") + "WEB-INF/reports/ricevutaTrasfProgrTriennale.jasper";
    String pathFileImg = request.getSession().getServletContext().getRealPath("") + "WEB-INF/reports/LogoLomb.gif";
    //String pathFile = request.getRealPath("") + "WEB-INF/reports/ricevutaTrasfProgrTriennale.jasper";
    log.debug("PATHFILE PDF: " + pathFile);
    Map lParameters = new HashMap();
    lParameters.put("DATA_TIME", "15/15/2015");
    String fileXML = request.getParameter("file");
    log.debug(fileXML);
    InputStream in = new ByteArrayInputStream(fileXML.getBytes());

    DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    db = f.newDocumentBuilder();
    Document doc = db.parse(in);
    Element root = doc.getDocumentElement();
    root.setAttribute("img", pathFileImg);

    JRXmlDataSource xmlDS = new JRXmlDataSource(doc,"/trasferimenti/trasferimento");
    //JRXmlDataSource xmlDS = new JRXmlDataSource(in,"/trasferimenti/trasferimento");
    in.close();

    JRPdfExporter exporter = new JRPdfExporter();
    JasperPrint jasperPrint = JasperFillManager.fillReport(pathFile,lParameters, xmlDS);
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
    exporter.exportReport();
    } catch (JRException e) {
        log.error(e, e);
    } catch (ParserConfigurationException PCexc) {
        log.error(PCexc, PCexc);
    } catch (IOException IOexc) {
        log.error(IOexc, IOexc);
    } catch (SAXException SAXexc) {
        log.error(SAXexc, SAXexc);
    }

    response.setContentType("application/vnd.pdf");
    response.setHeader("Content-Disposition", "attachment; filename=stampaReport.pdf");
    //response.setContentLength(out.size());
    ServletOutputStream output = response.getOutputStream();
    out.writeTo(output);
    output.flush();
}

Se invece i dati sono contenuti in una collezione di beans, possiamo procedere come segue:

private void creaReportDaCollezioneDiBean(HttpServletRequest request,
     HttpServletResponse response) throws IOException {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    // QUI SETTIAMO EVENTUALI PARAMETRI E VARIABILI CHE SI ASPETTA IL NOSTRO JASPER
   // I QUESTO CASO STIAMO SETTANDO IL PATH IN CUI SI TROVA IL FILE JASPER E
   // IL PATH IN CUI SI TROVA UN'IMMAGINE CHE VERRA' POI STAMPATA NEL NOSTRO REPORT
    String pathFile = request.getSession().getServletContext().getRealPath("") + "/WEB-INF/reports/stampaReport.jasper";
    String pathFileImg = request.getSession().getServletContext().getRealPath("") + "/WEB-INF/reports/logo.png";
    Map<String, String> lParameters = new HashMap<String, String>();
    lParameters.put("pathImg", pathFileImg);
    log.debug("PATH JAPSER: " + pathFile);
    // FINE DEI SETTAGGI DEI PARAMETRI
  
    try {
     JRDataSource dataSource = null;

     java.util.Collection<EventoSospensioneStampaBean> beanCollection = 
       new ArrayList<EventoSospensioneStampaBean>();
     /*
      *  QUI SCRIVIAMO IL CODICE PER RIEMPIRE LA NOSTRA COLLEZIONE DI BEAN
      *  UNA VOLTA SETTATI GLI ATTRIBUTI DEL BEAN, LO AGGIUNGIAMO ALLA COLLEZIONE
     */  
      if (NostroBean!=null) {
       beanCollection.add(NostroBean);
     }
     dataSource = new JRBeanCollectionDataSource(beanCollection);

      // QUESTO E' IL CODICE PER COMPILARE IL NOSTRO REPORT JASPER
     if (dataSource!=null) {     
        JRPdfExporter exporter = new JRPdfExporter();
       log.debug("STO RIMPIENDO IL JASPER");
       JasperPrint jasperPrint = JasperFillManager.fillReport(pathFile, lParameters, dataSource);
        log.debug("HO RIEMPITO IL JASPER");
       exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
       exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
        exporter.exportReport();
      }
   } catch (JRException e) {
     log.error(e, e);
    } catch (Exception exc) {
     log.error(exc, exc);
    }

     response.setContentType("application/vnd.pdf");
   response.setHeader("Content-Disposition", "attachment; filename=reportSospensione.pdf");
    //response.setContentLength(out.size());
    ServletOutputStream output = response.getOutputStream();
    out.writeTo(output);
    output.flush();
}    

CLASSICI PROBLEMI INCONTRATI DURANTE L'USO DI JASPERREPORT
Dopo aver creato il file jasper e aver provato a interagire con esso tramite codice java, può capitare di imbattersi nel seguente messaggio di errore:

java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException

In questo caso bisogna aprire il jrxml ed eliminare l'attributo language="groovy" nel nodo jasperReport.

[... to be continued ...]

25 commenti

  1. Giovanni

    Sono riuscito a fare il sommario utilizzando uno scriptlet che aggiunge ogni capitolo ad una lista. Il mio problema ora è quello di farlo visualizzare. In pratica se faccio visualizzare la lista alla fine del report ok mentre se lo faccio visualizzare all’inizio del report KO. Il problema è legato all’evaluation time dell’expression. Se voglio far visualizzare la lista all’inizio dovrei fare tipo un ciclo for in un expression con evaluation time = REPORT, oppure passare la lista ad un subreport alla fine della generazione di tutte le pagine. Qualcuno ha 1 idea su come realizzare questa cosa?

    1. Buongiorno Giovanni.
      Purtroppo questo articolo è stato scritto circa 4 anni fa. Nel frattempo molte cose possono essere cambiate. Per esempio non uso più queste piattaforme da anni e non sono pertanto in grado di aiutarti…
      Spero tu possa risolvere il tuo problema 🙂
      Buona fortuna…

  2. Angelo

    Salve. ho la necessità di fare un report che prenda i valori da inserire nei campi, nè da un file xml nè da javabeans, nè da db, ma direttamente da una classe java che contiene delle stringhe da compilare.
    sapete se si può fare?
    In pratica ho creato un template con ireport ed ho usato dei campi di testo vuoti.
    questi campi di testo li devo inserire direttamente da java. però quando vado a compilare dà il seguente errore:
    net.sf.jasperreports.engine.design.JRValidationException: Report design not valid :
    1. Field not found : nomeCognome
    2. Field not found : citta
    3. Field not found : CF
    4. Field not found : data
    grazie per la disponibilità
    saluti
    Angelo

  3. Carlo

    Ho un problema che mi fa impazzire (Netbeans+iRreport + SQlLite): il database è stato realizzato con Sqlite. Ho copiato il jar nella directory di iReport e aggiornato il classpath. Quando in Netbeans aggiungo il report, entro nella finestra Database JDBC connection non mi compaiono i driver di Sqlite e così pure nella successiva finestra dove si inseriscono gli URL. Qualche suggerimento? Grazie

  4. Francesco

    salve, io avrei questo problema.
    io vorrei collegarmi ad un database esterno, metto tutti i dati e dopo un po’ mi da questo errore qui.

    Message:
    com.mysql.jdbc.CommunicationsException: Communications link failure

    Last packet sent to the server was 0 ms ago.

    Level:
    SEVERE
    Stack Trace:
    Communications link failure Last packet sent to the server was 0 ms ago.

    ho provato a cercare un po’ ma non capisco cosa significhi.

    Grazie in anticipo per l’aiuto

    1. Francesco

      ho risolto il problema, e sono arrivato ad un altro problema

      io creo il mio report, lo salvo, poi non ho ben capito come visualizzare il report dopo che l’ho salvato

  5. Giovanni

    Ciao.
    Ho questo problema che non riesco a risolvere.
    al permine di una stampa (su stampante ESC/POS) ho bisogno di inviare un codice ESC p 0 48 per far generare alla stampante un impulso che apre il cassetto soldi. (stampa comande feste).
    pensavo di inviare una stringa, ma non riesco a trovare cosa inserirci.
    Riesci a darmi una dritta.
    Te ne sarei grato.
    Grazie

  6. micky

    Ciao, ho necessità di generare pdf in formato PDF/A: ho letto che dalla VRM 4.1.2 di Jasper Report tale opzione è supportata. Ho installato l’ultima versione (4.6.0 con Itext 2.1.7) e nella sezione Strumenti-Opzioni-Opzioni di Esportazione-PDF di Ireport ho settato il PDF/A conformance a PDF/A-1B (ho provato anche con PDF/A-1A) ma il pdf generato non è nel formato richiesto. C’è altro da settare a livello IReport o a livello Java….o cosa sbaglio? Grazie mille

  7. Andrea

    Hehehe… di fortuna ne ho bisogno anche perchè java non mi è mai andato giù!!!
    L’unico file .jar nella cartella dell’applicazione “Printbridge.jar” non porta numeri, quindi credo che mi è impossibile stabilire la compatibilità… posso modificare un report senza assegnargli una sorgente dati? Forse è anche quello il problema…
    Cmq grazie mille per la risposta!!! Buon lavoro.

  8. Andrea

    Ciao Alessandro, grazie mille per la guida, vorrei chiederti un’informazione:
    ho dei file jasper e la necessità di modificare diciamo (per semplificare) dei campi di testo… ho installato iReport, ho aperto il file jasper, me lo converte in jrxml, cambio il campo di testo, compilo e poi quando vado ad usare il file compilato nel proprio programma (Sissi, un programma per le scuole) mi da un bel po’ di errori…
    La domanda è: si può cambiare solo un campo di testo o c’è qualcosa che mi sfugge?
    Grazie ancora 🙂

    1. Ciao Andrea,
      non posso dirti se c’è “qualcosa che ti sfugge” 😀 ma posso dirti che devi produrre il file jasper (in compilazione) perfettamente compatibile con la versione usata dall’applicativo. Prova a cercare nelle cartelle dell’applicativo qualcosa del tipo “jasperreports-*.jar”. Al posto dell’asterisco dovresti trovare dei numeri (per esempio 3.7.1). Bene, trovati questi “numeri” devi produrre un file jasper compatibile con quella versione. Per fare questo devi andare in ireport, scegliere “Strumenti/opzioni/iReport/Generale/Compatibility” e inserire esattamente quei numeri.
      Buona fortuna.

  9. Sall

    Ciao,
    sto provando ad usare Jasper iReport per accedere a dati in Oracle. Sono riuscito a collegarmi ed a produrre semplici report. Il problema è che dovrei poter usare packages di Oracle o ancora meglio pipelined tables. E’ possibile ?
    Grazie

  10. nautilus

    Ciao. Ottima guida. Ho messo subito in pratica e senza problemi una stampa che utilizza una classe java come datasource. Facile anche il raggruppamento e l’ordinamento dei campi. Però, ho riscontrato questa difficoltà: posso utilizzare un componente table (jr:table) dandogli come datasource sempre il bean (la classe)? Col Wizard e tramite IDE non sono riuscito a farlo. C’è qualche modo per farlo da codice XML?
    Grazie anticipatamente per la risposta.
    Ciao.

    1. Ciao Nautilus,

      non son sicuro di aver compreso quello che vuoi fare, ma provo a dare una risposta a quanto ho capito 🙂
      Inserita un table nel report, essa porta con un sé un dataset. Per prima cosa devi cliccare col dx su tale dataset (nel Report Inspector), scegliere “Edit Query” e posizionarti nella TAB “JavaBean DataSource”. Dagli il nome della classe e leggi gli attributi.
      Fatto questo dovresti trovare i campi selezionati nella sezione “Campi” del dataset in questione (tale procedimento è già esposto nell’articolo). Ora edita la tabella i trascina i campi che ti servono nelle colonne opportune.
      Bene.
      Ora nel “Main Report” clicca col dx sulla tabella e scegli “Edit table datasource”. Scegli come Sub dataset il dataset di cui sopra. Poi nella casella “Connection/DataSource Expression”, scegli “Usa espressione DataSource” e, infine, nel campo di testo sottostante scrivi questo:
      (net.sf.jasperreports.engine.data.JRBeanCollectionDataSource)$P{REPORT_DATA_SOURCE}
      che significa:
      caro jasper, guarda che la tabella in questione usa il data source del report padre; inoltre sappi che tale data source è di tipo JRBeanCollectionDataSource.
      Spero di averti aiutato…

  11. simone

    ciao, ho un problema con iReport, non riesco a far vedere sul mio PDF un subreport nel subreport. HO inserito un subr. nel subr. ma non lo visualizzo. ciao grazie

  12. Stefano

    Ciao
    Ho intenzione di utilizzare iReport tramite java utilizzando una collezione di beans e in un primo test è tutto ok.
    Quando però mi trovo a dover creare un banalissimo report nel workspace dell’applicazione di mio interesse trovo un errore di questo tipo:
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘titleBaseFontSize’: Invocation of init method failed; nested exception is java.lang.NoSuchFieldException: TITLE_BASEFONT_SIZE
    L’errore mi viene dato in compilazione del report anche se ho disegnato e testato il jrxml con il client. Dove sbaglio?
    Grazie

  13. cristian

    Mi scuso ovviamente il messaggio precedente era rivolto ad Alessandro, l’autore del post, che ringrazio nuovamente.
    Un saluto.
    -cristian.

  14. cristian

    Ciao faber;
    Innanzi tutto grazie per le indicazioni; ti vorrei chiedere una cosa: ho anche io la necessita’ di creare una jr:table partendo da un xml. Sono alle prime armi con jasper. E’ normale il comportamento per cui venga “persa un riga” rispetto al risultato della query XPath (immagino che quello sia il motivo per cui metti inizialmente un nodo vuoto:

    )?
    C’e’ un modo per far si che tutti i nodi risultanti dall’XPath indicato finiscano nella tabella, senza perdere il primo?
    Grazie mille. Un saluto.
    -cristian-

    1. Ciao Cristian,
      hai ragione, è vero: viene persa la prima riga (più in dettaglio si perde il valore del primo tag risultante dall’xpath).
      Ho segnalato la cosa ai ragazzi di jasper Report proprio qualche giorno fa. Se avrò risposta ti saprò dire. Per ora ho risolto lasciando deliberatamente vuoto il primo tag, ma credo proprio che si tratti di un bug.
      Grazie per aver ritenuto utile il mio post.

  15. faber

    Come posso scaricare un file già in formato Pdf usando jasperRepert. Mi serve per una web application. Dovrei scaricare il manuale tramite un tasto(lato client) che ha un listener su un action (Lato server) che dovrebbe far apparire la finestra salva/apri.
    Per cui io non ho bisogno di creare il file pdf ma c’è già bello e pronto
    Spero di essere stato chiaro

    1. Ciao faber,
      non serve jasper report per quello che vuoi fare 🙂 Anzi, non devi assolutamente usarlo 😉
      Ti basta usare le righe dalla 43 alla 48 dell’ultimo listato, sostituendo “stampaReport.pdf” con il path del tuo file fisico sull’HD (ad esempio: C:\cartella\file.pdf).
      Buon lavoro.

I commenti sono chiusi.