# Finde kein PrintService der das Attribut PageRanges annimmt



## Bennsen (18. Sep 2008)

Moin,

ich habe folgendes Problem:

Ich habe ein gegebenes pdf-File, welches aus mehreren Seiten besteht. Nun möchte ich aber nur die erste Seite ausducken. Deswegen füge ich das Attribut PageRanges hinzu. Nun bekomme ich aber immer ne Exception, die mir sagt, dass kein passender PrintService gefunden wurde. 

Wie kann das sein? Wenn ich einen printDialog aufrufen würde, dann würde er mir ja auch nur die eine Seite drucken. Also kann es ja nicht daran liegen, dass kein Drucker PageRanges unterstützt. 

Würde mich freuen, wenn mir jemand helfen könnte. Vielleicht bin ich ja auch total auf dem Holzweg mit meinen Vorstellungen und Annahmen.

mein Code:


```
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
                aset.add(new PageRanges(1);

               DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;

               PrintService[] ps = PrintServiceLookup.lookupPrintServices(flavor, 
				                                                 aset);

		DocPrintJob printJob = ps[0].createPrintJob();

		try {
			FileInputStream fis = new FileInputStream("xxl.pdf");
			
			Doc doc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.POSTSCRIPT,
					null);
		
			printJob.print(doc, aset); 
		}
		catch(FileNotFoundException e) {
			e.printStackTrace();
		}
		catch(PrintException e) {
			e.printStackTrace();
		}
```

P.S. Ich benutze Jdk1.4 und habe diverse Drucker ausprobiert


----------



## thE_29 (18. Sep 2008)

Ich hole mir das so zurück


```
pages = ( (javax.print.attribute.standard.PageRanges) pras.get(javax.print.attribute.standard.PageRanges.class)).getMembers();
```

Wobei pages[0] == ein int Array von der Länge 2! [0] = erste Seite, [1] = letzte Seite.
Eigentlich müsstest du das ja nur via add hinzufügen (vielleicht noch vorher mit remove rauslöschen)

pras == PrintRequestAttributeSet == bei dir also aset



Nachtrag: Vergiss das obere 

Es gibt fast keine Drucker die PDFs oder PostScript als Typ annehmen! Von daher musst du es konvertieren oder sonstiges.

PPS: Mit dem kann man PDF drucken: http://www.pdfbox.org/


----------



## Bennsen (18. Sep 2008)

Danke für deine schnelle Antwort!


Ich frage mich aber, ob nicht der Sinn von:


```
PrintService[] ps = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PDF, 
                                                             aset);
```

ist, dass ich nur PrintServices bekomme, die pdf unterstützen?

Es funktioniert ja auch ansonsten alles und wird wunderbar (und hübsch) gedruckt. Er druckt bloß leider immer alle Seiten.


----------



## thE_29 (18. Sep 2008)

Naja, der Drucker müsste PDF/POSTscript direkt annehmen können und das können nicht viele!
Eher Drucker im High End Segment (Farblaser, etc..).

Und du solltest dann die PrintServices zurückkriegen, die PDF unterstützen! Ist ja wahrscheinlich null oder?

zB SW-Laserdrucker die PDF/PCL/Postscript direkt können
http://geizhals.at/?cat=prl&sort=p&...f&filter=+Liste+aktualisieren+&bl1_id=100&xf=


----------



## Bennsen (18. Sep 2008)

bei folgendem Code bekomme ich eine ganze Menge an Druckern:

```
PrintService[] services = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PDF, null);
```

Wir haben einige Printerqueues hier in der Firma, weil dass drucken mit Java halt früher nicht so einfach war. 

So dass services.length  zehn zurückliefert.


----------



## thE_29 (18. Sep 2008)

Und welche Exception bringt er genau, wenn du mit einem Service dann drucken willst?


----------



## Bennsen (18. Sep 2008)

also zwei Fälle:

bei beiden gilt DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;

1.Fall aset = null:

er druckt wunderbar 2 Seiten


2. Fall aset.add(new PageRanges(1));

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0


Meiner Meinung nach kann es also nicht mit dem DocFlavor zusammenhängen, sondern kann nur daran liegen, dass ich  PageRanges hinzufüge.


----------



## thE_29 (18. Sep 2008)

Wo genau bringt er den die Exception?
Also bitte den kompletten StackTrace posten!


----------



## Bennsen (18. Sep 2008)

```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
	at TestClass.button1(TestClass.java:89)
	at TestClass$1.actionPerformed(TestClass.java:45)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1882)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2202)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:5602)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
	at java.awt.Component.processEvent(Component.java:5367)
	at java.awt.Container.processEvent(Container.java:2010)
	at java.awt.Component.dispatchEventImpl(Component.java:4068)
	at java.awt.Container.dispatchEventImpl(Container.java:2068)
	at java.awt.Component.dispatchEvent(Component.java:3903)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4256)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3936)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3866)
	at java.awt.Container.dispatchEventImpl(Container.java:2054)
	at java.awt.Window.dispatchEventImpl(Window.java:1791)
	at java.awt.Component.dispatchEvent(Component.java:3903)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
```
[/code]


----------



## thE_29 (18. Sep 2008)

Was steht genau in der Zeile 89?


----------



## Bennsen (18. Sep 2008)

```
DocPrintJob printJob = ps[0].createPrintJob();
```


----------



## thE_29 (18. Sep 2008)

Aha, also sobald du diese Settings setzt, kriegste da ne Exception!


----------



## Bennsen (18. Sep 2008)

ja richtig! Ich habe es unter Ubuntu 8.? und Mac Os X ausprobiert. Und es funktioniert bei beiden nicht. 

Ist das vielleicht ein Problem von DocPrintJob, dass man nur alles oder nichts drucken kann?


----------



## thE_29 (18. Sep 2008)

Warum setzt du die Werte nicht erst nachher?


```
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;

               PrintService[] ps = PrintServiceLookup.lookupPrintServices(flavor,
                                                             aset);

      DocPrintJob printJob = ps[0].createPrintJob();

      try {
         FileInputStream fis = new FileInputStream("xxl.pdf");
         
         Doc doc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.POSTSCRIPT,
               null);
        aset.add(new PageRanges(1);  //<-- erst jetzt hinzufügen
         printJob.print(doc, aset);
      }
      catch(FileNotFoundException e) {
         e.printStackTrace();
      }
      catch(PrintException e) {
         e.printStackTrace();
      }
```


----------



## Bennsen (18. Sep 2008)

habe ich auch schon probiert. Dann wird es aber wieder ignoriert und alle Seiten werden gedruckt.

P.S.:in dem Code war noch ein Fehler, bei dir Zeile 11: 

sollte natürlich heißen: 


```
Doc doc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.PDF, 
               null);
```

anstatt POSTSCRIPT! Macht aber auch keinen Unterschied.


----------



## thE_29 (18. Sep 2008)

Dh, wenn du die Seitenanzahl schon mitübergibst beim Lookup kriegste du keinen einzigen Service zurück, oder?


----------



## Bennsen (18. Sep 2008)

yupp


----------



## thE_29 (18. Sep 2008)

Wenn du den DocFlavor dann auf AUTO (oder AUTO_SENSE) stellst?


----------



## Bennsen (18. Sep 2008)

dann schmeißt er trotzdem alle Seiten auf den Drucker  :cry:


----------



## thE_29 (18. Sep 2008)

So, habs grad gefunden wie ich das habe


```
int[][] pages = new int[1][2];
        pages[0][0] = 1;
        pages[0][1] = sizeCount;
        javax.print.attribute.standard.PageRanges range = new javax.print.attribute.
            standard.PageRanges(pages);
        aes.add(range);
```
 
Wobei sizeCount halt die Anzahl der zu druckenden Seiten ist.

Und wie ich sehe, habe ich den Wert erst NACH DEM Lookup hinzugefügt!


----------



## Bennsen (18. Sep 2008)

funzt das bei dir? 

Ich habe das genauso übernommen mit pageCount=1 und bekomme trotzdem zwei Seiten ausgedruckt. 

Kann das noch irgendetwas mit Druckereinstellungen zu tun haben?


----------



## thE_29 (18. Sep 2008)

Bei mir funktioniert das!
Ich drucke halt ein Bild aus und kein PDF!


----------



## Bennsen (19. Sep 2008)

Ich habe noch etwas interessantes in der Java-Doku gefunden:



> Class PageRanges is a printing attribute class,... The attribute is associated with print-stream pages, not application-numbered pages (for example, the page numbers found in the headers and or footers for certain word processing applications).



Vielleicht ist das einfach der Schlüssel zum Misserfolg!!!


----------

