Estou encontrando dificuldades ao tentar imprimir texto simples usando PCL em Java com minha impressora Deskjet 2752e. A impressora suporta HP PCL 3 GUI, HP PCLm (HP Apps/UPD) e URF (AirPrint) 1. Apesar de várias tentativas e variações do código PCL, não consegui obter uma impressão bem-sucedida. Mesmo o envio de texto sem formatação resulta em nenhuma resposta da impressora.
Meu objetivo é enviar um trabalho de impressão diretamente para minha rede de impressoras por meio de dados brutos da porta 9100, com a capacidade de posicionar o texto usando as coordenadas x e y, se possível. Estou desenvolvendo um aplicativo Android que pode imprimir texto sem solicitar ao usuário as configurações de impressão ou sair do aplicativo. É crucial que o aplicativo envie de forma automática e eficiente os dados necessários para a impressora e inicie o processo de impressão imediatamente. Como único usuário do aplicativo, pretendo simplificar a experiência de impressão e eliminar solicitações desnecessárias, tornando o aplicativo mais rápido e eficiente. Portanto, a estrutura de impressão do Android não é uma opção
Aqui está o último código com o qual tenho trabalhado:
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();
}
Infelizmente não há solução para o seu problema. O motivo é muito simples: o PCL3 não oferece suporte à impressão de texto sem formatação nem a nenhum dos comandos PCL5 que você está enviando para ele com seu código. A impressora simplesmente ignorará qualquer coisa, exceto o tipo de dados que espera. Portanto, todo o seu esforço "resulta em nenhuma resposta da impressora".
PCL3 não tem nada em comum com PCL5 ou PCL6. Enquanto o PCL5/6 envia comandos para a impressora, que são convertidos em pixels pelo processador da impressora, o PCL3 é um protocolo no estilo GDI, que exige que o computador host converta a página em pixels da impressora. São esses dados raster, no formato correto, que a impressora espera do host.
O PCLm deve ser um subconjunto do formato PDF, mas, novamente, ele suporta apenas dados raster. Então, novamente, seu software precisa converter os dados em pontos no papel.
Não sei por que a HP usa o apelido PCL para isso. Só posso presumir que eles querem aproveitar o sucesso do PCL5/6 para vender impressoras mais baratas.
A única maneira realista de usar isso (ou qualquer outra impressora GDI) é instalando o driver do driver fornecido pelo fabricante.
Se você não conseguir usar o driver correto, sua única opção é investir em uma impressora compatível com PCL5. Eles custam um pouco mais do que as impressoras GDI. No entanto, por não muito mais do que sua impressora atual, você pode obter uma laser monocromática com suporte a PCL5. Isso também evitaria todos os problemas de entupimento da cabeça com jatos de tinta e, se você pular a marca HP, escaparia da prisão de consumíveis da HP.