我在尝试使用 Deskjet 2752e 打印机使用 Java 中的 PCL 打印简单文本时遇到了困难。该打印机支持 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();
}
不幸的是,您的问题没有解决方案。原因很简单:PCL3 不支持纯文本打印,也不支持您通过代码发送给它的任何 PCL5 命令。打印机将简单地忽略除其期望的数据类型之外的任何内容。因此,您的所有努力“都会导致打印机没有响应”。
PCL3 与 PCL5 或 PCL6 没有任何共同之处。PCL5/6 向打印机发送命令,由打印机处理器将命令转换为像素,而 PCL3 是 GDI 风格的协议,需要主机将页面转换为打印机像素。打印机期望从主机获得正确格式的光栅数据。
PCLm 应该是 PDF 格式的子集,但它同样只支持光栅数据。因此,您的软件必须将数据转换为纸上的点。
我不知道为什么 HP 为此使用 PCL 绰号。我只能假设他们想利用 PCL5/6 的成功来销售更便宜的打印机。
使用此打印机(或任何其他 GDI 打印机)的唯一实际方法是安装制造商提供的驱动程序。
如果您无法使用正确的驱动程序,唯一的选择是购买支持 PCL5 的打印机。它们确实比 GDI 打印机贵一点。然而,您只需花费不多于当前的打印机,就可以获得支持 PCL5 的单色激光打印机。这也可以避免喷墨打印机带来的所有打印头堵塞的麻烦,如果你跳过惠普品牌,你就可以摆脱惠普的耗材监狱。