# iText Rechnungen



## dogano (26. Mai 2012)

Hallo liebe Freunde,

Ich habe eine Frage zur Java iText Klasse. Unzwar gehts darum, dass ich Rechnungen erstellen will und diese letztenendes in eine PDF klatschen will. Ich hab ne Datenbankabfrage, wo ich die nötigen Daten in ein zweidimensionales Array gespeichert bekomme. Hier zu der Code:


```
try {
	        	int VerkaufID = Integer.parseInt(TFiKuID.getText());
	        	//Verbindung aufbauen
	            Class.forName("com.mysql.jdbc.Driver").newInstance();
	            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb?user=root&password=");
	            Statement stm = conn.createStatement();	
			   	String sql = "SQL-BEFEHL";				           
			   	ResultSet rs = stm.executeQuery(sql);
				int k = 0;
				

				while(rs.next()){
					for(int i=0;i<9;i++){
						String s =  rs.getString(i+1);
						data[k][i] = s;
					}
					k++;
				}
```

Dieses Array übergebe ich der Klasse, in der die PDF erzeugt werden soll:


```
PDFCreator creator = new PDFCreator();
		        creator.erstellePDF(data);
```

Jetzt ist die Frage, wie bekomm ich die einzelnen Daten aus dem Array wieder raus? Also ich habe jetzt mal versucht in einer for-Schleife das auf die PDF zu klatschen. So sind die Daten aber untereinander ohne jede Struktur gedruckt worden. Auch werden erst alle Werte einer Spalte ausgegeben bevor zur nächsten übergangen wird. Ich hätte es aber gerne nebeneinander - wie eine Rechnung eben.

Kann mir da jemand helfen?

Liebe Grüße,

dogano

PS: habe den SQL Befehl mal rausgenommen weil er zu lange ist


----------



## vanny (26. Mai 2012)

Naja dann zeig doch mal den PDFCreator


----------



## turtle (26. Mai 2012)

Ich gebe zu mich nicht mit iText auszukennen 

Aber derartige Anforderungen, Reports in PDF auszugeben, mache ich immer mit JasperReports. In Java fülle ich dann die Werte in den Report und erstelle die Ausgabedatei in PDF-Format. Geht ziemlich einfach, wenn man das mal gemacht hat. Vorteil: In iReport kann das Format der Ausgabe vielfältig angegeben werden und Ausgabe in PDF übernimmt das Tool.

Vielleicht eine Alternative?


----------



## dogano (26. Mai 2012)

Der Code zum PDF-Creator:


```
public class PDFCreator {
	public static void erstellePDF(String[][] daten){

		
		String FirmenName = new String("UnserKlitsch GmbH");
		String Strasse = new String("Hauptstraße 19");
		String Ort = new String("65432 Musterhausen");
		String Tel = new String("01234/55623");
		String Fax = new String("01234/32655");
		String Webseite = new String("www.unser-klitsch.de");
		String AllesZusammen = FirmenName";
		String Rechnung = new String("Rechnung");
		String Anrede = new String("Sehr geehrte Damen und Herren,");
		String Text = new String("hiermit erlauben wir uns für unsere Lieferung Nr. vom folgenden Betrag in Rechnung zu stellen:");
		

		Document document = new Document(PageSize.A4,50,50,50,50);
		
	
		try {
			PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("test.pdf/"));
		} catch (FileNotFoundException e) {
			System.out.println("olmadi");
			e.printStackTrace();
		} catch (DocumentException e) {
			System.out.println("olmadi");
			e.printStackTrace();
		}	
	
		document.open();
		try {
			document.add(new Paragraph(FirmenName, FontFactory.getFont(FontFactory.TIMES_ROMAN, 18, Font.BOLD)));
			document.add(new Paragraph(" "));
			document.add(new Paragraph(Strasse, FontFactory.getFont(FontFactory.TIMES_ROMAN, 14, Font.BOLD)));
			document.add(new Paragraph(Ort, FontFactory.getFont(FontFactory.TIMES_ROMAN, 14, Font.BOLD)));
			document.add(new Paragraph(Tel, FontFactory.getFont(FontFactory.TIMES_ROMAN, 14, Font.BOLD)));
			document.add(new Paragraph(Fax, FontFactory.getFont(FontFactory.TIMES_ROMAN, 14, Font.BOLD)));
			document.add(new Paragraph(Webseite, FontFactory.getFont(FontFactory.TIMES_ROMAN, 14, Font.BOLD)));
			document.add(new Paragraph(" "));
			document.add(new Paragraph(AllesZusammen, FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.UNDERLINE)));
			document.add(new Paragraph(" "));
			document.add(new Paragraph(Rechnung, FontFactory.getFont(FontFactory.TIMES_ROMAN,16,Font.BOLD)));
			document.add(new Paragraph(" "));
			document.add(new Paragraph(Anrede));
			document.add(new Paragraph(" "));
			document.add(new Paragraph(Text));
			for(int i = 0;i<9;i++){
				for(int n = 0;n<9;n++){
					document.add(new Paragraph(daten[n][i]));
				}
			}
		} catch (DocumentException e) {
			System.out.println("");
			e.printStackTrace();
		}
		document.close();
	}
}
```

kannst du mir ein Beispiel zu iReport geben? Code also...


----------



## vanny (26. Mai 2012)

Also 1. in Zeile 11 mal die Anführungszeichen weg!
2. Du addest ja auch immer einen neuen Paragraph. Nutze PdfPTable, Cell und Chunk um dein PDF zu gestalten.
Sonst steht logischer Weise alles einfach nur untereinander.

Gruß Vanny


----------



## turtle (26. Mai 2012)

Hier mal mein Beispiel mit JasperReports...

Es wird lediglich eine Zeile in Gelb und im Font Arial Grösse 36 erzeugt.


```
public static void main(String[] args) throws JRException {
		Map<String, Object> jasperParameter = new HashMap<String, Object>();
		jasperParameter.put("field", "Das war einfach.");
		JasperReport jasperReport = JasperCompileManager
				.compileReport("report1.jrxml");
		JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
				jasperParameter,  new JREmptyDataSource());
		JasperExportManager.exportReportToPdfFile(jasperPrint,
				"sample_report.pdf");
	}
```


----------



## dogano (26. Mai 2012)

vanny hat gesagt.:


> Also 1. in Zeile 11 mal die Anführungszeichen weg!
> 2. Du addest ja auch immer einen neuen Paragraph. Nutze PdfPTable, Cell und Chunk um dein PDF zu gestalten.
> Sonst steht logischer Weise alles einfach nur untereinander.
> 
> Gruß Vanny



Danke für die Info!! Ich habe das als Beispiel im Internet gefunden und einfach mal so übernommen.
Aber wie schaff ich es denn jetzt die einzelnen Werte aus dem Array immer zu einem Pack zu bringen? 
Also bsp. sind im Array vier Produkte, vier Lizenzarten, vier Preise und vier Beschreibungen dabei. Jede Bestellung hat jeweils einen davon. Ich will das so ordentlich nebeneinander haben.

Beispiel im Anhang


----------



## vanny (26. Mai 2012)

Benutze halt nen PdfPTable und teile die Informationen auf die Passenden Cells auf.
Dann weg mit der Border und fertsch


----------



## dogano (27. Mai 2012)

Ich bräuchte Beispielcode...


----------



## vanny (27. Mai 2012)

```
import java.awt.Font;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.FontFactory;
//import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;

public class MyPDFCreator {
	
	
	private com.itextpdf.text.Font font1 = FontFactory.getFont("Arial", BaseFont.IDENTITY_H, 10, Font.PLAIN);
	private com.itextpdf.text.Font font2 = FontFactory.getFont("Arial", BaseFont.IDENTITY_H, 14, Font.BOLD);
	
	
	
	public MyPDFCreator(){
		
		try {
			createMyPDF("test.pdf");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void createMyPDF(String filename) throws DocumentException, MalformedURLException, IOException{
		Document document = new Document(PageSize.A4, 40, 20, 0, 0);
		PdfWriter.getInstance(document, new FileOutputStream(filename));
		document.open();
		
//		Image img = Image.getInstance("logo.png");
//		img.setAlignment(Element.ALIGN_RIGHT);
		
		PdfPTable table = new PdfPTable(3);
		table.setWidthPercentage(100);
		table.setSpacingBefore(150f);
		table.setWidths(new int[]{2, 1, 2});
		PdfPCell cell = new PdfPCell(new Phrase("Firma\nName Nachname\nMusterStrasse 1\nD 01234 Stadt\n", font1));
			cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
			cell.setBorder(0);
		table.addCell(cell);
		

		PdfPCell cellrg = new PdfPCell(new Phrase("Rechnung", font2));
			cellrg.setBorder(0);
			cellrg.setVerticalAlignment(PdfPCell.ALIGN_BOTTOM);
			cellrg.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
		table.addCell(cellrg);
		
		PdfPCell cell2 = new PdfPCell();
		cell2.setBorder(0);
		cell2.setHorizontalAlignment(PdfPCell.RIGHT);
		table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
		
		

		
//		Chunk chunkImg = new Chunk(img, 110, 0);
//			cell2.addElement(chunkImg);
			
			table.addCell(cell2);
		document.add(table);
		
		Date date = new Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
			StringBuilder dateBuilder = new StringBuilder(dateFormat.format(date));
		Paragraph leftDate = new Paragraph();
			leftDate.setAlignment(Element.ALIGN_RIGHT);
			leftDate.setFont(font1);
			leftDate.add("" + dateBuilder);
		
		document.add(new LineSeparator());	
			
		document.add(leftDate);
		document.add(new Paragraph(""));
		
		//Adress
		PdfPTable adressTable = new PdfPTable(2);
		adressTable.setHorizontalAlignment(PdfPTable.ALIGN_RIGHT);
		adressTable.setSpacingBefore(40f);
		adressTable.setWidthPercentage(96f);
		cell = new PdfPCell(new Phrase("Herr\nEmpfänger Nachname\nEmpfangsstrasse 1\nD 01234 Empfangingen\n", font2));
		cell.setBorder(0);
		adressTable.addCell(cell);
		Chunk chunk = new Chunk("Rechnungsnummer: 4711\nKundennummer: 0815\nRechnungsdatum: " + dateBuilder, font1);
		cell = new PdfPCell(new Phrase(chunk));
		cell.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT);
		cell.setBorder(0);
		adressTable.addCell(cell);
		
		document.add(adressTable);
		
		document.close();
	}

}
```

PS: Ich sehe grad hab das leftDate nach rechts gesetzt^^:autsch:

noch ein PS: mach dir ein "logo.png" mit 100x100 Pixeln und schmeiss es in den Projektordner, dann kannste den auskommentierten Kram mit dazu nutzen.


----------



## dogano (28. Mai 2012)

sorry für die späte antwort aber war echt beschäftigt die tage... auf jeden fall werd ich das morgen ausprobieren! aber die frage mit der werteübergabe bzw wie ich es schön immer reihenweise auf das dokument bekomme ist mir immer noch ungewiss...


----------



## vanny (28. Mai 2012)

naja übergib einfach die Werte im Konstruktor oder in passenden Methoden und bau dein PDF zusammen.

Ich verstehe die Problematik dabei jetzt echt nicht.

Gruß Vanny


----------



## dogano (29. Mai 2012)

Hallo,

die Sache ist jetzt folgende: Ich habe die Werte aus der Datenbank in ein Array eingelesen. Ich will die jetzt auf die PDF klatschen, aber das ganze muss halt bisschen Struktur haben(so wie in dem PDF).


----------

