Hola
Tengo esta función que usa la API de windows para imprimir, no la escribí yo, la copié de un ejemplo de la web de microsoft y la modifiqué un poco:
Código C++:
Ver originalbool imprimirTicket(QString impresora, QByteArray datos)
{
wchar_t szPrinterName[255];
int length = impresora.toWCharArray(szPrinterName);
szPrinterName[length] = 0;
HANDLE hPrinter;
DOC_INFO_1 DocInfo;
DWORD dwJob;
DWORD dwBytesWritten;
// Need a handle to the printer.
if(!OpenPrinter(szPrinterName, &hPrinter, NULL)) {
qDebug() << "Error al abrir la impresora " << impresora;
return false;
}
// Fill in the structure with info about this "document."
DocInfo.pDocName = L"Ticket";
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = L"RAW";
// Inform the spooler the document is beginning.
if((dwJob = StartDocPrinter( hPrinter, 1, (LPBYTE)&DocInfo)) == 0) {
ClosePrinter(hPrinter);
qDebug() << "Error al crear el documento";
return false;
}
// Start a page.
if(!StartPagePrinter(hPrinter)) {
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
qDebug() << "Error al iniciar la página";
return false;
}
// Send the data to the printer.
if(!WritePrinter(hPrinter, datos.data(), datos.length(), &dwBytesWritten)) {
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
qDebug() << "Error al enviar los datos a la impresora";
return false;
}
// End the page.
if(!EndPagePrinter(hPrinter)) {
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
qDebug() << "Error al cerrar la página";
return false;
}
// Inform the spooler that the document is ending.
if( ! EndDocPrinter(hPrinter)) {
ClosePrinter(hPrinter);
qDebug() << "Error al cerrar el documento";
return false;
}
// Tidy up the printer handle.
ClosePrinter(hPrinter);
// Check to see if correct number of bytes were written.
if(dwBytesWritten != datos.length()) {
qDebug() << "Error: No coindiden los bytes escritos";
return false;
}
return true;
}
Si no recuerdo mal, la copié de aquí:
https://support.microsoft.com/es-es/kb/138594
En principio la usaba para abrir el cajón portamonedas y ningún problema, ahora quiero imprimir pequeños textos y lo hace, pero no me imprime los acentos ni los caracteres como la 'ñ'. Los textos que tengo que imprimir los tengo en un QStringList, este podría ser un ejemplo de llamada:
Código C++:
Ver originalQStringList ticketPrueba;
ticketPrueba << "Ticket de prueba";
ticketPrueba << "á é í ó ú ñ Ñ";
ticketPrueba << "Gracias por su visita";
QByteArray texto;
foreach(QString linea, ticketPrueba) {
texto.append(linea.toStdString().c_str());
texto.append('\n');
}
texto.append('\n'); // un espacio extra al final
if(imprimirTicket(impresora, texto))
qDebug() << "Ticket impreso con éxito";
Todo bien, pero la tercera línea, la de los acentos, pues salen caracteres raros. ¿Cómo podría hacer para que me imprima los acentos?
Un saludo