Hallo,
ich habe den Code aus der FAQ:
http://www.java-forum.org/java-faq-beitraege/7159-drucken-von-vielen-dokumentarten.html
Und habe ihn etwas angepasst, so dass man eine List<File> übergeben kann. (Ab zeile 75!)
Das funktioniert auch soweit alles bestens, aber aus irgendeinem Grund werden nur knapp 50% aller PDF's auch wirklich ausgedruckt.
Ich habe schon versucht, die Schleife mit einem sleep() zu vergrössern, aber irgendwie wie das alles nicht funktionieren.
Mit Bildern (jpeg) funktioniert es einwandfrei (DocFlavor.INPUT_STREAM.JPEG)
Deswegen denke ich, es liegt an
Aber wenn ich kein AUTOSENSE nehme, dann kriege ich nicht alle Drucker angezeigt, habe bereits alle möglichen Varianten ausprobiert.
Vielleicht findet jemand einen Fehler oder kann mir sagen wie es besser geht.
mfg Verjigorm
Der Aufruf des Programms, wobei files eine Arraylist von Dateien ist.
Der modifizierte Code:
[highlight="Java"]package drucken;
import javax.print.*;
import javax.print.attribute.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.print.event.PrintJobListener;
import javax.print.event.PrintJobEvent;
import java.awt.GraphicsEnvironment;
public class PrintDocument
{
private MyDruckListener drucker = new MyDruckListener();
public PrintDocument(final List<File> files, int iDevice)
{
try
{
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
//setzt das auszudruckend Dokument fest
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; //hier nachsehen, welches man benötigt!
PrintService printService[] = PrintServiceLookup.lookupPrintServices(
flavor, pras);
PrintService defaultService = PrintServiceLookup.
lookupDefaultPrintService();
PrintService service = null;
//wenn als Device -1 übergeben wird, wird ein Dialog für das drucken auswählen ausgegeben!
if (iDevice == -1)
{
// System.out.println(printService.length + ", " + defaultService + ", " + flavor + ", " + pras);
// System.out.println(GraphicsEnvironment.
// getLocalGraphicsEnvironment().
// getDefaultScreenDevice().
// getDefaultConfiguration());
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];
}
}
//wenn der Dateiename null ist, wird die Druckfunktion beendet!
if(files == null || files.isEmpty())
{
return;
}
//wenn der Service nicht null ist, wird ausgedruckt
if (service != null)
{
// DocPrintJob job = service.createPrintJob();
// DocPrintJob job = null;
//
// FileInputStream fis = null;
// DocAttributeSet das = new HashDocAttributeSet();
// Doc doc = null;
// Neue Schleife
for(File f : files)
{
DocPrintJob job = service.createPrintJob();
DocAttributeSet das = new HashDocAttributeSet();
//fügt listener hinzu
job.addPrintJobListener(drucker);
System.out.println(f);
FileInputStream fis = new FileInputStream(f);
Doc doc = new SimpleDoc(fis, flavor, das);
job.print(doc, pras);
// Thread.sleep(5000); //<-- testweise
}
// FileInputStream fis = new FileInputStream(strFilename);
// 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!");
}
}
} [/highlight]
ich habe den Code aus der FAQ:
http://www.java-forum.org/java-faq-beitraege/7159-drucken-von-vielen-dokumentarten.html
Und habe ihn etwas angepasst, so dass man eine List<File> übergeben kann. (Ab zeile 75!)
Das funktioniert auch soweit alles bestens, aber aus irgendeinem Grund werden nur knapp 50% aller PDF's auch wirklich ausgedruckt.
Ich habe schon versucht, die Schleife mit einem sleep() zu vergrössern, aber irgendwie wie das alles nicht funktionieren.
Mit Bildern (jpeg) funktioniert es einwandfrei (DocFlavor.INPUT_STREAM.JPEG)
Deswegen denke ich, es liegt an
Code:
DocFlavor.INPUT_STREAM.AUTOSENSE
Vielleicht findet jemand einen Fehler oder kann mir sagen wie es besser geht.
mfg Verjigorm
Der Aufruf des Programms, wobei files eine Arraylist von Dateien ist.
Code:
new PrintDocument(files, -1);
[highlight="Java"]package drucken;
import javax.print.*;
import javax.print.attribute.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.print.event.PrintJobListener;
import javax.print.event.PrintJobEvent;
import java.awt.GraphicsEnvironment;
public class PrintDocument
{
private MyDruckListener drucker = new MyDruckListener();
public PrintDocument(final List<File> files, int iDevice)
{
try
{
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
//setzt das auszudruckend Dokument fest
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; //hier nachsehen, welches man benötigt!
PrintService printService[] = PrintServiceLookup.lookupPrintServices(
flavor, pras);
PrintService defaultService = PrintServiceLookup.
lookupDefaultPrintService();
PrintService service = null;
//wenn als Device -1 übergeben wird, wird ein Dialog für das drucken auswählen ausgegeben!
if (iDevice == -1)
{
// System.out.println(printService.length + ", " + defaultService + ", " + flavor + ", " + pras);
// System.out.println(GraphicsEnvironment.
// getLocalGraphicsEnvironment().
// getDefaultScreenDevice().
// getDefaultConfiguration());
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];
}
}
//wenn der Dateiename null ist, wird die Druckfunktion beendet!
if(files == null || files.isEmpty())
{
return;
}
//wenn der Service nicht null ist, wird ausgedruckt
if (service != null)
{
// DocPrintJob job = service.createPrintJob();
// DocPrintJob job = null;
//
// FileInputStream fis = null;
// DocAttributeSet das = new HashDocAttributeSet();
// Doc doc = null;
// Neue Schleife
for(File f : files)
{
DocPrintJob job = service.createPrintJob();
DocAttributeSet das = new HashDocAttributeSet();
//fügt listener hinzu
job.addPrintJobListener(drucker);
System.out.println(f);
FileInputStream fis = new FileInputStream(f);
Doc doc = new SimpleDoc(fis, flavor, das);
job.print(doc, pras);
// Thread.sleep(5000); //<-- testweise
}
// FileInputStream fis = new FileInputStream(strFilename);
// 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!");
}
}
} [/highlight]