# iText - 2. Seite pdf



## Zapp_Branigan (31. Okt 2009)

Ich habe gerade zwei Stunden versucht eine zweite Seite in mein pdf einzufügen und dann mit G2D wie auf der ersten Seite schon erfolgreich geschafft. Ich bin bisschen am Verzweifeln, denke aber es ist recht einfach.
Ich würde mich sehr freuen wenn mir einer von euch die Lösung sagen kann...


```
Document document = new Document();
	        
	        try {
	            
	            // step 2: creation of the writer
	            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(name+".pdf"));
	            document.setPageSize(PageSize.A4.rotate());
	            
	            document.newPage();
	            
	            // step 3: we open the document
	            document.open();
	            
				
				
	            System.out.println( document.getPageSize());
	            // step 4: we grab the ContentByte and do some stuff with it
	            
	            // we create a fontMapper and read all the fonts in the font directory
	            DefaultFontMapper mapper = new DefaultFontMapper();
	            FontFactory.registerDirectories();
	            //mapper.insertDirectory("c:\\windows\\fonts");
	            
	            // we create a template and a Graphics2D object that corresponds with it
	            int w = 842;
	            int h = 595;
	            PdfContentByte cb = writer.getDirectContent();
	            
	           
	            
	            PdfTemplate tp = cb.createTemplate(w, h);
	            Graphics2D g2 = tp.createGraphics(w, h, mapper);
	            
	            BufferedImage image = ImageIO.read( new File( "data"+File.separator+"img"+File.separator+"profilbogen.jpg" ) ); 
	            
	            
	            g2.drawImage(image, 0, 0, 842, 595, null);
	           

	
	            
	            document.newPage();
	            
	            g2.dispose();
	            tp.sanityCheck(); // all the g2 content is written to tp, not cb
	            cb.addTemplate(tp, 0, 0);
	            
	                
//Hier würde ich jetzt gerne noch eine 2. Seite einfügen auf die ich mit Graphics2d zeichne...


	        }
	        catch(DocumentException de) {
	            System.err.println(de.getMessage());
	        }
	        catch(IOException ioe) {
	            System.err.println(ioe.getMessage());
	        }
	        
	        // step 5: we close the document
	        document.close();
```


----------



## max40 (31. Okt 2009)

```
// ...

// step 3: we open the document
document.open();

PdfContentByte cb = writer.getDirectContent();
PdfTemplate tp = cb.createTemplate(400,400);
Graphics2D g2 = tp.createGraphics(400,400);

g2.drawString("Test Seite 1", 75, 75);
cb.addTemplate(tp, 25,25);
 
document.newPage();
    
tp = cb.createTemplate(400,400);
g2 = tp.createGraphics(400,400);
  
g2.drawString("Test Seite 2", 75, 75);

cb.addTemplate(tp, 25,25);
    
// ...
```


----------



## Zapp_Branigan (31. Okt 2009)

Ich bin immernoch zu dumm :-( tut mir leid ich habe jetzt versucht dein Beispiel zu integrieren aber es kommt eine Fehlermeldung: "Exception in thread "main" com.lowagie.text.exceptions.IllegalPdfSyntaxException: Unbalanced save/restore state operators."

Ich habe jetzt nochmal meine komplette Methode eingefügt wer sie zum Laufen bekommt ist mein persönlicher Held für heute 


```
public void exportPDF()
	    {
	    	 
	        System.out.println("Using the java.awt.Graphics2D-object");
	        
	        // step 1: creation of a document-object
	        Document document = new Document();
	        
	        try {
	            
	            // step 2: creation of the writer
	            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(name+".pdf"));
	            document.setPageSize(PageSize.A4.rotate());
	            
	            
	            
	            // step 3: we open the document
	            document.open();
	            
	            PdfContentByte cb = writer.getDirectContent();
	            PdfTemplate tp = cb.createTemplate(400,400);
	            Graphics2D g2 = tp.createGraphics(400,400);
	             
	            g2.drawString("Test Seite 1", 75, 75);
	            cb.addTemplate(tp, 25,25);
	             
	            document.newPage();
	                
	            tp = cb.createTemplate(400,400);
	            g2 = tp.createGraphics(400,400);
	              
	            g2.drawString("Test Seite 2", 75, 75);
	             
	            cb.addTemplate(tp, 25,25);
	                
	            
				
	            
	            g2.dispose();
	            tp.sanityCheck(); // all the g2 content is written to tp, not cb
	            cb.addTemplate(tp, 0, 0);
	            
	           
	            
	        }
	        catch(DocumentException de) {
	            System.err.println(de.getMessage());
	        }
	        catch(IOException ioe) {
	            System.err.println(ioe.getMessage());
	        }
	        
	        // step 5: we close the document
	        document.close();
	    }
```


----------



## max40 (31. Okt 2009)

das find ich garnicht gut! wenn ich auf die neuen Libs gehe, werde ich wohl auch das Problem bekommen!
Das ist erst seit den letzten neuen iText Versionen!
Also viel spaß beim lesen vom Changelog 1T3XT: History vielleicht findest du dort die Lösung!


----------



## Zapp_Branigan (31. Okt 2009)

Das ist doch ne Grundfunktion oder? Wie kann das denn so schwierig sein?
Ich habe gedacht das sei ganz einfach...
Weiß denn da keiner ne einfache Lösung? Von mir aus auch ein anderes Package oder so...


----------



## JohannisderKaeufer (1. Nov 2009)

In Zeile 22 holst du dir eine Referenz auf ein neues Graphics2D aus dem PDFTemplate.
Dieses braucht anscheinend einen Aufruf von dispose bevor das document geschlossen wird.

In Zeile 30 überschreibst du deine Referenz auf das alte Graphics2D und ersetzt es durch ein neues.
Folglich kannst du in Zeile 39 nur dein neues disposen.

Dein g2 hält also Referenzen auf zwei verschiedene Objekte.(nacheinander natürlich)
Du rufst dein dispose aber nur auf der zweiten Referenz auf.

Lösung 1:
zwischen Zeile 24 und 30 
ein g2.dispose einbauen

Lösung 2:
In Zeile 30 eine neue lokale Variable erstellen. und später dann dispose() auf beiden Elementen aufrufen.

Das Ding fluppt dann bei beidem.
Verwendet hab ich iText 2.17.


----------



## Zapp_Branigan (1. Nov 2009)

Danke => funktioniert! Das ist hier wirklich ein tolles Forum! Es ist echt unglaublich wie nett und schnell mir hier immer mit meinen teils etwas dummen Problemen geholfen wurde.


----------



## ranib (29. Sep 2011)

Hallo zusammen

ich habe das ähnliche Problem. Bei mir nimmt er den kompletten Inhalt auf eine Seite und erstellt am Schluss noch eine leere Seite. Ich erzeuge ein PDF von einer ODS Datei. Egal wie gross die ODS Datei ist, am Schluss erhalte ich eine Seite bis ans Ende ausgefüllt und abgeschnitten und noch eine leere Seite unten dran. Ich krieg den Fehler nicht raus. Jemand der mir diesbezüglich helfen kann? Wäre dringend... 



```
public void createPdf(OpenDocument doc, String savePath, String fileName)
    {
        // Open the PDF document
        Document document = new Document(PageSize.A4);
        File outFile = new File(fileName + ".pdf");
        PdfDocument pdf = new PdfDocument();
        document.addDocListener(pdf);

        try {
            FileOutputStream fileOutputStream = new FileOutputStream(outFile);
            PdfWriter writer = PdfWriter.getInstance(pdf, fileOutputStream);
            pdf.addWriter(writer);

            document.open();

            // Create a template and a Graphics2D object 
            Rectangle pageSize = document.getPageSize();
            int w = (int) (pageSize.getWidth());
            int h = (int) (pageSize.getHeight());
            PdfContentByte cb = writer.getDirectContent();
            PdfTemplate tp = cb.createTemplate(w, h);

            Graphics2D g2 = tp.createPrinterGraphics(w, h, null);

            tp.setWidth(w);
            tp.setHeight(h);

            // Configure the renderer
            ODTRenderer renderer = new ODTRenderer(doc);
            renderer.setIgnoreMargins(false);
            renderer.setPaintMaxResolution(true);

            // Render
            renderer.paintComponent(g2);
            g2.dispose();

            // Add our spreadsheet in the middle of the page
            float offsetX = (pageSize.getWidth() - w - 10);
            float offsetY = (pageSize.getHeight() - h);
            cb.addTemplate(tp, offsetX, offsetY);

            // Close the PDF document
            document.close();

        } catch (FileNotFoundException ex) {
            System.out.println("FileNotFoundException");
            System.out.println("FILE: " + savePath + "\\" + fileName + ".pdf");
        } catch (DocumentException ex) {
            System.out.println("DocumentException");
        }
    }
```


----------

