我正在尝试打印 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) 解决了这个问题,它为我提供了一个输入流,我可以将它发送到打印机以及我需要的所有设置。
我不再有权访问代码,但这可能对未来的访问者有用。:)