Java 8 问题打印 PS 到网络打印机
Java 8 issues printing PS to network printer
有一个奇怪的问题要问你。最近将我的旧项目从 java 7(jdk1.7.0_10) 升级到 java 8(1.8.0.91.x86_64)。在 java 7 中,它打印 post 脚本文件没有任何问题,现在它将 post 脚本文件打印为纯文本,而不是转换文件。这是在 redhat linux 环境中。简单地说,我试图打印一个包含文件本身的 post 脚本文件的字符串。
这是我的原代码
DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintService pService = PrintServiceLookup.lookupDefaultPrintService();
// In a field environment, send to the printer
if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) {
if (pService.getName().isEmpty()) {
LOGGER.error("No printer selected");
} else {
LOGGER.info("Printing to " + pService.getName());
DocPrintJob pj = pService.createPrintJob();
try {
InputStream is = new ByteArrayInputStream(data.getBytes("UTF8"));
Doc doc = new SimpleDoc(is, flavor, null);
PrintJobWatcher pjw = new PrintJobWatcher(pj);
pj.print(doc, null);
pjw.waitForDone();
is.close();
} catch (PrintException | IOException e) {
LOGGER.error(e);
} // try block
} // no printer selected
// Otherwise, send to a file
} else {
在 java 7 中运行良好,我将其更新为此处为 java 8 找到的 oracle 规范。
https://docs.oracle.com/javase/8/docs/api/javax/print/PrintService.html#createPrintJob--
https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/printing.fm6.html
DocFlavor psFlavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(MediaSizeName.ISO_A4);
PrintService[] pservices = PrintServiceLookup.lookupPrintServices(psFlavor,
attrs);
File pfr = new File(PFR_INDICATOR);
// In a field environment, send to the printer
if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) {
//Check we have a printer capable of post script
if (pservices.length > 0) {
LOGGER.info("Printing to " + pservices[0].getName());
DocPrintJob pj = pservices[0].createPrintJob();
try {
InputStream fis = new ByteArrayInputStream(data.getBytes("UTF8"));
//byte[] ba =data.getBytes("UTF8");
Doc doc = new SimpleDoc(fis, psFlavor, null);
LOGGER.info("Doc Flavor " + doc.getDocFlavor());
PrintJobWatcher pjw = new PrintJobWatcher(pj);
LOGGER.info("PrintJob Attributes : " + pj.getAttributes());
pj.print(doc, attrs);
pjw.waitForDone();
fis.close();
} catch (IOException e) {
LOGGER.error(e);
NotificationDialog.show(NotificationDialog.NOTICE_TYPE.ERROR, PRINT_ERROR);
} catch (PrintException e) {
LOGGER.error(e);
}
} else { // no printer selected
这给了我一个错误 java.awt.print.PrinterIOException: java.io.IOException: /usr/bin/lpr: 它看起来找不到 lpr。
如果我保持原样(不写入文件),它会以纯文本形式打印 post 脚本,即使添加检查以检查打印机是否支持 post 脚本.如果我使用新的打印文件方式,我会收到 lpr not found 错误。如果我使用命令 lpr 打印 PS 文档,它会按预期进行转换并正常打印。如果我使用不格式化的 lpr -l,它也会将文档打印为纯文本。
任何 suggestion/help 都很好。我不知道该怎么做。我真的不想将其转换为图像并打印出来。
我猜你的打印机是 HP 或至少是 PCL + PS 打印机,而不是纯 PostScript 打印机。
在那种情况下,您通常需要在 PostScript 前加上语言选择 PJL 字符串。如果您不这样做,那么它通常默认为 PCL 并且如果您不发送任何 PCL 命令(全部以 0x1B 开头),那么所有内容都将被视为纯 ASCII 文本。这可以解释为什么您的应用程序和 lpr -l 最终都会写入文本,但 lpr 本身不会(大概它添加了 PJL)。
您可以尝试在 PostScript 文件前添加类似以下内容:
%-12345X@PJL JOB
@PJL ENTER LANGUAGE=POSTSCRIPT
注意 % 之前的第一个字节应该是 0x1b ESC 字符,但我不能轻易粘贴二进制文件....
尝试使用 lpr -l
发送文件,如果可行,那么您可以尝试使用旧的打印方法。
有一个奇怪的问题要问你。最近将我的旧项目从 java 7(jdk1.7.0_10) 升级到 java 8(1.8.0.91.x86_64)。在 java 7 中,它打印 post 脚本文件没有任何问题,现在它将 post 脚本文件打印为纯文本,而不是转换文件。这是在 redhat linux 环境中。简单地说,我试图打印一个包含文件本身的 post 脚本文件的字符串。
这是我的原代码
DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintService pService = PrintServiceLookup.lookupDefaultPrintService();
// In a field environment, send to the printer
if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) {
if (pService.getName().isEmpty()) {
LOGGER.error("No printer selected");
} else {
LOGGER.info("Printing to " + pService.getName());
DocPrintJob pj = pService.createPrintJob();
try {
InputStream is = new ByteArrayInputStream(data.getBytes("UTF8"));
Doc doc = new SimpleDoc(is, flavor, null);
PrintJobWatcher pjw = new PrintJobWatcher(pj);
pj.print(doc, null);
pjw.waitForDone();
is.close();
} catch (PrintException | IOException e) {
LOGGER.error(e);
} // try block
} // no printer selected
// Otherwise, send to a file
} else {
在 java 7 中运行良好,我将其更新为此处为 java 8 找到的 oracle 规范。 https://docs.oracle.com/javase/8/docs/api/javax/print/PrintService.html#createPrintJob--
https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/printing.fm6.html
DocFlavor psFlavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(MediaSizeName.ISO_A4);
PrintService[] pservices = PrintServiceLookup.lookupPrintServices(psFlavor,
attrs);
File pfr = new File(PFR_INDICATOR);
// In a field environment, send to the printer
if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) {
//Check we have a printer capable of post script
if (pservices.length > 0) {
LOGGER.info("Printing to " + pservices[0].getName());
DocPrintJob pj = pservices[0].createPrintJob();
try {
InputStream fis = new ByteArrayInputStream(data.getBytes("UTF8"));
//byte[] ba =data.getBytes("UTF8");
Doc doc = new SimpleDoc(fis, psFlavor, null);
LOGGER.info("Doc Flavor " + doc.getDocFlavor());
PrintJobWatcher pjw = new PrintJobWatcher(pj);
LOGGER.info("PrintJob Attributes : " + pj.getAttributes());
pj.print(doc, attrs);
pjw.waitForDone();
fis.close();
} catch (IOException e) {
LOGGER.error(e);
NotificationDialog.show(NotificationDialog.NOTICE_TYPE.ERROR, PRINT_ERROR);
} catch (PrintException e) {
LOGGER.error(e);
}
} else { // no printer selected
这给了我一个错误 java.awt.print.PrinterIOException: java.io.IOException: /usr/bin/lpr: 它看起来找不到 lpr。
如果我保持原样(不写入文件),它会以纯文本形式打印 post 脚本,即使添加检查以检查打印机是否支持 post 脚本.如果我使用新的打印文件方式,我会收到 lpr not found 错误。如果我使用命令 lpr 打印 PS 文档,它会按预期进行转换并正常打印。如果我使用不格式化的 lpr -l,它也会将文档打印为纯文本。
任何 suggestion/help 都很好。我不知道该怎么做。我真的不想将其转换为图像并打印出来。
我猜你的打印机是 HP 或至少是 PCL + PS 打印机,而不是纯 PostScript 打印机。
在那种情况下,您通常需要在 PostScript 前加上语言选择 PJL 字符串。如果您不这样做,那么它通常默认为 PCL 并且如果您不发送任何 PCL 命令(全部以 0x1B 开头),那么所有内容都将被视为纯 ASCII 文本。这可以解释为什么您的应用程序和 lpr -l 最终都会写入文本,但 lpr 本身不会(大概它添加了 PJL)。
您可以尝试在 PostScript 文件前添加类似以下内容:
%-12345X@PJL JOB
@PJL ENTER LANGUAGE=POSTSCRIPT
注意 % 之前的第一个字节应该是 0x1b ESC 字符,但我不能轻易粘贴二进制文件....
尝试使用 lpr -l
发送文件,如果可行,那么您可以尝试使用旧的打印方法。