Как использовать Qt QPrinter для отправки команды обрезки бумаги

Я пишу настольную программу Qt, которая должна распечатать квитанцию ​​после транзакции. Для этого мне нужно оформить «порезанную бумагу» в конце каждой квитанции.
Я понимаю, что следующие символы ascii (ascii 27 + ascii 105) должны быть отправлены в конце печатного текста, чтобы разрезать бумагу.

Я не смог найти документацию о том, как отправить это с помощью QPrinter. Я использую QPrinter & QPainter для реализации печати.

Если кто-то пытался это сделать, пожалуйста, посоветуйте, как обрабатывать команду нарезать бумагу в Qt

1

Решение

Я нашел ответ на этот вопрос и опубликовал его, чтобы он мог быть полезен для других.

Я использовал команду добавления (символ ascii) для добавления команд принтера к принтеру.

Вот пример кода, который я использовал:

QString printer_name = "PrinterOne";
qDebug() << "Test printing started...";

QByteArray print_content_ba("Test Print text ");
print_content_ba.append("\n");

//add end of the receipt buffer & cut command
print_content_ba.append(27);
print_content_ba.append(105);

HANDLE p_hPrinter;
DOC_INFO_1 DocInfo;
DWORD   dwJob = 0L;
DWORD   dwBytesWritten = 0L;
BOOL    bStatus = FALSE;

//code to convert QString to wchar_t
wchar_t szPrinterName[255];
int length = printer_name.toWCharArray(szPrinterName);
szPrinterName[length]=0;

if (OpenPrinter(szPrinterName,&p_hPrinter,NULL)){
qDebug() << "Printer opening success " << QString::fromWCharArray(szPrinterName);
DocInfo.pDocName = L"Loyalty Receipt";
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = L"RAW";
dwJob = StartDocPrinter( p_hPrinter, 1, (LPBYTE)&DocInfo );
if (dwJob > 0) {
qDebug() << "Job is set.";
bStatus = StartPagePrinter(p_hPrinter);
if (bStatus) {
qDebug() << "Writing text to printer" << print_content_ba ;
bStatus = WritePrinter(p_hPrinter,print_content_ba.data(),print_content_ba.length(),&dwBytesWritten);
if(bStatus > 0){
qDebug() << "printer write success" << bStatus;
}
EndPagePrinter(p_hPrinter);
} else {
qDebug() << "could not start printer";
}
EndDocPrinter(p_hPrinter);
qDebug() << "closing doc";
} else {
qDebug() << "Couldn't create job";
}
ClosePrinter(p_hPrinter);
qDebug() << "closing printer";
}
else{
qDebug() << "Printer opening Failed";
}
0

Другие решения

Хотя у меня нет точного ответа на ваш вопрос, у меня работает чековый принтер. Команда «вырезать» задается TmxPaperSource=DocFeedCut аргумент в команде печати.

Я делаю PDF, а затем отправляю его на принтер (я не печатаю обычные чеки …).

void printSomething(QGraphicsScene* scene)
{
/* Make a PDF-Printer */
QPrinter pdfPrinter(QPrinter::ScreenResolution);
pdfPrinter.setOutputFormat( QPrinter::PdfFormat );
pdfPrinter.setPaperSize( QSize(100, 80), QPrinter::Millimeter );
pdfPrinter.setPageMargins( QMarginsF(2, 0, 5.8, 0) ); //dont set top and bottom margins
pdfPrinter.setColorMode(QPrinter::GrayScale);
pdfPrinter.setResolution(203); //dpi of my printer
pdfPrinter.setFullPage(true);
pdfPrinter.setOutputFileName( "hello.pdf" );

/* Render the Scene using the PDF-Printer */
QPainter pdfPainter;
pdfPainter.begin( &pdfPrinter );
scene->render( &pdfPainter );
pdfPainter.end();

/* Print */
system( std::string("lp -o PageSize=RP80x297 -o TmxPaperReduction=Bottom -o Resolution=203x203dpi -o TmxPaperSource=DocFeedCut -o TmxMaxBandWidth=640  -o TmxPrintingSpeed=auto hello.pdf").c_str() );
}
0

По вопросам рекламы [email protected]