PDA

Ver la Versión Completa : imprimir ticket con logo y abrir cajon


anubis
23-10-2016, 22:15:00
Hola amigos,

No sabia si esta pregunta debia de venir en este subforo o bien en impresion :(.

Estoy intentando imprimir un ticket en una impresora ecs, con su logo y el ticket, y posteriormente abrir el cajon, pero este ultimo no abre.
Ya estuve dando vueltas por el subforo de impresion, pero no encontre nada que me sirviera asi que pongo la procedure donde hago todo el asunto a ver si hay algo que estoy haciendo mal.

procedure tfventas.imprimelinea;
const
margin_left = 1;
margin_top=70;
var
i: Integer;
MiMapadeBits : TBitMap;
begin
MiMapadeBits := TBitMap.Create;
{ Creamos el objeto MiMapadeBits }
MiMapadeBits.Width := PAGE.Width; { Definimos su anchura }
MiMapadeBits.Height := page.Height; { Definimos su altura }
page.BorderStyle:=bsNone; { Definimos el estilo del borde a ninguno }
page.PaintTo(MIMAPADEBITS.Canvas, 0, 0);
page.BorderStyle:=bsSingle;


with printer do
try
BeginDoc;
Canvas.Font.Name := 'COURIER NEW';
CANVAS.FONT.Style:=[FSbOLD];
Canvas.Font.Size := 6;
Canvas.Font.Color := clBlack;

Canvas.CopyRect(Classes.Rect(1, 0, 365, 60),
MiMapadeBits.Canvas, Classes.Rect(0, 0, MIMAPADEBITS.Width, mIMAPADEBITS.Height));

for i := 0 to IMPRIMIR_ticket.Count - 1 do
begin
// page.Height:=margin_top+ i*printer.Canvas.TextHeight(imprimir_ticket.Strings[i]);
Canvas.TextOut(
MARGIN_LEFT,
MARGIN_TOP + i*printer.Canvas.TextHeight(imprimir_ticket.Strings[i]),
imprimir_ticket.Strings[i]);

end;
canvas.TextOut(0,0,#27+#10+#13+#027+#112+#0+#100+#250+#10+#13);
// canvas.Clear;
finally
EndDoc;

mimapadebits.Free;
end;

El ticket con logo si imprime, luego he dejado unos espacios para poder cortar el papel manualmente y finalmente me imprime " +p d" Lo pongo para que veais de donde viene y si se pueden combinar las dos cosas, porque en otro lado dice que tiene que imprimir como raw. Ando hecho un lio.

Gracias amigos.

Casimiro Notevi
23-10-2016, 22:55:00
canvas.TextOut(0,0,#27+#10+#13+#027+#112+#0+#100+#250+#10+#13);
Es '27,112,0,25,250', quita el escape de antes, y los 10 y 13.

anubis
24-10-2016, 16:13:05
Gracias por contestar Casimiro Notevi ;)

La verdad es que ya probe varias combinaciones, esta fue la ultima que deje.

canvas.TextOut(0,0,#027+#112+#0+#100+#250+#10+#13);
Eso lo saque de la web de seoane, del programa printest y si me abria el cajon pero directamente con su programa.

voy a probar la que propones a ver si funciona ;).

canvas.TextOut(0,0,#27+#112+#0+#25+#250);

Muchas gracias amigo, ya dire como fue ;).

anubis
25-10-2016, 02:18:13
No puedo editar :(, asi que tengo que responder de nuevo.

Ese codigo la verdad no hace nada, ni imprime nada :(. El cajon esta unido a la impresora por si sirve de algo.

Ya intente tambien meterlo como texto dentro de string.

imprimir_ticket.add(chr(27)+chr(112)+chr(0)+chr(25)+chr(250));

Ahi si me imprime una flecha y una "p"

No se si el canvas.out funciona unido al codigo que puse.

gracias de nuevo

Casimiro Notevi
25-10-2016, 02:21:11
Pero el canvas es para pintar, ¿no?
Debes usar la opción de imprimir, es un comando más que se envía a la impresora y que esta lo redirige al cajón.

anubis
25-10-2016, 02:54:32
perdona mi ignorancia a estas alturas,

cual es el comando para imprimir,
en base a lo que puse en el primer post, si me imprime el logo y el texto del ticket, todo correcto, si le meto la linea acabando el for y añado los codigos de la impresora como texto.

ando muy perdido. Llevo algunas semanas intentando abrir el cajon.

Casimiro Notevi
25-10-2016, 12:31:54
¿printer es un tprinter?
Antes de nada deberías verificar si el cajón funciona, que una vez me pasó algo similar con un cajón y resulta que estaba defectuoso y por eso no abría :)

anubis
26-10-2016, 02:58:43
Gracias de nuevo,

Funcionar si funciona porque de hecho, usando printtest de seoane si funciona sin problemas, por eso quise usar le mismo codigo.

Printer si es tprinter de la unit printers.pas

Por eso decia si se podia enviar codigo a la impresora como string dentro del mismo cuerpo

with printer do
begindoc
...
enddoc

porque la impresion del logo y de los datos del ticket si los imprime, solo me falta el detalle del cajon.

Estuve buscando en los foros a ver si encontraba algo apropiado, pero no he visto nada, :(.

Casimiro Notevi
26-10-2016, 03:18:29
¿Has probado así?
printer.Canvas.TextOut(0,0,#27#112#0#25#250);

Casimiro Notevi
26-10-2016, 03:23:13
¿Y así?
Var
cajon : Text;
Begin
assignFile(cajon, 'com1');
rewrite(cajon);
try
write(cajon,#27#112#0#25#250);
finally
Close(cajon);
end;
end;

anubis
27-10-2016, 01:22:01
Asi no funciona tampoco, lo que si funciona, pero por separado,


procedure TForm1.Button1Click(Sender: TObject);
begin
with Printer do
begin
// PRINTER.PrinterIndex := impresora;
printer.PrinterIndex:=0;
RawMode := True;
BeginDoc;
font.Name:='arial';
font.Size:=6;

// for i := 0 to IMPRIMIR_ticket.Count - 1 do
begin
// printstring(imprimir_ticket.Strings[i]+lineending);
end;
printstring(#27+#112+#0+#25+#250+lineending);
(* printstring(' '+lineending);
printstring(' '+lineending);
printstring(' '+lineending);
printstring(' '+lineending);
printstring(' '+lineending);*)
enddoc;
end;
end;
procedure tform1.PrintString(S: String);
var
Written: Integer;
begin
Printer.Write(S[1], Length(S), Written);
end;


Asi, con eso solo si funciona, si mezclo las dos cosas: la primera que puse en el post para imprimir el logo y ticket no funciona, me da error diciendo que printer esta en raw mode.

edito: ya combine los dos, y si me imprime y saca el cajon, lo unico malo que, como hay dos begindoc..enddoc, el segundo tarda en mandar el comando. Porque ademas, le puse en el primer bloque rawmode:=false.

sigo perdido, la idea era que saliera todo en el mismo bloque.

Casimiro Notevi
27-10-2016, 03:04:40
¿Necesitas el rawmode=true?
¿Qué ocurre si lo dejas a false?

Delphius
27-10-2016, 04:00:31
Yo la verdad es que no tengo ni la más remota idea sobre como operar los cajones, pero si dices que de forma "separada" lograste andar, quizá sea lo mejor y más sano.
No descartaría que sea bastante probable de que no pueda mezclarse ambas cosas. En cierta forma, tiene sentido: una cosa es imprimir un ticket, y otra es que de forma indirecta por medio de la impresora se envíe la orden/comando al cajón. La impresora no puede atender las dos cosas a la vez. O imprime o abre el cajón.
La orden de apertura no es un documento más y no se guarda en la cola.

Saludos,

anubis
27-10-2016, 04:57:30
Casimiro Notevi. Sobre el rawmode:=true para enviar codigos a la impresora debe de estar asi sino no funciona, al menos en la parte del codigo de programa que saque de los foros. Sino lo pongo o lo dejo en false, a la hora de enviar los codigos a la impresora, se queja la aplicacion y dice que debe estar en rawmode:=true.

Delphius. Si, son dos cosas diferentes segun estoy viendo. Por un lado logo y ticket y por el otro la apertura. El problema surge, cuando cierro un begindoc..enddoc y vuelvo a abrir begindoc..enddoc para abrir el cajon. La verdad es que se tarda y no debiera ser asi. Se que alguien debe de haber implementado algo mas rapido para sus programas.

Todavia no he dado con ello, pero vere que hago para resolver.

pense que con printer.texout se podian mandar codigos a la impresora, pero no hacen nada :(.

Gracias a los dos. Os dire si he resuelto algo. ;).

anubis
31-10-2016, 15:05:52
Perfecto amigos. Gracias.

Deje las dos partes:

procedure tfventas.imprimelinea;
const
margin_left = 1;
margin_top=70;

var
i: Integer;
MiMapadeBits : TBitMap;

begin

MiMapadeBits := TBitMap.Create;
{ Creamos el objeto MiMapadeBits }
MiMapadeBits.Width := PAGE.Width; { Definimos su anchura }
MiMapadeBits.Height := page.Height; { Definimos su altura }
page.BorderStyle:=bsNone; { Definimos el estilo del borde a ninguno }
page.PaintTo(MIMAPADEBITS.Canvas, 0, 0);
page.BorderStyle:=bsSingle;
with printer do
try
rawmode:=false;
BeginDoc;
Canvas.Font.Name := 'COURIER NEW';
CANVAS.FONT.Style:=[FSbOLD];
Canvas.Font.Size := 6;
Canvas.Font.Color := clBlack;
Canvas.CopyRect(Classes.Rect(1, 0, 365, 60),
MiMapadeBits.Canvas, Classes.Rect(0, 0, MIMAPADEBITS.Width, mIMAPADEBITS.Height));
for i := 0 to IMPRIMIR_ticket.Count - 1 do
begin
Canvas.TextOut(
MARGIN_LEFT,
MARGIN_TOP + i*printer.Canvas.TextHeight(imprimir_ticket.Strings[i]),
imprimir_ticket.Strings[i]);
end;
finally
EndDoc;
mimapadebits.Free;
with Printer do
begin
PRINTER.PrinterIndex := 0;
RawMode := True;
BeginDoc;
printstring(#27+#112+#0+#25+#250+lineending); //ABRE CAJON
EndDoc;
end;
end;
end;


En el primer BeginDoc, imprime el logo y el ticket, y en el segundo ya me abre el cajon. No hay tiempo de espera, asi que es transparente para el usuario.

Gracias.