2010-10-27 106 views
6

我必須使用javax.print api打印文件(純文本)。我能夠查找打印機並提交打印作業。但是我只能打印一份文件。以下是我一直在使用的代碼。javax.print.attribute.PrintRequestAttributeSet打印機忽略的選項

打印機無法識別使用PrintRequestAttributeSet指定的選項/屬性。雖然我指定要打印兩份,但打印機只打印一份。我在這裏做錯了什麼?使用

打印機:佳能iR5050 PCL6


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

} 

回答

6

長期研究和無數小時的測試後,發現下面的推論,

1)DocFlavor.INPUT_STREAM.AUTOSENSE不支持打印屬性 ○http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4876267

2)的DocFlavor .INPUT_STREAM.POSTSCRIPT將不支持javax.print屬性 ○參考Bug ID 4722601(不能發佈多個鏈接)

3)JDK沒有窗戶API來找到打印是否支持PCL ○如在陽光下支持指定的參考錯誤ID 4529660(無法發佈多個鏈接)

所以沒有以上的有缺陷論壇。所以我找到的唯一選擇是將所有POSTSCRIPT命令捕捉到Postscript文件中,並使用Javax.print api打印此文檔。確保將味道設置爲AUTOSENSE。

另請確保您的打印機支持POSTSCRIPT格式。你也可以嘗試使用PJL。希望這些信息有幫助!

Regards, Gokul