Foro sobre Java SE > Java-impresora térmica no imprime directamente en impresora termica Bixolon USB (crea archivo de texto)
¿Has pensado en ponerte en contacto con el fabricante, y exponerle tu problema?
Sé que en alguna ocasión, ha proporcionado un SDK para Android, tras solicitárselo.
Tengo un applet que coge un fichero .txt y lo vuelca sobre la impresora configurada por defecto. No soy muy bueno en Java estuve 2 semanas para poderlo hacer funcionar. Te lo paso por si te abre alguna luz.
import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.Reader;
import java.io.*;
import java.io.InputStream;
import java.io.IOException;
import javax.swing.*;
import java.net.*;
public class PrintTest extends JApplet {
public void init() {
try{
/* ASIGNO URL */
String fichero = getParameter("fichero");
URL pagina = new URL(fichero);
try {
/* CONECTO CON PAGINA */
HttpURLConnection conn = (HttpURLConnection) pagina.openConnection();
conn.connect();
InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
BufferedReader buff = new BufferedReader(in);
String line = null;
StringBuffer text = new StringBuffer();
int linea = 1;
do {
System.out.println(linea);
line = buff.readLine();
if (line != null && linea > 0) { text.append(line + "\n"); }
linea = 1;
} while (line != null);
PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
if (defaultPrintService != null) {
DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
String docum;
docum = text.toString();
InputStream destino = new ByteArrayInputStream(docum.getBytes());
Doc document = new SimpleDoc(destino , docFormat, null);
DocPrintJob printJob = defaultPrintService.createPrintJob();
try {
printJob.print(document, attributeSet);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.err.println("No existen impresoras instaladas");
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
} catch (MalformedURLException ex){
System.err.println("Error en tercer catch");
}
// conn.close();
}
}
Saludos,
Cuando presiono el boton que manda las instrucciones para imprimir a la impresora termica Bixolon USB, no imprime directamente, se guarda un TXT en el directorio del sistema java en disco C. Al parecer las impresoras termicas conectadas por USB tienen este problema (al enviar el comando a una impresora termica conectada por serial, por lo que he leido se imprime de inmediato). Si alguien me puede ayudar en la solución de este problema.
El codigo es el siguiente.
package sistemavip;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import static java.awt.print.Printable.NO_SUCH_PAGE;
import static java.awt.print.Printable.PAGE_EXISTS;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
class MyPrintable implements Printable {
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex != 0)
return NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) g;
g2.setFont(new Font("Serif", Font.PLAIN, 36));
g2.setPaint(Color.black);
g2.drawString("www.java2s.com", 100, 100);
Rectangle2D outline = new Rectangle2D.Double(pf.getImageableX(), pf.getImageableY(), pf
.getImageableWidth(), pf.getImageableHeight());
g2.draw(outline);
return PAGE_EXISTS;
}
}
/**
*
* @author spro
*/
public class pruebaImpresora extends javax.swing.JDialog {
/**
* Creates new form pruebaImpresora
*/
public pruebaImpresora(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jButton1.setText("Imprimir");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(185, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(176, 176, 176))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(138, 138, 138)
.addComponent(jButton1)
.addContainerGap(139, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
public void ImprimeTermico()
{
try
{
//FileWriter fw = new FileWriter("LPT1:");
FileWriter fw = new FileWriter("USB001");
//PrintWriter pw = new PrintWriter(fw);
//FileWriter output = new FileWriter("LPT1:");
BufferedWriter salida = new BufferedWriter(fw);
//Estos son comandos de control para la impresora termica, verifica si son compatibles
//para la impresora que estes usando
writeln("XXXXXXXXXXXXXXX", salida);
writeln("XXXXXXXXXXXXXXX", salida);
writeln("XXXXXXXXXXXXXXX", salida);
writeln("AU", salida);
writeln("OD", salida);
//Este es el archivo interno de la impresora, hay que borrarlo para que no se duplique
// en cada impresion
writeln("FK\"NUEVAIMPRESION\"", salida);
writeln("FK\"NUEVAIMPRESION\"", salida);
writeln("FS\"NUEVAIMPRESION\"", salida);
//Este es el tamño de la impresion, verifica cual se adapta al tamaño de la hoja
writeln("q664", salida);
writeln("Q1152,B24+24", salida);
writeln("S3", salida);
writeln("D8", salida);
writeln("ZT", salida);
writeln("TTh:m", salida);
writeln("TDy2.mn.dd", salida);
// Imprimir lo que necesites
// Verifica los parametros, la A es para definir que es un alfanumerico, si es una B es
//para Codigos de barras, los siguientes creo que son , posicion x y y, tamaño, orientacion
// y no se que mas sean
writeln("A100,20,5,3,1,1,N,\"" + "MENSAJE A IMPRIMIR" + "\"", salida);
//Con esto ultimo se cierra el archivo de trabajo de la impresora
writeln("FE", salida);
writeln("FR\"NUEVAIMPRESION\"", salida);
writeln("P1", salida);
writeln("XXXXXXXXXXXXXXX", salida);
writeln("XXXXXXXXXXXXXXX", salida);
writeln("XXXXXXXXXXXXXXX", salida);
salida.close();
}catch (IOException e) {
System.out.println(e);
}
}
public void writeln(String linea, BufferedWriter _bufOutput){
try
{
/*
// Create file
//FileWriter fstream = new FileWriter("LPT1");
BufferedWriter out = new BufferedWriter(fstream);
out.write("Hello Java");
//Close the output stream
out.close();
*/
// Create file
//FileWriter fstream = new FileWriter("out.txt");
/*BufferedWriter _bufOutput = new BufferedWriter(fstream);
_bufOutput.write(linea, 0, linea.length());
_bufOutput.newLine(); */
_bufOutput.write(linea, 0, linea.length());
_bufOutput.newLine();
}catch (IOException e) {
e.printStackTrace();
}
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
ImprimeTermico();
}