2010-10-27 5 views
6

Ich muss eine Datei (Nur-Text) mit javax.print APIs drucken. Ich kann den Drucker suchen und einen Druckauftrag senden. Aber ich kann nur eine Kopie der Datei drucken. Unten ist der Code, den ich benutzt habe.javax.print.attribute.PrintRequestAttributeSet Optionen vom Drucker ignoriert

Keine der Optionen/Attribute, die ich mit PrintRequestAttributeSet angegeben habe, wird vom Drucker erkannt. Obwohl ich 2 Kopien zum Drucken anwähle, druckt der Drucker nur eine Kopie. Mache ich hier etwas falsch?

Drucker verwendet: Canon iR5050 PCL6


Paket com.print;

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.InputStream; 

import javax.print.Doc; 
import javax.print.DocFlavor; 
import javax.print.DocPrintJob; 
import javax.print.PrintException; 
import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 
import javax.print.SimpleDoc; 
import javax.print.attribute.HashPrintRequestAttributeSet; 
import javax.print.attribute.PrintRequestAttributeSet; 
import javax.print.attribute.standard.Copies; 
import javax.print.attribute.standard.Finishings; 
import javax.print.attribute.standard.MediaSizeName; 
import javax.print.attribute.standard.NumberUp; 
import javax.print.attribute.standard.OrientationRequested; 
import javax.print.attribute.standard.Sides; 
import javax.print.event.PrintJobAdapter; 
import javax.print.event.PrintJobEvent; 

public class TestPrint { 

/** 
    * @param args 
    */ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    String fileName = "D:/test.log"; 
    // Open the file 
    InputStream in = null; 
    try { 
    in = new FileInputStream(fileName); 
    } catch (FileNotFoundException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
    } 

    // Figure out what type of file we're printing 
    DocFlavor myFormat = getFlavorFromFilename(fileName); 
    // Create a Doc 
    Doc myDoc = new SimpleDoc(in, myFormat, null); 
    // Build a set of attributes 
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
    aset.add(OrientationRequested.LANDSCAPE); 
    aset.add(new Copies(2)); 
    aset.add(Sides.DUPLEX); 
    aset.add(MediaSizeName.NA_LETTER); 
    aset.add(new NumberUp(2)); 
    aset.add(Finishings.STAPLE); 
    // discover the printers that can print the format according to the 
    // instructions in the attribute set 
    PrintService[] services = PrintServiceLookup.lookupPrintServices(
    myFormat, aset); 

    // Create a print job from one of the print services 
    if (services.length > 0) { 
    System.out.println("The print sent to>>>" + services[0].getName()); 
    DocPrintJob job = services[0].createPrintJob(); 

    // Monitor the print job with a listener 
    job.addPrintJobListener(new PrintJobAdapter() { 
    public void printDataTransferCompleted(PrintJobEvent e) { 
    System.out.println("Data transfer completed!"); 
    } 

    public void printJobNoMoreEvents(PrintJobEvent e) { 
    System.out.println("No more events!"); 
    } 

    public void printJobRequiresAttention(PrintJobEvent e) { 
    System.out.println("Requires Attention!"); 
    } 

    public void printJobFailed(PrintJobEvent e) { 
    System.out.println("Print Job Failed!"); 
    } 

    public void printJobCompleted(PrintJobEvent e) { 
    System.out.println("Print Job Completed!"); 
    } 

    public void printJobCanceled(PrintJobEvent e) { 
    System.out.println("Print Job Cancelled!"); 
    } 
    }); 

    try { 
    job.print(myDoc, aset); 
    } catch (PrintException pe) { 
    pe.printStackTrace(); 
    } 
    System.out.println("The print job ........"); 
    } 
} 

// A utility method to return a DocFlavor object matching the 
// extension of the filename. 
public static DocFlavor getFlavorFromFilename(String filename) { 
    String extension = filename.substring(filename.lastIndexOf('.') + 1); 
    extension = extension.toLowerCase(); 
    if (extension.equals("gif")) 
    return DocFlavor.INPUT_STREAM.GIF; 
    else if (extension.equals("jpeg")) 
    return DocFlavor.INPUT_STREAM.JPEG; 
    else if (extension.equals("jpg")) 
    return DocFlavor.INPUT_STREAM.JPEG; 
    else if (extension.equals("png")) 
    return DocFlavor.INPUT_STREAM.PNG; 
    else if (extension.equals("ps")) 
    return DocFlavor.INPUT_STREAM.POSTSCRIPT; 
    else if (extension.equals("txt")) 
    return DocFlavor.INPUT_STREAM.TEXT_PLAIN_HOST; 
    // Fallback: try to determine flavor from file content 
    else 
    return DocFlavor.INPUT_STREAM.AUTOSENSE; 
} 

} 

Antwort

6

Nach langer Forschung und zahlreiche Stunden des Testens, entsprechen die folgenden Schlüsse,

1) DocFlavor.INPUT_STREAM.AUTOSENSE nicht drucken unterstützt Attribute ○ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4876267

2) DocFlavor .INPUT_STREAM.POSTSCRIPT unterstützt keine javax.print-Attribute. ○ Siehe Fehler-ID 4722601 (Nicht in der Lage, mehr als einen Link zu veröffentlichen)

3) Kein Windows-API für JDK zu finden, ob der Druck PCL unterstützt ○ Siehe Bug-ID 4529660 (Nicht in der Lage mehr als einen Link)

So keines der oben genannten Defekte zu schreiben, wie in der Sonne Unterstützung angegeben Forum. Die einzige Option, die ich gefunden habe, besteht darin, alle POSTSCRIPT-Befehle in die Postscript-Datei einzufügen und mit Javax.print api dieses Dokument zu drucken. Stellen Sie sicher, dass Sie den Geschmack als AUTOSENSE festlegen.

Vergewissern Sie sich auch, dass Ihr Drucker das POSTSCRIPT-Format unterstützt. Sie können auch versuchen, PJL zu verwenden. Hoffe, diese Information hilft!

Grüße, Gokul