# Jasperreport: Dateihandling bei Webanwendungen



## tec1 (7. Apr 2005)

Hallo Leute,

ich generiere in der Action einer Struts-Anwendung eine Jasper-XML-Datei und erzeuge daraus eine PDF-Datei aus den Eingaben des Benutzers. Soweit funktioniert alles sehr gut. 
Mit

```
JasperExportManager.exportReportToPdfFile(jasperPrint, pdfFile);
```
erzeuge ich das PDF-Dokument(String pdfFile (Datei mit Pfad)).

Jetzt aber zu meinem Problem. Wenn in meiner Webanwendung 20 Leute "gleichzeitig" einen Report generieren lassen, wie kann ich dann sicherstellen welche Person (Session) welchen Report erhält und im Browser anschauen kann?
Da der String pdfFile einem bestimmten Pfad auf dem Server zugeordnet ist, greifen ja alle 20 User auf die gleiche PDF-Datei zu. Jeder Benutzer muss natürlich seinen individuell generierten Report angezeigt bekommen

Wie würdet ihr das Problem lösen?

Gruß


----------



## DP (7. Apr 2005)

hi. bei mir benenne ich das file mit einem prefix + timestamp in millisekunden. ist relativ unwahrscheinlich, dass mehrere user gleichzeitig da reinlaufen...


----------



## tec1 (7. Apr 2005)

Hallo DP,
über so etwas habe ich kurzeitig auch nachgedacht, aber Jasperreport kann einen Report auch in ein ByteArray schreiben, welches dann per Stream an den Client geschickt wird.
hier mal ein ganz guter Link:

[url]http://www.adcworks.com/blog...ith-jasperreports-with-struts-and-a-database/
[/url]


----------



## tec1 (7. Apr 2005)

Hallo DP,
über so etwas habe ich kurzeitig auch nachgedacht, aber Jasperreport kann einen Report auch in ein ByteArray schreiben, welches dann per Stream an den Client geschickt wird.
hier mal ein ganz guter Link:

[url]http://www.adcworks.com/blog...ith-jasperreports-with-struts-and-a-database/
[/url]


----------



## DP (7. Apr 2005)

thx für den link


----------



## tec1 (8. Apr 2005)

Hallo,

im Prinzip braucht man nicht eine einzige Datei auf dem Server speichern:

Teil der execute-methode der Action

```
PrintTest print = new PrintTest();
    byte[] bytes=print.startPrinting(null);
    
    response.setContentType("application/pdf");
    response.setContentLength(bytes.length);
    ServletOutputStream outputStream=null;
	try {
		outputStream = response.getOutputStream();
	} catch (IOException e1) {
		e1.printStackTrace();
	}
    try {
		outputStream.write(bytes, 0, bytes.length);
		outputStream.flush();
		outputStream.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
    
    return null;
```

relevante Teile der Klasse PrintTest 

```
public byte[] startPrinting (String servletpath)
  {
    if (null==servletpath){
    	ByteArrayOutputStream boutStream=createXML(null);
    	byte[] bytes = print_with_Stream(boutStream);
    	return bytes;
    }
    
    return null;
  }
```


```
public ByteArrayOutputStream createXML(String filename){
    
    //  JDom Dokument erzeugen
    SAXBuilder builder = new SAXBuilder();
    Document doc = new Document();
    
    //doctype(elementname, public ID, system ID)
    DocType doctype = new DocType("jasperReport", 
                                  "-//JasperReports//DTD Report Design//EN",
                                  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd");
    
    doc.setDocType(doctype);
    Element root = new Element("jasperReport");
    
    root.setAttribute("name", "Testreport");
    root.setAttribute("pageWidth", "2500");
    root.setAttribute("pageHeight", "2100");
    root.setAttribute("columnWidth", "2460");
    root.setAttribute("leftMargin", "20");
    root.setAttribute("rightMargin", "20");
    root.setAttribute("topMargin", "50");
    root.setAttribute("bottomMargin", "50");
    
    doc.setRootElement(root);
    Element title = new Element("title");
    root.addContent(title);
    
    Element band = new Element("band");
    band.setAttribute("height", "2000");
    title.addContent(band);
    
    for (int i=0; i<100; i++){
	    for(int i2=1; i2<=17; i2++){
	    	Element staticText1 = new Element("staticText");
		    band.addContent(staticText1);
		    
		    Element reportElement = new Element("reportElement");
		    reportElement.setAttribute("x", String.valueOf(i2*100));
		    reportElement.setAttribute("y", String.valueOf(i*20));
		    reportElement.setAttribute("width", "100");
		    reportElement.setAttribute("height", "20");
		    staticText1.addContent(reportElement);
		    
		    //leeres Textelement
		    Element textElement = new Element("textElement");
		    staticText1.addContent(textElement);
		    
		    Element text1 = new Element("text");
		    CDATA cdata = new CDATA("");
		    //cdata-element mit inhalt füllen und an textelement anfügen (append geht auch)
		    cdata.setText("Test - Report");
		    text1.addContent(cdata);
		    staticText1.addContent(text1);
	    }
    }
    
    try {
      
      if(null==filename){
      	//xml-Doc in Bytearrayoutpustream speichern
      	ByteArrayOutputStream boutStream = new ByteArrayOutputStream();
      	XMLOutputter out = new XMLOutputter();
        out.output(doc, boutStream);
        return boutStream;
        
      }
      else{
        //speichern des XML-Doc in XML-Datei
        FileOutputStream file = new FileOutputStream(filename);	
        XMLOutputter out = new XMLOutputter();
        // ordentliche Einrückungen
        out.setFormat(Format.getPrettyFormat());
        out.output(doc,file);
      }
      
    } 
    catch (IOException e) {e.printStackTrace();}
    
    return null;
  }
```



```
public byte[] print_with_Stream(ByteArrayOutputStream boutStream){
  	JasperReport jReport=null;
  	byte[] bytes=null;
  	
  	try {
		ByteArrayInputStream inStream = new ByteArrayInputStream(boutStream.toByteArray());
		jReport = JasperCompileManager.compileReport(inStream);
	} catch (JRException e1) {
		e1.printStackTrace();
	}
	
  	try {
		bytes=JasperRunManager.runReportToPdf(jReport, null, new JREmptyDataSource());
  	} catch (JRException e) {
		e.printStackTrace();
	}
  	return bytes;
  }
```



Gruß


----------



## tec1 (8. Apr 2005)

Mit der Generierung von PDF-Reports klappt das sehr gut.
Weiss jemand, wie ich HTML-Reports erstellen kann,ohne diese in einer Datei auf dem Server speichern zu müssen?


----------



## tec1 (10. Apr 2005)

Bei HTML funktioniert das Ganze etwas anders, geht aber auch sehr gut. Mal ein kleines Tutorial:
http://www-106.ibm.com/developerworks/websphere/library/techarticles/0411_olivieri/0411_olivieri.htm


----------



## DP (10. Apr 2005)

tec1 hat gesagt.:
			
		

> Bei HTML funktioniert das Ganze etwas anders, geht aber auch sehr gut. Mal ein kleines Tutorial:
> http://www-106.ibm.com/developerworks/websphere/library/techarticles/0411_olivieri/0411_olivieri.htm



404 :###


----------



## tec1 (10. Apr 2005)

http://www-106.ibm.com/developerwor...techarticles/0411_olivieri/0411_olivieri.html

das fehlte das l am ende.
Die links sind übrigens alle von der jasperreport-Seite

http://jasperreports.sourceforge.net/community.html

unter articles


----------

