# iText + neue Seite



## The_S (21. Nov 2006)

Hi,

ich erstelle mir mittels iText ein PDF. Auf dieses Zeichne ich mit Graphcis2D Daten aus einer Datenbank. Jetzt kann es aber vorkommen, dass diese Daten mehr Platz als eine Seite kosten. Wie stelle ich es am geschicktesten an, dass alle Daten die nicht auf eine Seite passen auf eine neue eingefügt werden? Bzw. mir würde es vermutlich schon genügen, wenn ich wüsste wie man überhaupt neue Seiten anlegt. Google is da nicht so ergiebig und ich bin ziemlich neu in dem Thema ... :cry:

Danke für Antworten


----------



## thE_29 (21. Nov 2006)

Ganz genau weiß ich es auch nicht, aber die iText Hilfe ist ja sehr super!

Schau dir einfach das Kapitel mit Bildern an!


----------



## The_S (21. Nov 2006)

was für ne iText Hilfe?


----------



## thE_29 (21. Nov 2006)

O, ich meinte Tutorial 

http://itextdocs.lowagie.com/tutorial/


----------



## The_S (21. Nov 2006)

jup, da war ich auch schon. Hilft mir aber leider nicht wirklich. Am besten ich poste mal ein bisschen Code  . Das ganze läuft in einem Servlet:

Diese Methode wird in der doPost aufgerufen:


```
private void openPDF(HttpServletResponse response, HttpServletRequest request) {
		
	    try {	
	    	Document document = new Document();
	    	ByteArrayOutputStream os = new ByteArrayOutputStream();
	    	PdfWriter writer = PdfWriter.getInstance(document, os);
	    	document.open();
	    	PdfContentByte cb = writer.getDirectContent();
	    	Graphics2D graphics2D = cb.createGraphics(PageSize.A4.width(), PageSize.A4.height());
	    	drawPDF(graphics2D, request);
	    	graphics2D.dispose();
	    	document.close(); 
	    	response.setHeader("Expires", "0"); 
	    	response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
	    	response.setHeader("Pragma", "public");
	    	response.setContentType("application/pdf"); 
	    	response.setContentLength(os.size());
	    	ServletOutputStream out = response.getOutputStream();
	    	os.writeTo(out);
	    	out.flush(); 
	    } 
	    catch (Exception e) {
	    	e.printStackTrace();
	    }
	}
```

Hier wird das PDF gezeichnet:


```
private void drawPDF(Graphics2D g, HttpServletRequest request) {
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		int high = 15;
		int pageHigh = 15;
		char lastStart = '1';
		String number = null;
		String text = null;
    	try {
		 // DB Connection aufbauen und results in ResultSet "rs" speichern
	    	while (rs.next()) {
	    		if (pageHigh >= PageSize.A4.height()) {
	    			System.out.println("New Page"); // Hier soll eine neue Seite eingefügt werden
	    			pageHigh = 15;
	    		}
	    		text = rs.getString("WAT_TEXT");
	    		number = rs.getString("WAT_NUMMER");
	    		if (number.charAt(0) != lastStart) {
	    			lastStart = number.charAt(0);
	    			g.drawString("Summe", 30, high);
	    			high += 15;
	    			pageHigh += 15;
	    		}
	    		g.drawString(number + "  " + text, 30, high);
				 high += 15;
				 pageHigh += 15;
	    	}
    	}
		 catch (Exception e) {
			 e.printStackTrace();
		 }
    	finally {
         	/*Alle DB aktivitäten beenden*/
		 }
	}
```

Übergebe ich der "drawPDF" Methode noch zusätzlich das Document und mach an der entsprechenden Stelle in meinem Code ein "document.newPage()" bekomm ich eine RuntimeException mit der Aussage "Unbalanced save/restore state operators"


----------



## thE_29 (21. Nov 2006)

Was willst du den zeichnen?!

Wenn es nur Bilder sind, nimm doch die standard Bild Methoden!

http://itextdocs.lowagie.com/examples/com/lowagie/examples/objects/images/Images.java

Oder zeichne es und speichere es als BufferedImage ab und klebs dann rauf!


----------



## The_S (21. Nov 2006)

Ne, sind jede Menge Daten aus ner Datenbank. Will das nur sehr flexibel anordnen können, weshalb ich alles selber Zeichnen möchte. Also keine Bilder 



			
				thE_29 hat gesagt.:
			
		

> Oder zeichne es und speichere es als BufferedImage ab und klebs dann rauf!



Und da hab ich dann automatisch neue Seiten drin?


----------



## thE_29 (21. Nov 2006)

Ich glaub dass das automatisch dann macht!

Probiers mal mit nem großen Bild aus!


----------



## The_S (21. Nov 2006)

Großes Bild is schlecht, muss ich erst dem Sys-Admin geben, der das ganze aufn Server klatscht. Und das dauert  . Wie bekomm ich den ein BufferedImage oder  Graphics2D-Objekt in ein iText Image?


----------



## thE_29 (21. Nov 2006)

static Image 	getInstance(Image image, Color color)
          Gets an instance of an Image from a java.awt.Image.


http://itextdocs.lowagie.com/docs/com/lowagie/text/Image.html


----------



## The_S (21. Nov 2006)

ah, ich dachte es handelt sich dabei um ein iText-Image ^^. Aber leider kommt es zu keinem Zeilenumbruch ... 

[edit] geänderter Code:


```
BufferedImage img = new BufferedImage((int)PageSize.A4.width(), (int)PageSize.A4.height() * 2, BufferedImage.TYPE_INT_RGB);
	    	Graphics2D graphics2D = img.createGraphics();
	    	drawPDF(graphics2D, request);
	    	graphics2D.dispose();
	    	document.add(Image.getInstance(img.getScaledInstance(img.getWidth(), img.getHeight(), java.awt.Image.SCALE_SMOOTH), Color.white));
```


----------



## The_S (22. Nov 2006)

sry fürs pushen, aber mir läuft gerade irgendwie die Zeit weg :cry:


----------



## thE_29 (22. Nov 2006)

Du willst das er dir das Bild "abbricht" oder so?

Also aufteilt?

Oder was macht er falsch?!


----------



## The_S (22. Nov 2006)

Also wenn ich das Graphics2D Objekt am Ende NICHT dispose bekomm ich mit document.newPage() eine neue Seite angezeigt und kann dort dann auch gleich weiter zeichnen. Funktioniert jetzt also alles super (wenn ich auch keine Ahnung hab warum), danke @ thE_29  .

Sollte jemand wissen, warum ich die Grafik nicht disposen darf, sobald ich eine neue Seite einfüge, kann er mir das ja hier mitteilen *neugierig bin*.


----------



## Ketev (11. Jan 2007)

google mal nach "PageEvents" , das ist das was du haben willst.


----------

