将多个文档提供给Java PrintService打印作业?

时间:2013-04-17 13:14:54

标签: java printing

我正在使用以下方法将pdf文档打印到我的打印机。如果我只想打印一次,它可以正常工作,但多次打印需要更长的时间。

public static void print() 
{
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
    FileInputStream psStream = null;
    try 
    {
        psStream = new FileInputStream(System.getProperty("user.home")+"\\My Documents\\document.txt");
    } 
    catch (FileNotFoundException e)
    {
        System.out.println(e);
    }
    if (psStream == null) 
        return;

    if (services.length > 0) 
    {
        PrintService myService = null;
        for (PrintService service : services) 
        {
            System.out.println(service.getName());
            if (service.getName().contains("printer_name")) 
            {
                myService = service;
                break;
            }
        }
        DocPrintJob printJob = myService.createPrintJob();
        Doc document = new SimpleDoc(psStream, flavor, null);

        try 
        {
            printJob.print(document, null);
        } catch (PrintException e) 
        {
            System.out.println(e);
        }
    } else 
    {
        System.out.println("No PDF printer available.");
    }
}

因此,如果我想打印文档五次并将print()放入循环中,那么每次打印文档之间会有相当长的延迟。这种方式对我来说很有意义,因为必须为每个文档重新建立与打印机的连接,并且必须重新发送文档。是否有任何方法可以使用此API多次为同一文档提供相同的文档?

我想值得注意的是,我已经尝试将printJob.print(document,null)命令放在一个生成PrintException: already printing的循环中。也许如果有一种方法让它等到当前文档完成后再发送下一个它可以工作?在这里不知所措。感谢。

@mthmulders:我尝试了以下内容,只打印了一份。我做错了什么?

    Doc document = new SimpleDoc(psStream, flavor, null);
    PrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
    set.add(new Copies(5));

    try 
    {
        printJob.print(document, set);
    } catch (PrintException e) 
    {   
        System.out.println(e);
    }

2 个答案:

答案 0 :(得分:0)

如果您要打印文档五次,我认为您必须创建PrintRequestAttributeSet并在其中添加Copies属性,并附上您想要的副本数。

将此PrintRequestAttributeSet作为printJob.print(...)来电的第二个属性提供,应该没问题。

我现在无法尝试,但是遵循Javadoc这似乎就是这样做的。

答案 1 :(得分:0)

  

也许如果有办法让它等到当前文件完成后再发送下一个它可以工作吗?

我不知道这是不是最好的方法,但如果没有别的办法,你可以尝试添加一个printJobListener:

printJob.addPrintJobListener(new MyPrintJobListener());

,类MyPrintJobListenenr为:

public class MyPrintJobListener implements PrintJobListener{
    public void printDataTransferCompleted(PrintJobEvent pje) {
        System.out.println("printDataTransferCompleted");
    }

    public void printJobCanceled(PrintJobEvent pje) {
        System.out.println("The print job was cancelled"); 
    }

    public void printJobCompleted(PrintJobEvent pje) {
        System.out.println("The print job was completed"); 
    }

    public void printJobFailed(PrintJobEvent pje) {
        System.out.println("The print job has failed");
    }

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

    public void printJobRequiresAttention(PrintJobEvent pje) {
        System.out.println("The print job require attention");
    }
}