symonx80 (Normal User)
Pro
Messaggi: 107
Iscritto: 30/07/2009
|
Ciao,
vorrei aprire una discussione riguardante la logica e modalità di creazione di un modulo in pdf tramite funzione java.
Ho necessità di creare un modulo in file pdf contenente del testo statico e dei campi precompilati dal sistema con dei dati estratti da un database.
Dopo aver svolto una ricerca in rete ho pensato che la soluzione migliore sia l'utilizzo della libreria iText.
La creazione del pdf è semplice ma mi sorge un problema nel creare un layout come potrebbe essere quello che vedete qui sotto
http://www.aetnanet.org/download/FC/pensioni/modulo_accred ...
Secondo voi è possibile ricreare (anche con una soluzione differente dall'utilizzo di iText) questa sorta di layout e aggiungere per ogni cella un singolo carattere in base al dato estratto dal database?
Perchè io mi sono scervellato ma la mia prima conclusione è che questo sia impossibile...
Ultima modifica effettuata da symonx80 il 15/01/2010 alle 11:55 |
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
potresti usare la libreria Jasper Report, definendo il layout come fosse il modulo voluto e tirando fuori i dati da un database.
il layout si disegna in xml ma dovrebbero esistere pure dei software di design visuale.
|
|
symonx80 (Normal User)
Pro
Messaggi: 107
Iscritto: 30/07/2009
|
grazie ora gli do un'occhiata.
Ma che tu sappia questa libreria mi permette di andare ad aprire il mio template, inserirne testo a mio piacimento(o sostituire del testo) e generarne il pdf finale?
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
questa libreria serve a generare report dinamicamente, tu descrivi il template in xml, poi gli travasi dentro i dati, e automaticamente poi si può generare il report in pdf, html o altri formati.
io l'ho usata per generare una semplice tabella in passato, ma volendo uno potrebbe creare un template più articolato che può rappresentare un modulo.
|
|
symonx80 (Normal User)
Pro
Messaggi: 107
Iscritto: 30/07/2009
|
Ho provato la libreria.
Ho scaricato anche iReport che mi permette di creare il report direttamente disegnandolo.
Ho quindi creato un semplice file da ireport con due campi NOME e COGNOME e la query apposita.
Poi ho provato a generare il codice per connettermi al db e elaborare il report creato, ho seguito un tutorial su html.it,ma in fase di runtime mi solleva un-eccezione dicendomi di non riuscire a trovare i campi del db.
Il problema e' che sul report ho inserito la query ma non i parametri di connessione, che ho definito a codice nella mia applicazione.
Codice sorgente - presumibilmente Java |
//in una classe ho questo metodo, che richiama il metodo di un-ulteriore classe, //che gestisce le connessioni, che puoi vedere di seguito public static void creaPdfJasper() { String filename = "testReport"; System. out. println("caricamento file JRXML"); // caricamento file JRXML try{ JasperDesign jasperDesign = JRXmlLoader.load(folder + filename + ".jrxml"); //compilazione del file e generazione del file JASPER JasperCompileManager.compileReportToFile(jasperDesign, folder + filename + ".jasper"); //inizializzazione connessione al database SQLTools sqlTool = new SQLTools(); sqlTool.creaJasper(folder,filename); System. out. println("errore nel caricamento dei dati : " + e. getMessage()); } catch (JRException e) { System. out. println("errore nel riempimento dei campi : " + e. getMessage()); } } //classe SQL Tools System. out. println("creaJasper method richiamato"); try{ if(!DriverLoad()){ System. out. println("errore nel caricamento del driver " ); }else{ c = connect(); // rendering e generazione del file PDF JasperPrint jp = JasperFillManager.fillReport(folder + filename + ".jasper", null, c); JasperExportManager.exportReportToPdfFile(jp, folder + "PROVA_JASPER.pdf"); } System. out. println("errore nel caricamento dei dati : " + e. getMessage()); } catch (JRException e) { System. out. println("errore nel riempimento dei campi : " + e. getMessage()); } finally{ c.close(); } }
|
L'eccezione mi viene sollevata prima che si arrivi al codice di connessione al db,ovvero
alla riga
JasperCompileManager.compileReportToFile(jasperDesign, folder + filename + ".jasper");
A console mi da
errore nel riempimento dei campi : Report design not valid :
1. Field not found : NOME
2. Field not found : COGNOME
Ma e' ovvio, ancora non ha eseguito la connessione al db che avrebbe fatto piu' avanti..
Hai idee?
non so piu' dove sbattere la testa..
Ultima modifica effettuata da symonx80 il 19/01/2010 alle 19:22 |
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
io avevo questi codici:
Codice sorgente - presumibilmente Java |
Map<String, String> sqlquery = new HashMap<String, String>(); sqlquery.put("MySQLQuery", query); JasperPrint jp = JasperFillManager.fillReport(tipoReport + ".jasper", sqlquery, conn); if(formato == PDF_REPORT) JasperExportManager.exportReportToPdfFile(jp, outputdir.getAbsolutePath()); else if(formato == HTML_REPORT) JasperExportManager.exportReportToHtmlFile(jp, outputdir.getAbsolutePath()); else throw new JRException("Si è indicato un formato non supportato."); }
|
Poi nel file jrxml avevo fra le altre cose:
Codice sorgente - presumibilmente Plain Text |
<parameter name="MySQLQuery" isForPrompting="true" class="java.lang.String"/>
<queryString><![CDATA[$P!{MySQLQuery}]]></queryString>
<field name="Cognome" class="java.lang.String"/>
<field name="Nome" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<field name="telefono" class="java.lang.Integer"/>
<field name="website" class="java.lang.String"/>
<field name="nickname" class="java.lang.String"/>
|
E nei punti dove volevo inserire questi fiels usavo:
Codice sorgente - presumibilmente Plain Text |
<text><![CDATA[Cognome]]></text>
|
Buona parte del codice jrxml veniva generato da iReport, e anche il file .jasper se non sbaglio lo compilava lui. Ultima modifica effettuata da netarrow il 19/01/2010 alle 20:47 |
|
symonx80 (Normal User)
Pro
Messaggi: 107
Iscritto: 30/07/2009
|
La questione e' che io utilizzo SQL Server 2005 come database, non contemplato a quanto pare da iReport. Quindi nel disegnare il mio report io inserisco solamente la query ma non setto i parametri di connessione. Cosa che faccio poi sulla mia applicazione.
I parametri sono corretti in quanto per altre query che non utilizzano il report tutto funziona come deve.
Che tu sappia iReport ha necessit' di avere una query e una corretta configurazione di connessione per poter compilare i file .jasper?
Grazie per l'aiuto che mi stai dando!
|
|
symonx80 (Normal User)
Pro
Messaggi: 107
Iscritto: 30/07/2009
|
Postato originariamente da symonx80:
La questione e' che io utilizzo SQL Server 2005 come database, non contemplato a quanto pare da iReport. Quindi nel disegnare il mio report io inserisco solamente la query ma non setto i parametri di connessione. Cosa che faccio poi sulla mia applicazione.
I parametri sono corretti in quanto per altre query che non utilizzano il report tutto funziona come deve.
Che tu sappia iReport ha necessit' di avere una query e una corretta configurazione di connessione per poter compilare i file .jasper?
Grazie per l'aiuto che mi stai dando! |
Ho provato e son riuscito a fare qualche passo avanti.
Ora il problema mi viene dato alla riga
JasperExportManager.exportReportToPdfFile(jp, outputdir.getAbsolutePath());
che io ho sostituito con
JasperExportManager.exportReportToPdfFile(jp, ""C:/TEMP/FileTest.pdf");
Codice sorgente - presumibilmente Delphi |
20-gen-2010 11.14.11 org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet Controller threw exception java.lang.ClassNotFoundException: com.lowagie.text.DocumentException at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:303) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316) at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:117) at org.me.betaLib.SQLTools.generaJasper(SQLTools.java:163) at org.me.betaLib.Controller.doGet(Controller.java:74) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:619)
|
l'errore e' il seguente, e sembra un po' piu' critico del precedente..
edit by netarrow: corretta la sformattazione Ultima modifica effettuata da netarrow il 20/01/2010 alle 10:27 |
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
|
|