Jasperreport-Druck aus Java heraus dauert zu lange

garcuen

Grünschnabel
Benutze folgenden Quellcode um aus Java heraus einen Report zu drucken:

PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
printRequestAttributeSet.add(MediaSizeName.ISO_A4);
PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
printServiceAttributeSet.add(new PrinterName("HP LaserJet 4250 PCL 6 #2", Locale.getDefault()));
JRPrintServiceExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, printRequestAttributeSet);
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printServiceAttributeSet);
exporter.exportReport();


Leider vergehen bei der Methode exporter.exportReport() 20 Sekunden und das ist viel zu lange?! Weiß jemand wie ich das schneller hinkriegen könnte?
 
Hi
Besteht der Jasperreport nur aus Text oder hast du da möglicherweise auch Diagramme drauf?

Also normalerweise wird so gedruckt:
Java:
try {
         JasperPrintManager.printReport(jasperPrint, true);
     } catch (Exception ex) {
         ex.printStackTrace();
         JOptionPane.showMessageDialog(JRViewer.this,
                                       getBundleString("error.printing"));
     }

Allerdings geht hier ein Druckdialog auf, was du ja anscheinend nicht willst.

Eine andere Möglichkeit wäre das ganze via PDF aus zu drucken, damit könntest du möglicherweise einiges an Zeit gewinnen.

Gruss
 
Ah sorry, habe ganz vergessen etwas dazu zuschreiben und zwar möchte ich vorher immer einen bestimmten Drucker wählen können, ansonsten wäre ja
"JasperPrintManager.printReport(jasperPrint, false);" die beste Lösung.

Den Drucker kann ich bei meiner "larmarschigen" Lösung hiermit einstellen:
printServiceAttributeSet.add(new PrinterName("HP LaserJet 4250 PCL 6 #2", Locale.getDefault()));

Hintegrund dabei ist, dass damit eine Papierschachtsteuerung bezweckt werden soll. Ich habe nämlich zwei mal den gleichen Drucker installiert und jeweils einen anderen Standardschacht gewählt. Vielleicht kann man ja irgendwie aus dem Java-Programm heraus den Papierschacht ansteuern, was ich aber nicht glaube.

Vielen Dank und Gruß,
Sargon
 
Hab das gelöst indem ich folgende Klassen von JasperReports geändert habe:

- net.sf.jasperreports.engine.JasperPrint
- net.sf.jasperreports.engine.print.JRPrinterAWT

In die JasperPrint habe ich die Methode "getPrinterName(String)" und "setPrinterName(String)" hinzugefügt:

Code:
String printerName="";
	
	/**	
	* @return Returns the printerName.
	*/
	public String getPrinterName() {
	return printerName;
	} 
	
	/**
	* @param printerName
	* The printerName to set.
	*/
	public void setPrinterName(String printerName) {
	this.printerName = printerName;
	}
und in der JRPrinterAWT habe ich den Part von

// fix for bug ID 6255588 from Sun bug database [beginnt ca. bei Zeile 140]
initPrinterJobFields(printJob);
........
bis
......
return isOK;[bis }("Klammer zu")]

hiermit ersetzt:

Code:
/* ignacio: verifico si se paso un nombre de red de impresora */
		if (jasperPrint.getPrinterName() != null
		&& jasperPrint.getPrinterName().length() > 0) {
		/* busco la impresora */
		PrintService[] services = PrinterJob.lookupPrintServices();
		if (services.length == 0) {
		/* no hay impresoras configuradas */
		throw new JRException("No hay ninguna impresora configurada!");
		}
		boolean existe = false;
		/* si hay impresoras configuradas, comparo los nombres */
		for (int i = 0; i < services.length; i++) {
		PrintService ps = services[i];
		if (ps.getName().equals(jasperPrint.getPrinterName())) {
		try {
		/* la impresora existe y esta configurada */
		printJob.setPrintService(ps);
		} catch (PrinterException e) {
		throw new JRException(
		"Error al asignar el PrintService '"
		+ ps.getName() + "' al PrintJob", e);
		}
		existe = true;
		break;
		}
		}
		if (!existe) {
		/* la impresora no existe entre las configuradas */
		throw new JRException("La impresora '"
		+ jasperPrint.getPrinterName()
		+ "' no esta configurada!");
		}
		}
		PageFormat pageFormat = printJob.defaultPage();
		Paper paper = pageFormat.getPaper();

		switch (jasperPrint.getOrientation()) {
		case JRReport.ORIENTATION_LANDSCAPE: {
		pageFormat.setOrientation(PageFormat.LANDSCAPE);
		paper.setSize(jasperPrint.getPageHeight(), jasperPrint
		.getPageWidth());
		paper.setImageableArea(0, 0, jasperPrint.getPageHeight(),
		jasperPrint.getPageWidth());
		break;
		}
		case JRReport.ORIENTATION_PORTRAIT:
		default: {
		pageFormat.setOrientation(PageFormat.PORTRAIT);
		paper.setSize(jasperPrint.getPageWidth(), jasperPrint
		.getPageHeight());
		paper.setImageableArea(0, 0, jasperPrint.getPageWidth(),
		jasperPrint.getPageHeight());
		}
		}

		pageFormat.setPaper(paper);

		Book book = new Book();
		book.append(this, pageFormat, lastPageIndex - firstPageIndex + 1);
		printJob.setPageable(book);
		try {
		if (withPrintDialog) {
		if (printJob.printDialog()) {
		printJob.print();
		} else {
		isOK = false;
		}
		} else {
		printJob.print();
		}
		} catch (Exception ex) {
		throw new JRException("Error printing report.", ex);
		}

		return isOK;


Noch mal zur INFO:
- verwende JasperReports 1.3.3
- Benutzung dieser Anleitung auf eigene Gefahr, denn hier wird der Sourcecode von Jasperreports geändert

Gruß,
garcuen
 
Zurück