6

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

在调试过程中,我可以看到打印对象将其副本变量从 0 更改为 2,所以我假设我做的一切都是正确的。我也一直在使用排序规则和多个文档处理变量,但最终结果保持不变。

有谁知道我怎样才能让它打印正确的份数?

我的代码:

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

所以我一直在玩更多。我添加了一些 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)

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


好的,我找到了为什么会发生这种情况,我选择的风味不支持多个副本。将其设置为 pdf 会导致我得到一个 flavornotsupported 异常,因为我没有安装支持从 pdf 源打印的打印机。


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

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

http://pdfbox.apache.org/

我不再有权访问代码,但这可能对未来的访问者有用。:)

4

0 回答 0