2010-10-27 4 views
6

Je dois imprimer un fichier (texte brut) en utilisant les API javax.print. Je suis capable de rechercher l'imprimante et de soumettre un travail d'impression. Mais je suis capable d'imprimer seulement une copie du fichier. Voici le code que j'ai utilisé.Options javax.print.attribute.PrintRequestAttributeSet ignorées par l'imprimante

Aucune des options/attributs que j'ai spécifiés à l'aide du PrintRequestAttributeSet n'est reconnu par l'imprimante. Bien que je spécifie 2 copies à imprimer, l'imprimante imprime seulement une copie. Est-ce que je fais quelque chose de mal ici?

imprimante utilisé: Canon iR5050 PCL6


package

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; 
} 

} 

Répondre

6

Après de longues recherches et de nombreuses heures de tests, a trouvé les conclusions suivantes,

1) DocFlavor.INPUT_STREAM.AUTOSENSE ne supporterait pas l'impression attributs ○ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4876267

2) DocFlavor .INPUT_STREAM.POSTSCRIPT ne prend pas en charge les attributs javax.print non plus ○ Référez-vous au Bogue ID 4722601 (Impossible de publier plus d'un lien)

3) Aucune API Windows pour JDK pour savoir si l'impression prend en charge PCL ○ Reportez-vous BugID 4529660 (pas en mesure d'afficher plus d'un lien)

donc aucune de ces sont des défauts comme spécifié dans le support de soleil forum. Donc la seule option que j'ai trouvée est d'insérer toutes les commandes POSTSCRIPT dans le fichier Postscript et d'utiliser Javax.print api pour imprimer ce document. Assurez-vous de définir la saveur comme AUTOSENSE.

Assurez-vous également que votre imprimante prend en charge le format POSTSCRIPT. Vous pouvez également essayer d'utiliser PJL. Espérons que cette information aide!

Cordialement, Gokul

Questions connexes