# Problem beim Drucken mit Java



## noxum (2. Mai 2012)

Guten Tag, 


ich wollte heute versuchen mittels Java ein .doc Dokument zu drucken.
Also habe ich mich durch mehrere Tutorials im Internet gewühlt und konnte mir bis jetzt auch ganz gut mit der API und verschiedenen Beiträgen in so einigen Foren helfen. 
Doch nun habe ich ein Problem, wo ich einfach nicht weiter komme. 

Das Dokument wird angebglich gedruckt und es wird auch keine Exception geworfen, sogar mein Drucker schaltet von dem standby  Modus in den "Bereit" Modus, aber es passiert sonst nichts.

Hier mal der Quellcode von dem wichtigen Teil. 


```
public void printButton_ActionPerformed(ActionEvent evt) {

     for(int a=0; a < list1.getItemCount();a++)
     {
       try{
       FileInputStream fileStream = new FileInputStream(list1.getItem(a));
       
       DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    
       PrintService service = PrintServiceLookup.lookupDefaultPrintService();

       DocPrintJob job = service.createPrintJob();
       
       Doc doc = new SimpleDoc(fileStream, flavor,null);
       
       job.print(doc,null);
       }
       catch(Throwable t)
       {
        list2.add(""+t.toString());
       }

     }
```

Hier nochmal der ganze Code, vlt. hilft es ja.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.print.*;


/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 02.05.2012
  * @author
  */

public class Druck extends Frame {
  // Anfang Attribute
  private Button addButton = new Button();
  private List list1 = new List();
  private Button deleteButton = new Button();
  private Button printButton = new Button();
  private List list2 = new List();
  // Ende Attribute

  public Druck(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 595; 
    int frameHeight = 602;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    addButton.setBounds(448, 24, 97, 33);
    addButton.setLabel("New document");
    addButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        addButton_ActionPerformed(evt);
      }
    });
    cp.add(addButton);
    list1.setBounds(32, 24, 385, 153);
    cp.add(list1);
    deleteButton.setBounds(448, 80, 99, 33);
    deleteButton.setLabel("Delete");
    deleteButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        deleteButton_ActionPerformed(evt);
      }
    });
    cp.add(deleteButton);
    printButton.setBounds(448, 136, 99, 33);
    printButton.setLabel("Print");
    printButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        printButton_ActionPerformed(evt);
      }
    });
    cp.add(printButton);
    list2.setBounds(56, 200, 457, 361);
    list2.setBackground(Color.BLACK);
    list2.setFont(new Font("Arial Narrow", Font.PLAIN, 12));
    list2.setForeground(Color.RED);
    cp.add(list2);
    // Ende Komponenten

    setVisible(true);
    list2.add("Fehlerconsole gestartet!");
  }

  // Anfang Methoden
  public void addButton_ActionPerformed(ActionEvent evt) {
    JFileChooser chooser = new JFileChooser();
    chooser.showDialog(null,"Öffnen");
    list2.add("JFileChooser wurde geöffnet.");
    File tmpFile = chooser.getSelectedFile();
    
    list1.add(tmpFile.getAbsolutePath());
    list2.add("Datei wurde in die Liste gesetzt.");

  }

  public void deleteButton_ActionPerformed(ActionEvent evt) {
     list1.removeAll();
     list2.add("Alle Daten wurden aus der Liste gelöscht.");
  }

  public void printButton_ActionPerformed(ActionEvent evt) {

     for(int a=0; a < list1.getItemCount();a++)
     {
       try{
       FileInputStream fileStream = new FileInputStream(list1.getItem(a));
       list2.add("FileStream erstellt");
       
       DocFlavor formatStream = DocFlavor.INPUT_STREAM.AUTOSENSE;
       list2.add("FormatStream erstellt");
       
       PrintService service = PrintServiceLookup.lookupDefaultPrintService();
       list2.add("PrintService erstellt");
       list2.add("Drucker: "+service.getName());
       DocFlavor[] flavors = service.getSupportedDocFlavors();
       for(int i=0;i < flavors.length;i++)
       list2.add("* "+flavors[i].toString());
       
       
       
       DocPrintJob job = service.createPrintJob();
       list2.add("DocPrintJob erstellt");
       
       Doc doc = new SimpleDoc(fileStream, formatStream,null);
       list2.add("Doc erstellt");
       
       job.print(doc,null);
       list2.add("Job wurde gedruckt");
       }
       catch(Exception t)
       {
        list2.add("Fehler wurden festgestellt:");
        list2.add(""+t.toString());
       }

     }

  }

  // Ende Methoden

  public static void main(String[] args) {
    new Druck("Druck");

  }
}
```


Hier nochmal ein Bild von der Druckerverwaltung in Windows. Hier wird das Dokument auch in der Warteschlange angeführt und später auch als "wird gedruckt".





Ich hoffe ihr findet den Fehler und könnt mir so ein wenig weiterhelfen. Falls es wichtig sein sollte ist zu erwähnen, dass der Drucker ein Netzwerkdrucker ist. 

Vielen Dank für eure Mühe
MfG Noxum



EDIT:

Hey, 
ich habe gerade mal den Flavor auf "JPEG" gesetzt und es klappt tadenlos, Bilder werden sofort gedruckt. 
Was bedeutet denn "AUTOSENSE" und muss ich für .doc Dateien womöglich etwas anderes nehmen ?


----------



## genodeftest (2. Mai 2012)

Hi
Kannst du mit anderen Programmen drucken?
Kannst du mal nen virtuellen Printer ausprobieren? Wikipedia hat eine Liste, ich habe bisher z.B. den CIB PDF Brewer benutzt.

Welche Ausgaben wurden gemacht (ich kann das Ende auf dem Screenshot nicht sehen)?
Welche API nutzt du für das Öffnen der Word-Dokumente? Unterstützt die vielleicht kein Drucken?

btw: generell würde ich nicht AWT, sondern Swing verwenden. Sollte aber nichts mit deinem Problem zu tun haben.


----------



## noxum (2. Mai 2012)

Danke für deine schnelle Antwort.

Drucken allgemein klappt ohne Probleme, wie ich oben schon im Edit geschrieben habe geht es sogar mit dem gleichen Programm, solange ich "DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;" in "DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;" ändere. 

Laut Fehlerausgabe wurde das Dokument normal gedruckt, sprich es gab keine Exception bei der print Funktion und diese wurde auch aufgerufen. 
Auch habe ich mir über den PrintService den Namen des Drucker ausgeben lassen, auch dieser ist völlig richtig. 
Zum öffnen der Datei nutze ich den FileInputStream, falls du dies meinst. 

Aber wie gesagt, sobald ich Autosense in Jpeg änder klappt das drucken von Bildern ohne Probleme, daraus schließe ich, dass das Format wohl falsch ist, oder mein Drucker damit nicht zurecht komme (Ich benutze einen Brother DCP-375CW). 


MfG Noxum


Edit: 

Hier nochmal die ganze Ausgabe. (alles mit einem * sind die für den Drucker verfügbaren Flavors)


----------



## genodeftest (2. Mai 2012)

Und warum lässt du es dann nicht auf JPEG?
Um ein Problem des Druckers auszuschließen, müsstest du aber doch mal nen virtuellen Drucker installieren oder das Programm wo anders testen.


----------



## noxum (2. Mai 2012)

Mit einem virtuellen Drucker klappt es ohne Probleme. 

Naja der Grund warum ich es nicht auf JPEG lasse ist ganz einfach, mit "JPEG" kann ich nur Bilder mit der Endung .jpg / .jpeg ausdrucken, ich möchte aber Dateien mit der Endung .doc oder .odt etc drucken.


----------



## genodeftest (2. Mai 2012)

Ich könnte mir noch 2 Gründe vorstellen:
1. Bei dir ist kein Drucker-Tool für diesen Dateityp installiert oder der Standarddrucker ist defekt. Damit meine ich nicht den Treiber für den Drucker, sondern die Software, die nötig wäre um das Dokument zu drucken. z.B. MS Word in deinem Fall. Kannst du um das auszuschließen mal im Kontextmenü über der Datei im Windows Explorer „Drucken“ auswählen? Was für diesen Punkt spricht ist dass Dateien des Typs DOC nicht in deinem Screenshot aufgelistet werden.
2. Die Java-SE Bibliothek hat einen Fehler.

kannst du 1. ausschließen? Hast du schon mal nen Debugger auf das Problem angeworfen? Um das systemspezifische Zeug zu debuggen (ob das Dokument z.B. überhaupt von MS Word gelesen wird), etc. empfielt sich ProcMon aus der Sysinternals Suite


----------



## noxum (2. Mai 2012)

Über den Drucken Button im Explorer klappt es auch ohne Probleme. 
Bei ProcMon kann ich jetzt nichts festellen, liegt aber eher daran, dass das Programm recht unübersichtlich ist und ich nicht genau weiß wonach ich überhaupt suchen soll ;D

Naja ich werde es morgen mal an einem anderen Rechner mit einem anderen Drucker versuchen, mal sehen ob es an mir und meiner Hard- bzw. Software liegt. 

Vielen Dank schonmal für deine hilfe, mal sehen vlt. hat jemand ja noch eine Idee 

Edit: 

Was meinst du eigentlich mit: "Was für diesen Punkt spricht ist dass Dateien des Typs DOC nicht in deinem Screenshot aufgelistet werden."

In der Fehlerconsole werden ja sowieso nur Daten ausgegeben, welche ich auch ausgeben lasse. 
Oder meinst du, dass bei den MIME type keine .doc Dateien gelistet sind?


----------



## genodeftest (2. Mai 2012)

Genau. Ich meine dass bei den MIME-Typen keine DOC aufgelistet sind.

Bei ProcMon solltest du erst mal Filter einstellen, z.B. nach dem Ordner, in dem die zu Druckende Datei liegt. Und da du nur Festplattenaktivitäten ansehen willst, einfach alle anderen Monitoring-Sachen deaktivieren (Netzwerk, Registry, CPU, …)


----------



## noxum (2. Mai 2012)

Habe es gerade mal bei jemand anderen versucht, er kann wohl damit drucken, allerdings mit sehr vielen kryptischen Zeichen.


Edit: Hat denn keiner eine Idee woran es liegt ? Es dürfte doch normal nicht so schwer sein ein einfaches Word Dokument zu drucken, oder?


----------

