Печать напрямую в принтер (включая сетевой)
Добавлено: 12 Август 2010, 3:40
Пользовался шаблоном LinePrint до определенного момента. На винтерминалах что то незаладилось... пришлось искать в инете инфу. Выводы ниже.
Использовал для печати наклеек на Godex EZ-2
Код: Выделить всё
PROGRAM
TSA_DOC_INFO_1 GROUP,TYPE
pDocName LONG
pOutputFile LONG
pDatatype LONG
END
MAP
MODULE('Printer API')
pbc_GetLastError(),SIGNED,PASCAL,NAME('GetLastError')
pbc_OpenPrinter(LONG pPrinterName, *LONG outhPrinter,LONG pDefault),BOOL,PASCAL,RAW,NAME('OpenPrinterA'),PROC
pbc_StartDocPrinter(LONG hPrinter, LONG Level, LONG pDocInfo),LONG,PASCAL,PROC,RAW,NAME('StartDocPrinterA')
pbc_EndDocPrinter(LONG hPrinter),BOOL,PASCAL,RAW,PROC,Name('EndDocPrinter')
pbc_StartPagePrinter(LONG hPrinter),BOOL,PASCAL,RAW,PROC,Name('StartPagePrinter')
pbc_EndPagePrinter(LONG hPrinter),BOOL,PASCAL,RAW,PROC,Name('EndPagePrinter')
pbc_WritePrinter(LONG hPrinter, *CSTRING pBuf, LONG cbBuf, *LONG pcBytesWritten),BOOL,RAW,PASCAL,PROC,Name('WritePrinter')
pbc_ClosePrinter ( LONG hPrinter ),BOOL,RAW,PASCAL,PROC,Name('ClosePrinter')
END
RawDataToPrinter(*CSTRING szPrinterName, *CSTRING lpData, LONG dwCount),BYTE
END
loc:Str CSTRING(200)
loc:Printer CSTRING(200)
loc:Goods CSTRING(200)
CODE
!loc:Printer = '\\post\HP LaserJet 1100'
loc:Printer = 'Brother HL-2070N series'
loc:Str = 'test data<12>'
IF ~RawDataToPrinter(loc:Printer,loc:Str,LEN(loc:str))
MESSAGE('Error on print')
END
RawDataToPrinter PROCEDURE(*CSTRING szPrinterName, *CSTRING lpData, LONG dwCount)!,BYTE
hPrinter LONG
DocInfo LIKE(TSA_DOC_INFO_1)
dwJob LONG
dwBytesWritten LONG
pDocName CSTRING(200)
pOutputFile CSTRING(200)
pDatatype CSTRING(200)
CODE
! Необходим дескриптор принтера.
IF ~pbc_OpenPrinter(ADDRESS(szPrinterName), hPrinter, 0)
RETURN FALSE
END
! Заполняем структуру данными о документе
pDocName = 'My Document'
pOutputFile = ''
pDatatype = 'RAW'
DocInfo.pDocName = ADDRESS(pDocName)
DocInfo.pOutputFile = ADDRESS(pOutputFile)
DocInfo.pDatatype = ADDRESS(pDatatype)
! Информируем спулер о том, что печать документа начата.
dwJob = pbc_StartDocPrinter(hPrinter, 1, ADDRESS(DocInfo))
IF dwJob = 0
pbc_ClosePrinter(hPrinter)
RETURN FALSE
END
! Начало страницы.
IF ~pbc_StartPagePrinter(hPrinter)
pbc_EndDocPrinter(hPrinter)
pbc_ClosePrinter(hPrinter)
RETURN FALSE
END
! Посылаем данные на принтер.
IF ~pbc_WritePrinter(hPrinter, lpData, dwCount, dwBytesWritten)
pbc_EndPagePrinter(hPrinter)
pbc_EndDocPrinter(hPrinter)
pbc_ClosePrinter(hPrinter)
RETURN FALSE
END
! Конец страницы.
IF ~pbc_EndPagePrinter(hPrinter)
pbc_EndDocPrinter(hPrinter)
pbc_ClosePrinter(hPrinter)
RETURN FALSE
END
! Информируем спулер о конце документа.
IF ~pbc_EndDocPrinter(hPrinter)
pbc_ClosePrinter(hPrinter)
RETURN FALSE
END
! Закрываем дескриптор принтера.
pbc_ClosePrinter(hPrinter)
! Проверяем правильность количества записанных байт.
IF dwBytesWritten <> dwCount
RETURN FALSE
END
RETURN TRUE