我有一个打印 PDF 的 java 程序。它使用 Apache PDFBox 创建PDDocument
对象(从 pdf 文档或在某些情况下从流),然后使用javax.print
API 将其发送到打印机:
private boolean print(File pdf, String printer)
{
boolean success = false;
try (PDDocument document = PDDocument.load(pdf))
{
PrintService[] printServices = PrinterJob.lookupPrintServices();
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(document));
// set printer
if (printer != null)
{
for (PrintService selected : printServices)
{
if (selected.getName().equals(printer))
{
printService = selected;
break;
}
}
}
job.setPrintService(printService);
job.print();
success = true;
}
catch (Exception e)
{
myLog.error("Printer error.", e);
}
return success;
}
现在我需要能够告诉打印机装订东西......
我熟悉 javax.print.attributes API,并成功地使用它来指定托盘或设置双面打印,例如:
// this works fine
if (duplex != null)
{
if (duplex.equalsIgnoreCase("short"))
{
myLog.debug("Setting double-sided: Short");
attr.add(Sides.TWO_SIDED_SHORT_EDGE);
}
else
{
myLog.debug("Setting double-sided: Long");
attr.add(Sides.TWO_SIDED_LONG_EDGE);
}
}
我知道装订有一个属性:
attr.add(javax.print.attribute.standard.Finishings.STAPLE);
我有一个 Xerox Versalink B7035,带有一个 Finisher XL 附件,它完全支持装订(即它适用于 MS Office 文档设置),但是打印机忽略了 Java 设置的 STAPLE 属性。我尝试了所有其他装订属性的变体,但很快发现打印机不支持任何 Java 整理属性。
或者将其放入代码中,以下打印 NO 结果:
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
Object finishings = myPrinter.getSupportedAttributeValues(Finishings.class, flavor, null);
if (finishings != null && o.getClass().isArray())
{
for (Finishings finishing : (Finishings[]) finishings)
{
System.out.println(finishing.getValue() + " : " + finishing);
}
}
在阅读了这篇文章并尝试了一些不同的东西后,我得出结论,打印机不会接受 STAPLE 属性,因为装订器是附件,或者仅仅是因为施乐不喜欢 Java 或其他东西。所以现在我试图通过在发送之前将 PJL 命令添加到 pdf 来解决这个问题,如此处所述。*PJL = 打印作业语言
例如:
<ESC>%-12345X@PJL<CR><LF>
@PJL SET STAPLE=LEFTTOP<CR><LF>
@PJL ENTER LANGUAGE = PDF<CR><LF>
[... all bytes of the PDF file, starting with '%PDF-1.' ...]
[... all bytes of the PDF file ............................]
[... all bytes of the PDF file ............................]
[... all bytes of the PDF file, ending with '%%EOF' .......]
<ESC>%-12345X
起初我认为Apache PDFBox 库中只有一些方法可以做到这一点,但没有运气。然后我检查了Ghost4J的 API并没有看到任何要添加的东西。有没有其他人已经解决了这个问题?