我在尝试使用 Java 中的 PCL 用 Deskjet 2752e 打印机打印简单文本时遇到了困难。打印机支持 HP PCL 3 GUI、HP PCLm (HP Apps/UPD) 和 URF (AirPrint)1. 尽管我多次尝试并修改了 PCL 代码,但还是无法成功打印。即使发送纯文本,打印机也没有响应。
我的目标是通过 9100 端口原始数据将打印作业直接发送到我的打印机网络,并能够使用 x 和 y 坐标定位文本(如果可能)。我正在开发一款 Android 应用,它可以打印文本,而无需提示用户进行打印设置或离开应用。对于应用来说,自动高效地将必要的数据发送到打印机并及时启动打印过程至关重要。作为该应用的唯一用户,我的目标是简化打印体验并消除不必要的提示,从而使应用更快、更高效。因此,Android 打印框架不是一种选择
这是我一直在使用的最后一段代码:
private void sendPrintJob() {
System.out.println("Connecting to the printer...");
try (Socket socket = new Socket("192.168.0.6", 9100)) {
System.out.println("Connected.");
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(generatePCL3GUI().getBytes());
out.flush();
out.close();
System.out.println("Print job successfully sent.");
} catch (Exception e) {
System.out.println(e);
}
}
public String generatePCL3GUI() {
StringBuilder pclCode = new StringBuilder();
pclCode.append("\u001B%-12345X@PJL JOB\r\n");
pclCode.append("@PJL ENTER LANGUAGE=PCL3GUI\r\n");
pclCode.append("\u001B*s0M"); // Set color mode to monochrome
pclCode.append("\u001B*t300R"); // Set resolution to 300 dpi
pclCode.append("\u001B*r0F"); // Set orientation to portrait
pclCode.append("\u001B(8U"); // Select font: Courier New
pclCode.append("\u001BE"); // Start of the print job
pclCode.append("\u001B&a100H"); // Set position (x=100, y=100)
pclCode.append("Hello, world!\r\n"); // Print text
pclCode.append("\u001B%-12345X@PJL EOJ\r\n");
return pclCode.toString();
}
答案1
遗憾的是,您的问题没有解决方案。原因很简单:PCL3 确实不支持纯文本打印,也不支持您通过代码发送给它的任何 PCL5 命令。打印机将忽略除其期望的数据类型之外的所有内容。因此,您所有的努力都“导致打印机没有响应”。
PCL3 与 PCL5 或 PCL6 没有任何共同之处。PCL5/6 向打印机发送命令,这些命令由打印机的处理器转换为像素,而 PCL3 是一种 GDI 样式的协议,它要求主机将页面转换为打印机像素。打印机期望从主机获取的是正确格式的光栅数据。
PCLm 被认为是 PDF 格式的一个子集,但它同样只支持光栅数据。因此,您的软件必须将数据转换为纸上的点。
我不知道 HP 为什么要使用 PCL 这个名称。我只能假设他们想借助 PCL5/6 的成功来销售更便宜的打印机。
使用此打印机(或任何其他 GDI 打印机)的唯一现实方法是安装制造商提供的驱动程序。
如果您无法使用正确的驱动程序,您唯一的选择就是购买支持 PCL5 的打印机。它们的价格确实比 GDI 打印机贵一点。但是,只需比您当前的打印机贵不了多少,您就可以获得支持 PCL5 的单色激光打印机。这还可以避免喷墨打印机的所有打印头堵塞问题,如果您不选择 HP 品牌,您就摆脱了 HP 耗材的束缚。