gpt4 book ai didi

Java 打印 PDF 并带有选项(装订、双面打印等)

转载 作者:行者123 更新时间:2023-12-02 06:27:15 25 4
gpt4 key购买 nike

我有一个打印 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 装订属性。

或者将其放入代码中,以下内容不会打印任何结果:

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

阅读后this并尝试了一些不同的事情,我得出结论,打印机不会接受 STAPLE 属性,因为整理器是附件,或者仅仅是因为 Xerox 不喜欢 Java 或其他东西。所以现在我试图通过在发送 pdf 之前添加 PJL 命令来解决这个问题,as covered here 。*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 library 中只会有一些方法就是这样做,但没有运气。然后我查看了 Ghost4J 的 API并没有看到任何可以预先考虑的内容。其他人已经解决这个问题了吗?

最佳答案

恢复到 Java 套接字打印使 PJL 成为一件事:

// this works, it also printed faster than javax.print when tested
private static void print(File document, String printerIpAddress, boolean staple)
{
try (Socket socket = new Socket(printerIpAddress, 9100))
{
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
byte[] bytes = Files.readAllBytes(document.toPath());

out.write(27); //esc
out.write("%-12345X@PJL\n".getBytes());
out.write("@PJL SET DUPLEX=ON\n".getBytes());

if (staple)
{
out.write("@PJL SET STAPLEOPTION=ONE\n".getBytes());
}
out.write("@PJL ENTER LANGUAGE=PDF\n".getBytes());
out.write(bytes);
out.write(27); //esc
out.write("%-12345X".getBytes());
out.flush();
out.close();
}
catch (Exception e)
{
System.out.println(e);
}
}

所需的 PJL 命令来自此 Xerox datasheet

应该指出的是,相同的 PJL 命令适用于两种不同的 Xerox 型号一台 Lexmark 打印机,这就是我可以方便测试的全部内容。不知道其他模型是否会想要不同的东西。

不再需要 Apache PDFBox 库。或者任何外部库。

这可能适用于除 PDF 之外的其他类型的文档。

关于Java 打印 PDF 并带有选项(装订、双面打印等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55777889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com