Servlet welches PDF erzeugt

neela

Bekanntes Mitglied
Hallo

Mir wurde die Aufgabe gestellt ein Servlet zu Programmieren, welches PDF erzeugt.

Mein momentanes Problem besteht darin das ich nur den Hauptspeicher nutzen soll.
Könntet Ihr mir vlt ein paar Tips geben wie ich das bewerkstelligen kann.

Mein Servlet steht an sonsten auch und auch das erzeugen der PDF mit JasperReport ist kein Problem wenn ich diese beispielsweise auf C: speichere. Was ich ja nicht machen soll.

Ich bin euch für jeden Rat dankbar.
 
Ich kenne mich zwar mit JasperReport nicht aus, aber kannst du da nicht den OutputStream rausziehen und anstatt den in die Datei zu schreiben als Output für den Servlet verwenden?
 
JasperReport schreibt doch in einen beliebigen OutputStream und ein Servlet hat die HttpResponse mit OutputStream?

siehe zum Teil (auch für ContentType der Response) z.B.
Web Server Java -- Servlets and JSP - O'Reilly Media

bzw. vielleicht noch passender
David R. Heffelfinger's Ensode.net - Displaying JasperReports PDF Reports on the Browser
dort mit byte[] als Zwischenspeicher

meine Suche war 'servlet setContentType pdf jasperreport',
setContentType konntest du sicher nicht ahnen wenn gar keine Ahnung davon, ohne dieses Stichwort wäre aber auch viel zu finden gewesen..
 
vielen dank für die links

momentan versteh ich noch bahnhof aber vlt bekomme ich ja gleich doch noch die erleuchtung 🙂
und weis welche parts ich übernehmen muss
 
In SlaterBs zweiten link steht eigentlich alles was du brauchst. Den Report in ein byte[] speichern und dann den byte[] an den Browser per Response Output Stream schicken.
 
Java:
byte[]bytes = null;

try {
			String file = (Datenbank.template("Sachdaten")).toString();
			jasperReport = JasperCompileManager.compileReport(file);
			jPrint = JasperFillManager.fillReport(jasperReport, parameter,
					new JREmptyDataSource());

			// Speicherung als Temporäre Datei
			
	
			String pdf1 = File.createTempFile("temp1", ".pdf").toString();
			JasperExportManager.exportReportToPdfFile(jPrint, pdf1);

das ist nun ein kleinen Teil von meinem Programm und diesen
Java:
JasperExportManager.exportReportToPdfFile(jPrint, pdf1);
muss ich jetzt in das Byte schreiben


PS. sry das ich mich so dumm anstellen hab bis jetzt nur standalone-Programme geschrieben wo alles irgendenwie ein bissl einfacher war 🙁
 
Ja, einfach statt:
Java:
            String pdf1 = File.createTempFile("temp1", ".pdf").toString();
            JasperExportManager.exportReportToPdfFile(jPrint, pdf1);

dies hier:
Java:
            byte[] bytes = JasperExportManager.exportReportToPdf(jPrint);

Dann den byte[] in den OutputStream schreiben, wie in dem Beispiel.
 
JasperExportManager in Suchmaschine eintippen, API-Seite finden, andere Methoden der Klasse anschauen,

wenn du sie schon nicht verstehst, dann liste als deinen Teil der Arbeit wenigstens alle Methodennamen + Rückgabewerte hier auf

edit: zu spät zum Lernen 😉
 
danke danke das problem is nun fast gelöst wenn ich jetzt nur keine nullpointerexception bekommen würde in der Zeile 156 irgendwas stimmt da wohl mit meinem response nicht


Code der mainklasse
Java:
package nutzschnittstelle;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class start
 */

/**
 * Start des Programmes für die Ausgabe der Bodenrichtwerte
 */
public class start extends HttpServlet {
	private static final long serialVersionUID = 1L;
private static HttpServletResponse response;
	public static HttpServletResponse getResponse() {
	return response;
}

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public start() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		fachlogik.Datenbank.setRequest(request);
		//System.out.println(new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date()));
		// fachlogik.Pdf.creat_pdf();
		
		fachlogik.Xml.xml_auslesen();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

und hier der Code der Klasse welche die Pdf´s erzeugt
Java:
package fachlogik;


/**
 * Diese Klasse wird zum generieren der PDF`s verwendet
 */
public class Pdf {
	/**
	 * Diese HashMap enthält alle Variablen, die für das Erstellen der PDF
	 * notwendig sind.
	 */
	static HashMap<String, Object> parameter = new HashMap<String, Object>();
	static JasperReport jasperReport;
	static JasperPrint jPrint;
	static Image wappen;
	static byte[] bytes= null;

	
	public static void creat_pdf(String aufnahmeausschuss, String aufnahmestr,
			String plzort, String aufnahmeort, String ortsteil, String gmd,
			String gmk, String flst, String str, String nr, String bwNr,
			String stag, String bwert, String entw, String nuta, String beit,
			String bauw, String gez, String gfz, String grz, String bmz,
			String flae, String gtie, String gbrei, String verg, String verf,
			String bod, String acza, String grza, String aufw, String weer,
			String erstellungsausschuss, String erstellungsort,
			String plzOrtStrNr, String verordnung, String fundstelle,
			String stichtag, String farbe) {
		
		HttpServletResponse response = nutzschnittstelle.start.getResponse();
		
		String name;
		if (aufnahmeausschuss.contains("Kreis"))
			name = " der Kreisfreien Stadt " + aufnahmeort + " ";// ggf Ort über

		else
			name = " im Landkreis " + aufnahmeausschuss + " ";

		// füllen der Hashmap
		// Daten des Aufnahmeausschuss der hashmap hinzufügen
		parameter.put("aAufnahmeAusschuss", name);
		parameter.put("aStrAufnahmeAusschuss", aufnahmestr);
		parameter.put("aOrtAufnahmeAusschuss", plzort);

		if (erstellungsausschuss.contains("Kreis"))
			name = "Gutachterausschuss der Kreisfreien Stadt " + erstellungsort;

		else {
			if (erstellungsausschuss.contains("Oberer")) {
				name = "Oberer ";
			} else
				name = "Landkreis "
						+ erstellungsausschuss;
		}
		// Daten des Erstellungsausschuss der Hashmap hinzufügen
		parameter.put("aErstellungsAusschuss", name);
		parameter.put("aPLZOrtStrNrErstellungsAusschuss", plzOrtStrNr);

		// Daten für die Sachdatenauskunft der Hashmap hinzufügen
		parameter.put("aOrtsteil", ortsteil);
		parameter.put("aStr", str);
		parameter.put("aHnr", nr);
		parameter.put("aGmd", gmd);
		parameter.put("aGmk", gmk);
		parameter.put("aFlst", flst);
		parameter.put("aBwNr", bwNr);
		parameter.put("aSTag", stag);
		parameter.put("aBwert", bwert + "  ");
		parameter.put("aEntw", entw);
		parameter.put("aNuta", nuta);
		parameter.put("aBeit", beit);
		parameter.put("aBauw", bauw);
		parameter.put("aGez", gez);
		parameter.put("aGfz", gfz);
		parameter.put("aGrz", grz);
		parameter.put("aBmz", bmz);
		parameter.put("aFlae", flae);
		parameter.put("aGtie", gtie + " m");
		parameter.put("aGbrei", gbrei + " m ");
		parameter.put("aVerg", verg);
		parameter.put("aVerf", verf);
		parameter.put("aBod", bod);
		parameter.put("aAcza", acza);
		parameter.put("aGrza", grz);
		parameter.put("aAufw", aufw);
		parameter.put("aWeer", weer);

	
		
		// Pdf erzeugen
		try {
		String file = (Datenbank.template("Sachdaten")).toString();
			jasperReport = JasperCompileManager.compileReport(file);
			jPrint = JasperFillManager.fillReport(jasperReport, parameter,
					new JREmptyDataSource());

		
			
	
		bytes = JasperExportManager.exportReportToPdf(jPrint);
			
			 ServletOutputStream servletOutputStream = response.getOutputStream();

		      servletOutputStream.write(bytes, 0, bytes.length);
		      servletOutputStream.flush();
		      servletOutputStream.close();
			
		} catch (JRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
ich denke mal die anderen Klassen sind für das Problem uninteressant
 
Zuletzt bearbeitet:
[JAVA=66]HttpServletResponse response = nutzschnittstelle.start.getResponse();[/code]
Da wird wohl null zurückkommen. Aber der Aufbau ist eh irgendwie... hm... komisch auf den ersten Blick.

Nachtrag: warum ist bei der der Response in den Servlet statisch? oO
 

Zurück
Oben