# PDF drucken: "invalid flavor"



## tuxedo (18. Sep 2006)

So,
jetzt wo ich endlich meine Daten im PDF Format vorliegen habe scheitere ich dran das PDF zu drucken...

War in der FAQ und hab dort nachgeschaut. Da ist ja auch ein schönes Beispiel drin.
war auch schon bei google und in Sun's Java-Forum. Aber alle beispiele laufen aufs gleiche raus.
Doch zurück zum FAQ-Beispiel:

ich habs das erste hier mal genommen und etwas modifiziert:


```
import javax.print.*;
import javax.print.attribute.*;
import java.io.*;
import javax.print.event.PrintJobListener;
import javax.print.event.PrintJobEvent;
import java.awt.GraphicsEnvironment;

public class PrintPDF {

	private MyDruckListener drucker = new MyDruckListener();

	public PrintPDF(String strFilename, int iDevice) {
		try {
			PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
			// setzt das auszudruckend Dokument fest
			DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF; // hier nachsehen,
															// welches man
															// benötigt!
			PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
			PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();

			PrintService service = defaultService;
//			// wenn als Device -1 übergeben wird, wird ein Dialog für das
//			// drucken auswählen ausgegeben!
//			if (iDevice == -1) {
//				service = ServiceUI.printDialog(GraphicsEnvironment
//						.getLocalGraphicsEnvironment().getDefaultScreenDevice()
//						.getDefaultConfiguration(), 200, 200, printService,
//						defaultService, flavor, pras);
//			}
//			// ansonsten wird der 1te (Standard/Default) Drucker genommen
//			else {
//				// wenn es keine Drucker gibt und das Device niedriger ist als
//				// die Länge
//				if (printService != null && printService.length != 0
//						&& printService.length > iDevice) {
//					service = printService[iDevice];
//				}
//				// ansonsten standarddevice
//				else if (printService != null && printService.length != 0) {
//					service = printService[0];
//				}
//			}
//			
////			service = defaultService;
			
			// wenn der Dateiename null ist, wird die Druckfunktion beendet!
			if (strFilename == null) {
				return;
			}
			// wenn der Service nicht null ist, wird ausgedruckt
			if (service != null) {
				DocPrintJob job = service.createPrintJob();
				// fügt listener hinzu
				job.addPrintJobListener(drucker);
				FileInputStream fis = new FileInputStream(strFilename);
				DocAttributeSet das = new HashDocAttributeSet();
				Doc doc = new SimpleDoc(fis, flavor, das);
				job.print(doc, pras);
			}
		}
		// wenn kein Druckerdevice gefunden wurde!!
		catch (ArrayIndexOutOfBoundsException ex) {
			ex.printStackTrace();
			System.out.println("Keine Drucker gefunden!!");
		}
		// bei sonstigen Exceptions!
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	private class MyDruckListener implements PrintJobListener {
		public void printDataTransferCompleted(PrintJobEvent printJobEvent) {
			System.out.println("Daten wurden zum Drucker geschickt!");
		}

		public void printJobCompleted(PrintJobEvent printJobEvent) {
			System.out.println("Drucker hat fertig gedruckt!");
		}

		public void printJobFailed(PrintJobEvent printJobEvent) {
			System.out.println("Fehler beim Drucken!");
		}

		public void printJobCanceled(PrintJobEvent printJobEvent) {
			System.out.println("Abbruch des druckes!");
		}

		public void printJobNoMoreEvents(PrintJobEvent printJobEvent) {
			System.out.println("JobNoMoreEvents!");
		}

		public void printJobRequiresAttention(PrintJobEvent printJobEvent) {
			System.out.println("JobRequieresAttention!");
		}
	}
	
	public static void main(String[] args) {
		new PrintPDF("my-output.pdf",-1);
	}

}
```

Das mit dem iDevice hab ich mal auskommentiert da er da immer etwas von "must be non-null" oder so gemeckert hat. Da ich für's erste eh kein PrintDialog benötige hab ichs mal weggelassen und den Default-Printer genommen.
Das hier war der Fehler:



> java.lang.IllegalArgumentException: services must be non-null and non-empty
> at javax.print.ServiceUI.printDialog(ServiceUI.java:146)
> at PrintPDF.<init>(PrintPDF.java:26)
> at PrintPDF.main(PrintPDF.java:100)


Ist jetzt aber für's erste wie gesagt nicht weiter wild. 

So, zurück zum drucken: Beim ausführen von obigem Code (mit dem auskommentierten) bekomm ich folgenden Fehler:




> Fehler beim Drucken!
> sun.print.PrintJobFlavorException: invalid flavor
> at sun.print.Win32PrintJob.print(Win32PrintJob.java:312)
> at PrintPDF.<init>(PrintPDF.java:59)
> at PrintPDF.main(PrintPDF.java:100)



Die angegebene Datei ist verfügbar, lässt sich in Acrobat öffnen und auch drucken. Nur Java frisst sie nicht.
Wenn ich DocFlavour auf Autosense stelle druckt er seitenweise Steuercodes statt der PDF.

Gibts unterschiede in PDF und deren kompatibilität? Hab noch keine PDF gefunden die mit obigen Code harmoniert.

Hat wer ne Idee was das sein könnte ?

-Alex


[UPDATE]

Okay, hab nochmal die Forensuche bemüht (http://www.java-forum.org/de/viewtopic.php?t=22899&highlight=invalid+flavor) und bin auf folgende Aussage von "thE_29" gestossen:



> Java sagt std mäßig das fast kein Drucker PS oder PDF Dateien drucken kann...



Super sache. Heisst das das ganze ist jetzt druckerabhängig oder wie? Acrobat hat eigtl nie Probleme 
Muss doch zu machen sein... PDF drucken in Verbindung mit der Java Print API ...

Any ideas ?


----------



## tuxedo (18. Sep 2006)

[UPDATE2]

http://forum.java.sun.com/thread.jspa?threadID=280879&messageID=2465388 :


> This is one of Sun's nasty little "gotchas" in java. While they included a PDF flavor in javax.print, there's still no PDF renderer, so printing PDF is not yet supported. When will it be? Oh, probably about the same time the promised update to the Windows version of javax.comm comes out...



Die Aussage ist aber von 2004... Kann doch unmöglich sein dass in den vergangenen 2 Jahren das nicht gefixt wurde?!

- Alex


----------



## thE_29 (19. Sep 2006)

Hey, Suns Update und BugPolicy von bestehenden Dingen ist gleich 0!!

Es gibt in der Top Bug Liste Fehler die 7 Jahre alte sind!!! (und in java 6 noch immer da sind)


PDFs kann man nicht drucken, dafür aber PostScript Dateien!

Oder du druckst über den Adobe aus!

acrord32.exe /h /p "C:\\bla\\doc.pdf"


----------



## tuxedo (19. Sep 2006)

Hi,
okay. Also muss ich jetzt PDF nach PS konvertieren... Klappt das drucken dann mit allen Druckern oder brauch ich hier wieder nen speziellen?

Oder kennt jemand ne PDF Druck-API die unter der LGPL oder ähnlichem steht?

- Alex

[UPDATE]

Okay, ich bin ein wenig fündig geworden:

http://www.pdfbox.org

Damit hab ich schon meinen ersten Druckerfolg hinter mir. Leider ist in 0.7.2 noch ein Bug der nur de erste Seite druckt, und die nicht ganz korrekt. Teste gerade die 0.7.3 Dev-Version ....


----------



## robertpic71 (19. Sep 2006)

Eine weitere Lib ist JPedal (Dual Licence Commercial + GPL). Die dürften schon etwas weiter sein. 

JPedal findest du unter www.jpedal.org/.

Da bei uns in der Firma fast alle Drucker auch unter Linux als *Cups*-Drucker definiert sind, drucke ich meine PDF's auf den Cupsdrucker. Cups wandelt dann selbständig PDF's für den Drucker um.

RobertPic


----------



## tuxedo (20. Sep 2006)

JPedal hab ich auch schon gefunden. 
Allerdings läuft mein Projekt nicht unter der GPL und soll es auch nicht werden. LPGL oder BSD-Style wäre besser 

Der Kaufpreis für die uneingeschränkte Lizenz, die ich wohl benötigen würde, ist dann doch etwas zu übertrieben für meine Mittel.

Die Idee mit CUPS hab ich auch schon in Erwägung gezogen. Aber dadurch handle ich mir noch ein paar weitere Abhängigkeiten ein die ich im Moment nicht gebrauchen kann.
Der Server läuft zwar unter Linux, soll aber nur die Datenbank stellen und die Serverseite der Software stellen. Die Clients sollen jeweils IHRE drucker benutzen können, ohne dass am Server eingegriffen werden muss. 

Werde jetzt also doch noch etwas suchen müssen. Bin mir sicher dass es eine akzeptable Lösung gibt PDF in Postscript zu konvertieren und dann zu drucken oder sowas in der Art.
Oder PDFBox kriegts irgendwann in nicht allzuferner Zukunft gebacken mit dem PDF drucken....

Mal sehen.

- Alex

P.S. 0.7.3 von PDFBox druckt schon besser, aber immer noch nicht korrekt. Habs auch noch nciht geschafft mehr wie die erste  Seite  eines Dokuments mit vielen Seiten zu drucken.


----------



## OnkeltOm (29. Sep 2006)

hallo,

ich denke ich habe das gleiche - zumindest aber ein ähnliches problem... ich möchte eine mit iText erzeugte pdf-datei sowohl speichern als auch programmatisch ausdrucken...

bist du einer lösung schon näher...? wäre für weiteren input dankbar...

gruss tom


----------



## tuxedo (29. Sep 2006)

Eine wriklich praktikable Lösung habe ich nicht gefunden. Zumindest keine die mein Budget nicht schröpfen würde.

Das einzigste was geht ist das Drucken via Acrobat Kommandozeile.
Aber da bleibt, etwas unschöner weise, Acrobat minimiert in der tastleiste geöffnet.

- Alex


----------



## Oni (27. Dez 2006)

moin,

gibt es zu diesem thema mittlerweile etwas neues? alternativen zum drucken über acrobat?

gruß oni


----------

