Duda imprimir texto plano en java

E

Pregunta, alguien ha impreso texto plano (imprimir de enviar a impresora USB, no a pantalla o fichero xD ) en Java?

Llevo una semana peleándome. Primero con el puerto serie y ahora imprimir un puto txt...

import java.io.FileInputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;

public class test2 {

static public void main(String args[]) throws Exception {
	PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
	pras.add(new Copies(1));
	PrintService pss[] = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.GIF, pras);
	if (pss.length == 0)
		throw new RuntimeException("No printer services available.");
	PrintService ps = pss[6];
	System.out.println("Printing to " + ps);
	DocPrintJob job = ps.createPrintJob();
	FileInputStream fin = new FileInputStream("C:/0.png");
	Doc doc = new SimpleDoc(fin, DocFlavor.INPUT_STREAM.GIF, null);
	job.print(doc, pras);
	fin.close();
}
}

Con un gif funciona perfecto, pero por qué con texto plano no? He usado el AUTOSENSE de DocFlavor y nanai...

FrioneL

Pues no tengo ni idea, pero en tu trozo de codigo pone "DocFlavor.INPUT_STREAM.GIF". No va a ser eso?

#3 Pues pon el codigo que no funciona xD

1 respuesta
E

#2 no, ese ejemplo es con un gif, y funciona. Pero con un txt cambiando las cosas nanai...

1 respuesta
jalamoNNN

#3 pon el código que no funciona y describe mejor el problema que da (si salta una excepción, si termina el programa sin hacer nada, si te imprime una hoja en blanco...)

1 1 respuesta
p0stm4n

¿No te sirve imprimir a PDF y luego imprimir ese archivo?, yo en Java no lo he hecho, pero sí en Python utilizando Django + ReportLab + xhtml2pdf.

Mirando por la red he encontrado algo que te puede interesar bastante:

http://stackoverflow.com/questions/17825782/how-to-convert-html-to-pdf-using-itext
http://hmkcode.com/itext-html-to-pdf-using-java/

Ahora bien, es muy posible que necesites utilizar un motor de plantillas (template engine) para etiquetas dinámicas.

El motor de plantillas de Django es algo muy parecido a Jinja2, hay una versión para Java.

Resumiendo el proceso sería el siguiente:

1º Generar un documento HTML con etiquetas dinámicas.
2º Crearse un mapa para poner valores personalizados a las etiquetas dinámicas (le puedes meter cualquier string).
3º Pasar la plantilla renderizada a iText que te generará el PDF.
4º Imprimir el PDF.

Otra opción es mirar como imprimir PDFs cargados en memoria desde Java (sin pasar por el disco duro vamos), pero ya en ese tema no puedo guiarte, pero no debería ser muy complicado.

1 respuesta
E

#4

import java.io.FileInputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;

public class test2 {

static public void main(String args[]) throws Exception {
	PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
	pras.add(new Copies(1));
	PrintService pss[] = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.AUTOSENSE, pras);
	if (pss.length == 0)
		throw new RuntimeException("No printer services available.");
	PrintService ps = pss[6];
	System.out.println("Printing to " + ps);
	DocPrintJob job = ps.createPrintJob();
	FileInputStream fin = new FileInputStream("C:/a.txt");
	Doc doc = new SimpleDoc(fin, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
	job.print(doc, pras);
	fin.close();
}
}

#5 sí, el lunes mismo lo logré pasando el txt a pdf e imprimiendo el pdf, pero debería funcionar con texto plano, pero no entiendo por qué no... Es una linea lo que debo imprimir, porque estoy recibiendo las llamadas realizadas desde una centralita mediante cable serial, no me detecta bien todos los paquetes... Un pifostio xD

1 respuesta
jalamoNNN

#6 has probado a quitar el fin.close() del final? Parece una tontería, pero probablemente el .print se este ejecutando en un thread de manera asíncrona y antes de que haga nada ya has hecho el .close sobre FileInputStream del Doc y por lo tanto no pueda ni siquiera leer los primeros bytes del archivo.

1 respuesta
E

#7 el código funciona perfectamente con una imagen png de varios megas y no funciona con un txt de 1 kB xD probaré lo del fin.close() pero no creo que sea eso.

pikMR

podrías probar a pasar el texto a un buffer e imprimir linea a linea

1 respuesta
E

#9 probado y sigue sin funcionar. No le gusta el texto plano por lo que sea a la impresora xD

1 respuesta
jalamoNNN

#10 Antes de nada asegúrate de que a partir del FileInputStream que has creado puedes sacar el texto que contiene el archivo (por ejemplo, leyendo con un BufferedReader y printando por pantalla), que seguramente puedas, pero por si acaso descartamos este problema. Si esto te funciona entonces está claro que lo que falla es un parámetro del Doc. Prueba tres cosas, supongo que alguna te funcionará (basicamente ir probando distintos flavors):

  • Deja todo como está excepto el flavor, fuérzalo a DocFlavor.INPUT_STREAM.TEXT_PLAIN_HOST.
  • Cambia el FileInputStream a BufferedReader(new FileReader("C:/a.txt" )) y el flavor a DocFlavor.READER.TEXT_PLAIN.
  • Crea un String con el contenido del fichero (usando el constructor String(Files.readAllBytes("C:/a.txt" )) y en este caso usa el DocFlavor.STRING.TEXT_PLAIN.
  • Si no te funciona ninguna prueba los flavors que seteen el charset a UTF8.
    Es cuestión de ir probando.
21 días después
E

Comentaros que probé de todo y nada. Al final con una libería y pasando a PDF logré que funcionase.

Usuarios habituales

  • elraro
  • jalamoNNN
  • pikMR
  • p0stm4n
  • FrioneL