Java打印多份副本,但只有一份最终在打印机上

Rem*_*der 6 java printing pdf

我正在尝试打印pdf文档的多个副本.在谷歌搜索后,我发现我必须将一个副本放在PrintRequestAttributeSet中.但在这样做之后,只打印了1份而不是我提供的数量.

在调试期间,我可以看到打印对象将其副本变量从0更改为2,因此我假设我正确地执行了所有操作.我也一直在玩collat​​ion和multipledocumenthandling变量,但最终结果保持不变.

有谁知道我怎么能打印出正确数量的副本?

我的代码:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
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.MultipleDocumentHandling;
import javax.print.attribute.standard.SheetCollate;

public class PrintTest {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        InputStream is = new BufferedInputStream(
                new FileInputStream(
                        "<Insert pdf file here>"));

        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

        Copies copies = new Copies(2);

        SheetCollate collate = SheetCollate.COLLATED;

        MultipleDocumentHandling handling = MultipleDocumentHandling.SEPARATE_DOCUMENTS_COLLATED_COPIES;

        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

        pras.add(copies);
        pras.add(collate);
        pras.add(handling);

        PrintService service = PrintServiceLookup.lookupDefaultPrintService();

        DocPrintJob printJob = service.createPrintJob();

        Doc doc = new SimpleDoc(is, flavor, null);

        printJob.print(doc, pras);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我一直在玩更多.我添加了一些sysout语句,我发现你有一些名为Fidelity的东西,可以用来强制它拒绝打印作业,如果它不能完全按照指定打印.但是这有一些问题.在为其添加保真度设置后,我最终得到以下输出:

[class javax.print.attribute.standard.JobName, class javax.print.attribute.standard.RequestingUserName, class javax.print.attribute.standard.Copies, class javax.print.attribute.standard.Destination, class javax.print.attribute.standard.OrientationRequested, class javax.print.attribute.standard.PageRanges, class javax.print.attribute.standard.Media, class javax.print.attribute.standard.MediaPrintableArea, class javax.print.attribute.standard.Fidelity, class javax.print.attribute.standard.SheetCollate, class sun.print.SunAlternateMedia, class javax.print.attribute.standard.Chromaticity, class javax.print.attribute.standard.Sides, class javax.print.attribute.standard.PrinterResolution]
[]
Exception in thread "main" sun.print.PrintJobAttributeException: unsupported attribute: collated
    at sun.print.Win32PrintJob.getAttributeValues(Win32PrintJob.java:667)
    at sun.print.Win32PrintJob.print(Win32PrintJob.java:332)
    at net.pearlchain.print.distribute.jasper.PrintTest.main(PrintTest.java:52)
Run Code Online (Sandbox Code Playgroud)

不受支持的属性与每次执行不同,但始终是我设置的属性之一.我尝试使用java 6和java 7运行它,我得到的唯一区别是抛出异常的行.在java 6上,它在第667行,在java 7上是第685行.查看在grepcode中找到的代码,我可以看到抛出的异常,但实际原因尚不清楚.


好的,我发现了为什么会这样,我选择的味道不支持多份副本.将它设置为pdf会导致我获得一个支持版本的异常,因为我没有安装支持从pdf源打印的打印机.


已经很长时间了,我忘了在这里为未来的访客发布我的解决方案.

我通过添加第三方pdf库(Apache PDFBox)解决了这个问题,它为我提供了一个输入流,我可以使用我需要的所有设置将其发送到打印机.

http://pdfbox.apache.org/

我不再能够访问代码,但这可能对将来的访问者有用.:)