# Printer is not accepting job



## MetroAffe (3. Juni 2013)

javax.print.PrintException: Printer is not accepting job.

Die Exception kommt immer wenn während des Druckens eines Auftrags ein weiterer gesendet wird ...

Wie geht man da nun vor bzw was macht man dagegen?


----------



## youza (4. Juni 2013)

Wie druckst du genau ein bißchen mehr info wäre hilfreich. Bei mir tritt so eine Exception nicht auf vielleicht kann ich helfen wenn ich des Problem nachstellen kann.
Aber mal so nach 10 sekunden googlen:
Removing and adding the printer fixes the problem as mentioned in the bug as a workaround. It worked for me.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6525150

Wenn es der Fehler ist...


----------



## MetroAffe (4. Juni 2013)

```
String path;
	String printName;
	int copies;

[....]

PdfDecoder decodePdf = new PdfDecoder(true);

				try {
					decodePdf.openPdfFile(path);
					FontMappings.setFontReplacements();
				} catch (Exception e) {
					e.printStackTrace();
				}

				PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
				JobName jobName = new JobName(printName, null);
				attributeSet.add(jobName);
				attributeSet.add(new Copies(copies));
				System.out.println(anzahl);

				decodePdf.setPrintAutoRotateAndCenter(true);
				decodePdf.setPrintPageScalingMode(PrinterOptions.PAGE_SCALING_NONE);

				try {
					decodePdf.setPagePrintRange(1, decodePdf.getPageCount());
				} catch (PdfException e) {
					e.printStackTrace();
				}

				PrintService[] services = PrintServiceLookup.lookupPrintServices(DocFlavor.SERVICE_FORMATTED.PAGEABLE, attributeSet);

				for (PrintService s : services) {
					System.out.println(s.getName());
				}

				PrintService printingDevice = null;
				for (PrintService s : services) {
					if (s.getName().equals("Canon MP560 series Printer")) {
						printingDevice = s;
					}
				}

				PdfBook pdfBook = new PdfBook(decodePdf, printingDevice, attributeSet);
				SimpleDoc doc = new SimpleDoc(pdfBook, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);

				DocPrintJob printJob = printingDevice.createPrintJob();

				try {
					//printJob.addPrintJobListener(new PDFPrintJobListener());
					printJob.print(doc, attributeSet);

				} catch (PrintException e) {
					e.printStackTrace();
				}
[....]
```


----------



## MetroAffe (5. Juni 2013)

Bin grad nochmal alles durchgegangen und habe festgestellt, das die Druckaufträge die gesendet werden eine Größe von ca 50 MB haben. Kann es sein das der Drucker dann beim Drucken zusätzlich seinen Speicher beansprucht und somit das was dann noch an Druckaufträgen reinkommt blockiert ... weil halt kein Speicher mehr zur Verfügung steht****?

Kann aber natürlich auch sein das Windows immer erst den nächsten Auftrag sendet wenn der alte abgeschlossen ist ... das weiß ich nicht


----------



## youza (6. Juni 2013)

Vielleicht wäre es eine Möglichkeit wenn du die Exeption fängst einen Sleep machst und für eine Sekunde wartest überprüfst ob er wieder die Exeption schmeißt des ganze dann rekursiv solange ausführen bis er den Job akzeptiert des ganze natürlich ausgelagert in einem eigenem Thread.

50 MB ist natürlich schon sehr viel gut möglich das da der Speicher voll läuft und der Drucker deshalb den Job nicht aktzeptiert


----------



## MetroAffe (12. Juni 2013)

Hast du auch noch ne andere Idee/Lösung die evtl. etwas mehr auf Performance aus ist?

Also an der Dateigröße kann es schon mal nicht liegen - habe es jetzt nämlich auch mit einer Leeren Seite Versucht (wenige Bytes) .... LEIDER das selbe Problem. Ich weiß einfach nicht warum - das ist so sinnlos ;(


----------



## MetroAffe (14. Juni 2013)

Also hab es jetzt mal mit einem "offiziellen" Code versucht - immer noch das selbe Problem

Wenn es vlt mal jemand ausprobieren könnte ... dann könnte ich nämlich Sichergehen das es an meinem Drucker/Druckertreiber liegt

http://files.idrsolutions.com/samplecode/org/jpedal/examples/printing/SilentPrint.java.html

Einfach "debugCode" auf true und den Anweisungen folgen (bzw. mit 2 Argumenten starten)

Wenn ich es 5 mal in einem Abstand von 2 Sekunden Drucke gibt es zwar keine Exception allerdings Druckt er es nur 1 mal ... eben das vom ersten Auftrag - der Rest wird vermutlich nicht aktzepiert


----------



## Writtscher (18. Juni 2013)

Kannst du mal den gesamten Stacktrace angehängen? Der cause alleine ist nicht hilfreich. Schon einmal versucht zu debuggen?


----------



## MetroAffe (18. Juni 2013)

```
javax.print.PrintException: Printer is not accepting job.
	at sun.print.Win32PrintJob.print(Unknown Source)
	at de.Lucas.Rechnung.SilentPrint.printPages(SilentPrint.java:222)
	at de.Lucas.Rechnung.SilentPrint.decodeAndPrintFile(SilentPrint.java:177)
	at de.Lucas.Rechnung.SilentPrint.<init>(SilentPrint.java:78)
	at de.Lucas.Rechnung.SilentPrint.main(SilentPrint.java:418)
```

Die stelle an der die Exception geworfen wird


```
try {
            printJob.print(doc, attributes);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
```


----------



## Writtscher (19. Juni 2013)

Auch das ist nicht hilfreich . Damit seh ich im Stacktrace an welcher Stelle die Exception in deinem Code auftritt. Viel wichtiger ist wo tritt die Exception in der "print" Methode auf. Also viel tiefer.


----------



## MetroAffe (19. Juni 2013)

wie soll ich das sehen können?


----------



## Writtscher (20. Juni 2013)

Ok ne mein Fehler passt. Der letzte Aufruf im Stack ist:

sun.print.Win32PrintJob.print(Unknown Source) (Ich rate immer wenn du Libraries benutzt auch die Sources anzuhängen um vllt mal rein zu debuggen)

Wenn ich jetzt in die Klasse sehe und zur passenden Methode gehe sieht man folgende Zeile Code:


```
if ((PrinterIsAcceptingJobs)(service.getAttribute(
     PrinterIsAcceptingJobs.class)) == PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS) {
         throw new PrintException("Printer is not accepting job.");
}
```

Das bedeutet, dass dein Printer keine Jobs mehr annimmt. Liegt nicht an deinem Code. Desweiteren hast du vermutet, dass die Exception auftritt, wenn er währenddem er druckt einen weiteren Druckauftrag schickt. Da kann ich dich beruhigen, dann würdest du eine andere Exception bekommen: 


```
synchronized (this) {
     if (printing) {
          throw new PrintException("already printing");
     } else {
          printing = true;
     }
}
```

Ab und zu in die benutzen Libraries reinschauen lohnt sich. http://www.docjar.com/html/api/sun/print/Win32PrintJob.java.html

Edit:

Ich sehe gerade, dass du einen javax.print.event.PrintJobListener   (http://docs.oracle.com/javase/1.4.2/docs/api/javax/print/event/PrintJobListener.html) registrieren kannst. Dieser gibt dir alle Informationen die du brauchst um auf bestimmte Events reagieren zu können. Ich würde aber stark von ausgehen, dass dein Drucker ein Problem hat. Vllt mal Treiber aktualisieren.


----------



## MetroAffe (20. Juni 2013)

Also Treiber hab ich schon versucht zu aktualisieren .. ist der neuste.

Und es ist keine Vermutung, dass diese Exception auftritt, wenn man während dem Drucken einen weiteren Auftrag schickt. Ich habe das bestimmt schon 100 mal probiert und komm nicht weiter.

Habe aber gerade einen interessanten Beitrag gefunden:
http://copy-con.blogspot.de/2009/12/printer-is-not-accepting-job.html

Könnte das weiterhelfen?

Ansonsten - gibt es nicht die Möglichkeit in Java eine Warteschlange für die Druckaufträge zu "erstellen"?


----------



## MetroAffe (20. Juni 2013)

Achso und zu dem PrintJobListener:

printJobNoMoreEvents=PrintEvent on sun.print.Win32PrintJob@1ff44e33

das war das erste was ich versucht hatte ;D


----------



## MetroAffe (22. Juni 2013)

Also hab jetzt alles durch - es liegt an meinem Drucker, Windows, oder Treibern jedenfalls nicht an meinem Code. 

Ich würde jetzt eine Queue machen und diese alle 15 Sekunden abfragen, wollte jetzt nur noch fragen wie ich das am besten realisieren soll ... Endlosschleife?


----------



## MetroAffe (22. Juni 2013)

Habe es endlich hinbekommen ;D

Queue/while-Schleife/neuer Thread/viel viel Lesen und Nachdenken haben zum erfolg geführt ...

Wenn jemand interessiert an einer ausführlichen Lösung ist kann er mich gerne anschreiben ^^


----------

