天天看點

Windows xp 驅動EPSON MT532列印發票始末

駕校列印約車發票,使用EPSON MT532列印機。xp系統重裝,原來的部署丢失了。需重新配置環境。遇到很多問題,這裡綜述一下,内網(國内網)能搜到的資料非常有限。官方文檔,幾乎沒有,這裡找到幾篇文章,可以參考https://bbs.csdn.net/topics/100013356。

安裝完應用程式和列印機驅動後,列印機無法列印。找了好多辦法,都沒有解決。

首先說一下,用的這個打票程式結果也是套牌的機器。自己提供列印機闆子,然後用的列印機還是EPSON的。首先簡單說下列印機自檢的流程。

  1. 列印機斷電,列印機自身有電源,先斷電;
  2. 關機後按住面闆上feed(進紙鍵) 按住後開機 開機也不松手 等到機器列印出來一張紙(顯示列印機的連接配接方式,驅動設定會用,第三行提示接口類型:并口),能完成這一步,證明列印機硬體連接配接沒有問題;
Windows xp 驅動EPSON MT532列印發票始末

下面的操作需要安裝驅動了,因為本質上列印機是EPSON MT532類型,驅動使用EPSON BA-T500 full cut。這個百度可以搜到,就不貼位址。下載下傳安裝,先都預設。這裡根據SP-CB532搜到時背景一家公司,網上也可以找到操作文檔http://www.docin.com/p-91217950.html。

驅動設定按下圖操作,安裝完驅動需要重新開機列印機(斷電/給電)

Windows xp 驅動EPSON MT532列印發票始末

 驅動安裝成功沒有需要看一下裝置管理,顯示列印機端口,如圖

Windows xp 驅動EPSON MT532列印發票始末

然後重新開機一下列印服務(右鍵停止服務/右鍵啟用服務),方法如圖

Windows xp 驅動EPSON MT532列印發票始末

然後再DOS視窗可以測試列印服務是否可用,dir > LPT1: 重定向到列印機輸出,會打出一張紙(那不是我的手,哈哈)。

Windows xp 驅動EPSON MT532列印發票始末

然後就可以測試列印,方法,列印機驅動右鍵-屬性-列印測試頁,如果一切正常,就可以列印出紙條了,full cut 是自動裁剪的意思,一定長度會自動采集紙條

Windows xp 驅動EPSON MT532列印發票始末

到這裡,列印機硬體連接配接測試的部分就完成了,然後是通過WinAPI驅動列印機,實作列印。先把源碼貼出來,網上粘過來的代碼,供參考(我現在也在用)

void CYcInfoPrintDlg::PrintKm2()
{
	RECT rect;

	rect.left = 50;
	rect.right = 580;
	rect.top = 0;
	rect.bottom = 1000;



	RECT rectjl;

	rectjl.left = 50;
	rectjl.right = 380;
	rectjl.top = 130;
	rectjl.bottom = 1000;


	RECT rectjl1;

	rectjl1.left = 50;
	rectjl1.right = 380;
	rectjl1.top = 140;
	rectjl1.bottom = 1000;

	RECT rectjl2;

	rectjl2.left = 50;
	rectjl2.right = 380;
	rectjl2.top = 170;
	rectjl2.bottom = 1000;

	RECT rectjl3;

	rectjl3.left = 50;
	rectjl3.right = 380;
	rectjl3.top = 200;
	rectjl3.bottom = 1000;


	RECT rectjlbctime;

	rectjlbctime.left = 150;
	rectjlbctime.right = 380;
	rectjlbctime.top = 255;
	rectjlbctime.bottom = 1000;

	RECT rectxy;

	rectxy.left = 50;
	rectxy.right = 380;
	rectxy.top = 430;
	rectxy.bottom = 1000;

	RECT rectxy1;

	rectxy1.left = 50;
	rectxy1.right = 380;
	rectxy1.top = 460;
	rectxy1.bottom = 1000;


	RECT rectxy2;

	rectxy2.left = 50;
	rectxy2.right = 380;
	rectxy2.top = 460;
	rectxy2.bottom = 1000;


	RECT rectxy22;

	rectxy2.left = 50;
	rectxy2.right = 380;
	rectxy2.top = 490;
	rectxy2.bottom = 1000;



	RECT rectxy3;

	rectxy3.left = 50;
	rectxy3.right = 380;
	rectxy3.top = 540;
	rectxy3.bottom = 1000;


	RECT rectxy4;

	rectxy4.left = 50;
	rectxy4.right = 380;
	rectxy4.top = 570;
	rectxy4.bottom = 1000;


	RECT rectxy5;

	rectxy5.left = 50;
	rectxy5.right = 380;
	rectxy5.top = 635;
	rectxy5.bottom = 1000;


	RECT rectlog;

	rectlog.left = 160;
	rectlog.right = 380;
	rectlog.top = 900;
	rectlog.bottom = 1000;

	CString m_all = _T("");
	char szprinter[80];

	char*szDevice, *szDriver, *szOutput;

	HDC hdcprint; // 定義一個裝置環境句柄

	//定義一個列印作業

	static DOCINFO di = { sizeof(DOCINFO), _T("printer"), NULL };


	try{
		// 得到裝置字元串存入數組szprinter

		GetProfileStringA("windows", "device", ",,,", szprinter, 80);

		// 将裝置字元串分解

		if (NULL != (szDevice = strtok(szprinter, ",")) && NULL != (szDriver = strtok(NULL, ",")) && NULL != (szOutput = strtok(NULL, ",")))

			// 建立一個列印機裝置句柄

			if ((hdcprint = CreateDCA(szDriver, szDevice, szOutput, NULL)) != 0)

				if (StartDoc(hdcprint, &di) > 0)//開始執行一個列印作業

				{

					StartPage(hdcprint); //列印機走紙,開始列印

					SaveDC(hdcprint); //儲存列印機裝置句柄

					HFONT hFont;
					hFont = CreateFont(40, 25, 0, 0, FW_NORMAL, false, false, false,
						CHINESEBIG5_CHARSET, OUT_CHARACTER_PRECIS,
						CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
						FF_MODERN, _T("宋體"));
					//				SelectObject(hDC, hFont);



					SelectObject(hdcprint, hFont);


					m_all = _T("三公駕培資訊管理系統\n   暢通駕校約車憑證\n");
					DrawText(hdcprint, m_all, -1, &rect, DT_CENTER | DT_VCENTER);


					//畫直線
					HPEN hPen;
					HPEN hPenOld;
					hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
					hPenOld = (HPEN)SelectObject(hdcprint, hPen);



					MoveToEx(hdcprint, 50, 100, NULL); //線的初始點
					LineTo(hdcprint, 500, 100);     //線的終點

					SelectObject(hdcprint, hPenOld);


					//字型




					//				HFONT hFont;

					hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
					hPenOld = (HPEN)SelectObject(hdcprint, hPen);

					hFont = CreateFont(25, 15, 0, 0, FW_NORMAL, false, false, false,
						CHINESEBIG5_CHARSET, OUT_CHARACTER_PRECIS,
						CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
						FF_MODERN, _T("宋體"));
					//				SelectObject(hDC, hFont);



					SelectObject(hdcprint, hFont);



					//教練
					CString m_jlname(m_Student.stjlName.c_str());

					CString m_stjlCarnumber(m_Student.stjlCarnumber.c_str());

					CString m_stjlPhone(m_Student.stjlPhone.c_str());

					CString m_stbcKsDate(m_Student.stbcKsDate.c_str());

					CString m_stbcJsDate(m_Student.stbcJsDate.c_str());

					CString m_stxySysDate(m_Student.stxySysDate.c_str());


					int lenwz = m_stxySysDate.FindOneOf(_T(" "));
					CString m_stxRq = m_stxySysDate.Left(lenwz);

					//m_all = _T("\n教練姓名:") + m_jlname + _T("\n車牌号碼:") + m_stjlCarnumber + _T("\n教練電話:") + m_stjlPhone + _T("\n預約時間段:")+m_stxRq + _T("\n");
					m_all = _T("教練姓名:") + m_jlname;
					DrawText(hdcprint, m_all, -1, &rectjl, DT_LEFT);
					m_all = _T("\n車牌号碼:") + m_stjlCarnumber;
					DrawText(hdcprint, m_all, -1, &rectjl1, DT_LEFT);
					m_all = _T("\n教練電話:") + m_stjlPhone;
					DrawText(hdcprint, m_all, -1, &rectjl2, DT_LEFT);
					m_all = _T("\n預約時間段:") + m_stxRq;
					DrawText(hdcprint, m_all, -1, &rectjl3, DT_LEFT);
					CString m_Timebc;
					//周遊數組
					//int liki = m_info;
					//int lin = (sizeof(m_info) / sizeof(m_info[0]));
					for (int j = 0; j < 7; j++)
					{
						m_Timebc += m_info[0][j].c_str();
						m_Timebc += "\n";
					}


					//int lenwz4 = m_Timebc.FindOneOf(_T("\n"));
					//m_Timebc = m_Timebc.Left(lenwz4+2);

					DrawText(hdcprint, m_Timebc, -1, &rectjlbctime, DT_LEFT);



					// pDc->DrawText(m_all, &rectjl, DT_LEFT);
					// pDc->DrawText(m_all, -1, &rectjl, DT_LEFT);
					//TextOut(hdcprint, 1, 1, m_all, 16);
					//printf("測試");
					//畫直線
					//	HPEN hPen;
					//		HPEN hPenOld;
					hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
					hPenOld = (HPEN)SelectObject(hdcprint, hPen);



					MoveToEx(hdcprint, 50, 420, NULL); //線的初始點
					LineTo(hdcprint, 500, 420);     //線的終點

					SelectObject(hdcprint, hPenOld);

					//學員
					CString m_stxyNmae(m_Student.stxyNmae.c_str());
					CString m_stxyClassType(m_Student.stxyClassType.c_str());

					CString m_stxyEgistrationTime(m_Student.stxyEgistrationTime.c_str());

					CString m_stxyLoginTime(m_Student.stxyLoginTime.c_str());

					CString m_stxyTotAlhours(m_Student.stxyTotAlhours.c_str());

					CString m_stxyRemhours(m_Student.stxyRemhours.c_str());


					int lenwz2 = m_stxyEgistrationTime.FindOneOf(_T(" "));
					m_stxyEgistrationTime = m_stxyEgistrationTime.Left(lenwz2);
					int lenwz3 = m_stxyLoginTime.FindOneOf(_T(" "));
					m_stxyLoginTime = m_stxyLoginTime.Left(lenwz3);




					m_all = _T("\n學員姓名:") + m_stxyNmae;

					DrawText(hdcprint, m_all, -1, &rectxy, DT_LEFT);


					m_all = _T("\n班次類型:") + m_stxyClassType;

					DrawText(hdcprint, m_all, -1, &rectxy1, DT_LEFT);


					m_all = _T("\n報名登入:\n") + m_stxyEgistrationTime + "-" + m_stxyLoginTime;
					//m_all = _T("\n報名登入:");

					DrawText(hdcprint, m_all, -1, &rectxy2, DT_LEFT);


					//m_all =  _T("\n")+m_stxyEgistrationTime + "-" + m_stxyLoginTime;

					//DrawText(hdcprint, m_all, -1, &rectxy22, DT_LEFT);




					m_all = _T("\n學時(剩餘/總數):") + m_stxyRemhours + _T("/") + m_stxyTotAlhours;

					DrawText(hdcprint, m_all, -1, &rectxy3, DT_LEFT);

					m_all = _T("\n列印時間:\n") + m_stxySysDate;

					DrawText(hdcprint, m_all, -1, &rectxy4, DT_LEFT);


					m_all = _T("\n簽字:\n");

					DrawText(hdcprint, m_all, -1, &rectxy5, DT_LEFT);




					DrawText(hdcprint, m_Timebc, -1, &rectjlbctime, DT_LEFT);


					hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
					hPenOld = (HPEN)SelectObject(hdcprint, hPen);



					MoveToEx(hdcprint, 50, 720, NULL); //線的初始點
					LineTo(hdcprint, 900, 720);     //線的終點

					SelectObject(hdcprint, hPenOld);

					//列印二維碼
					CDC dcPrinter;                            //定義一個裝置
					dcPrinter.Attach(hdcprint);             //把列印機附于這個裝置
					DrawBmp(&dcPrinter);


					hFont = CreateFont(18, 10, 0, 0, FW_NORMAL, false, false, false,
						CHINESEBIG5_CHARSET, OUT_CHARACTER_PRECIS,
						CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
						FF_MODERN, _T("宋體"));


					SelectObject(hdcprint, hFont);

					m_all = _T("\n關注e車事,約車更輕松\n");
					DrawText(hdcprint, m_all, -1, &rectlog, DT_LEFT);



					RestoreDC(hdcprint, -1); //恢複列印機裝置句柄

					EndPage(hdcprint); //列印機停紙,停止列印

					EndDoc(hdcprint); //結束一個列印作業



					SetDlgItemText(IDC_STATIC22, _T("列印完成,請取發票"));

				}
	}
	catch (runtime_error err)
	{
		if (hdcprint != NULL)
		{
			RestoreDC(hdcprint, -1); //恢複列印機裝置句柄

			EndPage(hdcprint); //列印機停紙,停止列印

			EndDoc(hdcprint); //結束一個列印作業
		}


		PrintTest();
	}

}
           

這裡有個地方不明白,貼出來

GetProfileStringA("windows", "device", ",,,", szprinter, 80);

這一句提示,從某個配置檔案裡讀資訊,屬性段是【windows】屬性名稱【device】,這裡在網上搜了一下可能是這個意思

VC下列印機的使用 

顯示器和列印機、繪圖儀都被視為輸出裝置。系統預設的輸出裝置是顯示器。要使用列印機,首先需要建立一個指向列印機的裝置環境句柄,然後通過該句柄調用相關的繪圖函數把所需的文字和圖形輸出至列印機上。當列印結束後,删除這個裝置環境句柄即可。

一、技術細節

  當我們在Windows95下安裝好列印機後,總是需要設定一個為預設列印機,在Windows95的啟動配置檔案WIN.INI中[window]段中列出了帶有關鍵字device的預設列印機。如果在檔案WIN.INI中有如下幾行:

[windows]

[其他程式行]

device=EPSON LQ-1600K,EPSON24,LPT1:

  在device後的字元串中就包含了系統中預設的列印機的三個重要屬性.它們依次是列印機的裝置名是LQ-1600K,驅動程式名是EPSON24,輸出端口為LPT1。在程式中我們可調用API函數GetProfileString從WIN.INI檔案中獲得這個裝置字元串。再将這個裝置字元串進行分解,獲得這三個屬性,作為參數用API函數CreateDC調用。如果調用成功,則為預設列印機建立一個裝置環境句柄,否則傳回一個空值(NULL)。

CreateDC函數的原形如下:

HDC CreateDC(

LPCTSTR lpszDriver,

LPCTSTR lpszDevice,

LPCTSTR lpszOutput,

CONST DEVMODE *lpinitData

); 

流程走到這裡,暫時無法驗證,因為沒有機器供驗證了。後續補全。驗證思路,不更新win.ini,直接調用列印程式是否可以列印?如果無法列印,按照格式更新win.ini檔案,再次觸發列印,是否可以列印。

經過檢驗,windows.ini配置實用預設就可以,隻要驅動安裝正确,列印服務已經啟動,指令行重定向到列印機可以列印出内容,基本列印機配置就成功了。親測可用。