|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
用winspool方式可以打印文本到打印机,为什么不能打印图像,将图像转为字节打印到打印机就一直出纸不打印,我想将Opencv库的Mat灰色图像通过WritePrinter方式用EPSON喷墨打印机打印出来
bool PrintRawTextToPrinter(const std::wstring& printerName, const std::wstring& text) {
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS defaults = {NULL, NULL, PRINTER_ACCESS_USE};
// 1. 打开打印机
if (!OpenPrinter(const_cast<LPWSTR>(printerName.c_str()), &hPrinter, &defaults)) {
std::wcout << L"无法打开打印机,错误码: " << GetLastError() << std::endl;
return false;
}
DOC_INFO_1 docInfo;
docInfo.pDocName = L"Raw Text Print Job";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = L"RAW";
// 2. 开始打印作业
DWORD jobId = StartDocPrinter(hPrinter, 1, (LPBYTE)&docInfo);
if (jobId == 0) {
std::wcout << L"StartDocPrinter 失败,错误码: " << GetLastError() << std::endl;
ClosePrinter(hPrinter);
return false;
}
// 3. 开始页面
if (!StartPagePrinter(hPrinter)) {
std::wcout << L"StartPagePrinter 失败,错误码: " << GetLastError() << std::endl;
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return false;
}
DWORD bytesWritten = 0;
BOOL writeResult = FALSE;
// 4. 写入文本数据
// 首先写入打印机初始化命令(ESC @)
std::string initCmd = "\x1B@"; // ESC @ 初始化打印机
writeResult = WritePrinter(hPrinter, (LPVOID)initCmd.c_str(), initCmd.length(), &bytesWritten);
if (!writeResult) {
std::wcout << L"WritePrinter (初始化) 失败,错误码: " << GetLastError() << std::endl;
}
// 转换宽字符串到多字节字符串
int requiredSize = WideCharToMultiByte(CP_ACP, 0, text.c_str(), -1, NULL, 0, NULL, NULL);
std::string narrowText(requiredSize, 0);
WideCharToMultiByte(CP_ACP, 0, text.c_str(), -1, &narrowText[0], requiredSize, NULL, NULL);
// 写入实际文本内容
writeResult = WritePrinter(hPrinter, (LPVOID)narrowText.c_str(), narrowText.length(), &bytesWritten);
if (!writeResult) {
std::wcout << L"WritePrinter (文本) 失败,错误码: " << GetLastError() << std::endl;
}
// 5. 结束页面
if (!EndPagePrinter(hPrinter)) {
std::wcout << L"EndPagePrinter 失败,错误码: " << GetLastError() << std::endl;
}
// 6. 结束打印作业
if (!EndDocPrinter(hPrinter)) {
std::wcout << L"EndDocPrinter 失败,错误码: " << GetLastError() << std::endl;
}
// 7. 关闭打印机句柄
ClosePrinter(hPrinter);
if (writeResult) {
std::wcout << L"打印任务已成功发送到打印机" << std::endl;
return true;
} else {
std::wcout << L"打印过程中出现错误" << std::endl;
return false;
}
} |
|