1

我正在使用以下方法将 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);
    }
4

2 回答 2

0

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

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

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

于 2013-04-17T13:23:37.830 回答
0

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

我不知道这是否是最好的方法,但如果没有其他方法,您可以尝试添加一个 printJobListener :

printJob.addPrintJobListener(new MyPrintJobListener());

MyPrintJobListenr 类为:

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");
    }
}
于 2013-04-23T07:37:27.127 回答