Oppure

Loading
15/01/10 10:01
symonx80
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

aetnanet.org/download/FC/pensioni/…

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 15/01/10 10:55
aaa
15/01/10 13:49
netarrow
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.
aaa
19/01/10 16:42
symonx80
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?
aaa
19/01/10 16:45
netarrow
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.
aaa
19/01/10 18:21
symonx80
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.


//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 folder   = "C:/TEMP/";
		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);
		}catch(SQLException e){
			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
public void creaJasper(String folder,String filename) throws SQLException{
		Connection c = null;
		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");
			}
		}catch(SQLException e){
			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 19/01/10 18:22
aaa
19/01/10 19:44
netarrow
io avevo questi codici:

  static void genera(String tipoReport, String query, Connection conn, int formato, File outputdir) throws JRException {
	  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:

<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:

<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 19/01/10 19:47
aaa
20/01/10 8:45
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!
aaa
20/01/10 9:20
symonx80
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, ""/TEMP/…;);

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.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 20/01/10 9:27
aaa