# Mehrseitiges Drucken



## Oli (1. Sep 2009)

Hallo,

ist es denn wirklich so schwer, mit Java mehseitig zu drucken???

Gibts irgendwo nen Codeschnipsel, der aufzeigt, wie man mehrseitig druckt? Ne Arraylist mit beliebig vielen Zeilen auf mehrere Seiten Papier zu bringen, kann doch nicht so schwer sein?

Grüße Oli


----------



## bygones (1. Sep 2009)

Oli hat gesagt.:


> Hallo,
> 
> ist es denn wirklich so schwer, mit Java mehseitig zu drucken???


aus meiner (mittlerweilen vor 3 Jahren) Erfahrung... JA (kA ob mit Java6 oder so mal was akzeptables gibt)


----------



## Oli (1. Sep 2009)

Hm. Wie ich ja schon in mehreren Threads beschrieben habe, komme ich ja aus der C# - Ecke. Da ist das halt ein Zweizeiler.

Gibt es wirklich nirgends nen Codeschnipsel? Es kann doch nicht sein, dass ich der einzige mit diesem Problem bin? 

Grüße Oli


----------



## Oli (1. Sep 2009)

Hier mal ein Beispielcode:


```
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class DruckerTest {

	private ArrayList<String> inhalt;
	private PrinterJob pjob;
	private int counter = 0;

	public static void main(String[] args) {
		new DruckerTest();
	}

	public DruckerTest() {
		inhalt = new ArrayList<String>();
		for (int i = 0; i < 200; i++) {
			String test = "Zeile: " + i;
			inhalt.add(test);
		}
		System.out.println("inhalt" + inhalt.size());
		try {
			counter = 0;
			getPrinter();
		}
		catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Keine Verbindung zum Drucker", "Fehler", JOptionPane.ERROR_MESSAGE);
		}
	}

	private void getPrinter() throws PrinterException {

		pjob = PrinterJob.getPrinterJob();

		Paper a4Paper = new Paper();
		PageFormat pf = new PageFormat();

		double paperWidth = 8.26;
		double paperHeight = 11.69;
		double leftMargin = 0.30;
		double rightMargin = 0.30;
		double topMargin = 0.30;
		double bottomMargin = 0.30;

		a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0);
		a4Paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0, (paperWidth - leftMargin - rightMargin) * 72.0,
				(paperHeight - topMargin - bottomMargin) * 72.0);
		pf.setPaper(a4Paper);

		Book book = new Book();
		book.append(new TextPrintable(), pf);

		pjob.setPageable(book);

		if (pjob.printDialog()) {
			try {
				pjob.print();
			}
			catch (Exception PrintException) {
				PrintException.printStackTrace();
			}
		}
		else {
			System.out.println("Printing aborted...");
		}
	}

	class TextPrintable implements Printable {

		Font headerfont = new Font("Times", Font.BOLD, 20);
		Font textfont = new Font("Times", Font.PLAIN, 12);

		public int print(Graphics g, PageFormat pageFormat, int pageIndex) {

			int x = 0;
			int y = (int) pjob.defaultPage().getImageableY();

			String text = "Test für mehrseitigen Druck";
			g.setFont(headerfont);

			FontMetrics fm = g.getFontMetrics();
			int laenge = fm.stringWidth(text);
			int hoehe = fm.getHeight();

			x += (((int) pjob.defaultPage().getWidth() - laenge) / 2);
			g.drawString(text, x, y);

			x = (int) pjob.defaultPage().getImageableX();
			y += hoehe + 15;

			for (int i = counter; i < inhalt.size(); i++) {

				x = (int) pjob.defaultPage().getImageableX();

				g.setFont(textfont);

				g.drawString(inhalt.get(i), x, y);
				y += fm.getHeight() / 2;
				counter++;
				if (y > pjob.defaultPage().getImageableHeight()) {
					System.out.println("break");
					break;
				}
			}
			return Printable.PAGE_EXISTS;
		}
	}
}
```

Was mach ich denn falsch??

Grüße Oli


----------



## Oli (1. Sep 2009)

Hallo nochmal,

für alle die ein ähnliches Problem haben: Hier mal eine Alternative. Es werden maximal 40 Zeilen aus dem Array auf das Blatt Papier gedruckt. 
Das ist zwar nicht schön, aber immerhin werden mehere Seiten gedruckt.

Vielleicht kann man sich ja vorher berechnen, wie viele Zeilen aufgrund der Schriftgröße aufs Papier passen.

Aber eins muss ich noch loswerden: JAVA SUCKS!!!!

Grüße


```
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class DruckerTest {

	private ArrayList<String> inhalt;
	private PrinterJob pjob;

	private Font headerfont = new Font("Times", Font.BOLD, 20);
	private Font textfont = new Font("Times", Font.PLAIN, 12);

	private int counter = 0;

	
	public static void main(String[] args) {
		new DruckerTest();
	}

	public DruckerTest() {
		inhalt = new ArrayList<String>();
		for (int i = 0; i < 200; i++) {
			String test = "Zeile: " + i;
			inhalt.add(test);
		}
		System.out.println("inhalt" + inhalt.size());
		try {
			getPrinter();
		}
		catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Keine Verbindung zum Drucker", "Fehler", JOptionPane.ERROR_MESSAGE);
		}
	}

	private void getPrinter() throws PrinterException {

		pjob = PrinterJob.getPrinterJob();

		Paper a4Paper = new Paper();
		PageFormat pf = new PageFormat();

		double paperWidth = 8.26;
		double paperHeight = 11.69;
		double leftMargin = 0.30;
		double rightMargin = 0.30;
		double topMargin = 0.30;
		double bottomMargin = 0.30;

		a4Paper.setSize(paperWidth * 72.0, paperHeight * 72.0);
		a4Paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0, (paperWidth - leftMargin - rightMargin) * 72.0,
				(paperHeight - topMargin - bottomMargin) * 72.0);
		pf.setPaper(a4Paper);

		
		
		Book book = new Book();
		ArrayList<String> temp = new ArrayList<String>();
		for (int i = 0; i < inhalt.size(); i++) {
			if (i != 0 && i % 40 != 0 && i != inhalt.size() - 1) {
				temp.add(inhalt.get(i));
			}
			else if (i == 0) {
				temp.add(inhalt.get(i));
			}
			else if (i == inhalt.size() - 1) {
				temp.add(inhalt.get(i));
				counter = 0;
				book.append(new TextPrintable(temp), pf);
				temp = new ArrayList<String>();
			}
			else {
				counter = 0;
				book.append(new TextPrintable(temp), pf);
				temp = new ArrayList<String>();
			}
		}
		pjob.setPageable(book);

		if (pjob.printDialog()) {
			try {
				pjob.print();
			}
			catch (Exception PrintException) {
				PrintException.printStackTrace();
			}
		}
		else {
			System.out.println("Printing aborted...");
		}
	}
	class TextPrintable implements Printable {

		ArrayList<String> list;

		public TextPrintable(ArrayList<String> list) {
			this.list = list;
		}
		
		public int print(Graphics g, PageFormat pageFormat, int pageIndex) {

			int x = 0;
			int y = (int) pjob.defaultPage().getImageableY();

			String text = "Test für mehrseitigen Druck";
			g.setFont(headerfont);

			FontMetrics fm = g.getFontMetrics();
			int laenge = fm.stringWidth(text);
			int hoehe = fm.getHeight();

			x += (((int) pjob.defaultPage().getWidth() - laenge) / 2);
			g.drawString(text, x, y);

			x = (int) pjob.defaultPage().getImageableX();
			y += hoehe + 15;

			for (int i = 0; i < list.size(); i++) {

				x = (int) pjob.defaultPage().getImageableX();
				g.setFont(textfont);
				System.out.println(list.get(i));
				g.drawString(list.get(i), x, y);
				y += fm.getHeight() / 2;
				counter++;
				//				if (y > pjob.defaultPage().getImageableHeight()) {
				//					System.out.println("break");
				//					break;
				//				}
			}
			return Printable.PAGE_EXISTS;
		}
	}
}
```


----------



## bygones (1. Sep 2009)

Oli hat gesagt.:


> Hm. Wie ich ja schon in mehreren Threads beschrieben habe, komme ich ja aus der C# - Ecke. Da ist das halt ein Zweizeiler.
> 
> Gibt es wirklich nirgends nen Codeschnipsel? Es kann doch nicht sein, dass ich der einzige mit diesem Problem bin?
> 
> Grüße Oli


na dann tu ich es mal fuer dich:
Let me google that for you


----------

