Форум » [x]Harbour » опять с печатью проблема » Ответить

опять с печатью проблема

rvu: В xHarbour 0.99.61 все работало нормально. После перехода на 1.0.0 все стало распечатываться крякозябрами. Теперь надо где-то кодировку указывать?

Ответов - 40, стр: 1 2 All

Dima: rvu Хоть бы кусок кода показал , что бы ясно было :)

rvu: Файл в кодировке DOS разбиваю на строчки и вывожу: oPrinter:TextOut(stroka) как-то так (выкинул все лишнее), принцип печати, думаю, понятен: #define FORM_A4 9 #define PS_SOLID 0 #define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) ) #define BLACK RGB( 0x0 ,0x0 ,0x0 ) cPrinter=GetDefaultPrinter() oPrinter:= Win32Prn():New(cPrinter) PRIVATE aFonts, x, nColFixed, nColTTF, nColCharSet oPrinter:Landscape:=.T. oPrinter:FormType := FORM_A4 oPrinter:Copies := 1 IF !oPrinter:Create() Alert("Cannot Create Printer") ELSE IF !oPrinter:startDoc('Win32Prn(Doc name in Printer Properties)') Alert("StartDoc() failed") ELSE oPrinter:SetPen(PS_SOLID, 1, BLACK) oPrinter:SetFont('Lucida Console',8,{3,-50}) oPrinter:NewPage() oPrinter:NewLine() oPrinter:SetPos(oPrinter:posX(),oPrinter:posY()) oPrinter:TextOut(stroka) oPrinter:EndDoc() ENDIF oPrinter:Destroy() ENDIF

k_dima: не хватает oPrinter:Charset(255) после :SetFont


rvu: Заработало! Спасибо!

Dima: rvu Проще использовать h**p://www.abeelabs.com/pagescript32/index.php Их есть у меня

Zakrzevky: Есть проблема. Матричный принтер подключен через USB-порт. Надо печатать на рулоне. Проблема 1) приходится использовать графическую печать класс WIN_PRT. Иначе не работает 2) при печати oPrinter:TextOut() oPrinter:NewLine() делает прогон листа при печати на рулоне даже если не давать oPrinter:NewPage() - а то и вовсе не все напечатает. Можно не обращать на это внимание , но заказчик экономит бумагу. Вопрос Можно ли вообще печатать графической печатью на матричном принтере через порт USB на "простыне" и без прогонов, как это делалkось в клиппере при обычной печати? Может кто сталкивался. Заранее благодарен.

AndreyZh: Подскажите пожалуйста... извините, что поднял столь древнюю тему! Всё сделал, как описано выше с классом win32prn, но на принтере HP LJ P2055 печатает нормально, как ожидалось, но на остальных лазерниках (перепробывал Samsung, Brother, HP LJ 10xx) печатает как бы пропуская одну строку (вставляет между строка печать пустой строки)... Перепробовал кучу методов и свойств - всегда одно и тоже?

Dima: AndreyZh Если мне не изменяет память , то такой глюк у кого то уже был и было даже решение. Поиск надо юзать (я бегло юзанул и не нашел) , хорошо хоть он работает.

AndreyZh: Спасибо... но перед экспериментами с классом печати просмотрел все темы, где бы упоминались win32prn или основные методы класса, выбирая их поиском. Нашел способ масштабровать, как по вертикали, так и по горизонтали в проге; ставил разную ширину страниц в установках принтера и etc... то бишь перепробовал довольно много перед обращением к спецам в хХарборе. Может быть будут советы, хотя бы "где копать"?

Dima: Андрей покажи не большой но самодостаточный пример (как говорит твой тезка ) Я могу проверить у себя на железном принтере Samsung и на куче разных виртуальных принтеров.

AndreyZh: Dima пишет: Андрей покажи не большой но самодостаточный пример (как говорит твой тезка ) Я могу проверить у себя на железном принтере Samsung и на куче разных виртуальных принтеров. Как всегда у меня, что-то часть чего-то, но вроде бы функашку сделал независимой от мои прочих приблуд... Печать файла - достаточно только его имени (прошу прощения за комментарии - это для себя, т.к. изучаю тему): [pre2] //*** На время включаю директивы препроцессора - затем отключаю #define FORM_A4 9 #define PS_SOLID 0 #define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) ) #define BLACK RGB( 0x0 ,0x0 ,0x0 ) #define TRUE .T. #define FALSE .F. #define CRLF (CHR(13)+CHR(10)) // Конец строки. * --------------------------------------------------------------------------- * Вывод текстового файла на принтер в соответствии с параметрами и при * этом проверяется статус принтера при отражении каждой строки и в начале. * 1304 При печати использую класс печати xHarbour... Проверка на существо- * вание файла и принтера уже поизведена. PROC pPrHarbClass( cFile, nBeg, nEnd, nQty, nLen, nW ) LOCA nPage:=0 // Текущая страница LOCA nH:=0 // handle LOCA nQ:=0 // копии LOCA cBuff:="" // буфер чтения LOCA cStr:="" // буфер печати LOCA nSize:=4096 // размер буфера чтения LOCA cCur:="" // текущая строка LOCA oPrint // Объект - принтер LOCA nI:=0, nJ:=0, lStr:=TRUE, cPrinter:="" // Определяю принтер, используемый по умолчанию в системе cPrinter := GetDefaultPrinter() //*** Проверки на возможность использования классов // Определяем имя объекта класса для принтера, установленного по умолчанию в системе oPrinter := Win32Prn():New( cPrinter ) // Создаем экземпляр класса и проверка успешности создания... после надо уничтожить его IF !oPrinter:Create() // Не создан экземпляр класса * ErrMess("Не создан виртуальный принтер! М/б их нет?",cError) RETU ENDI // В случае успешного создания определяю свойства класса. oPrinter:Landscape := .F. // портретная ориентация oPrinter:FormType := FORM_A4 // А4 oPrinter:Copies := 1 // число копий.. ХЗ - не работает // Обязательно-проверка успешности постановки в очередь с именем IF !oPrinter:startDoc("Printering USLand") * ErrMess("StartDoc не смог поставить в очередь печати. Смотрите свойства принтеров, например автономность - обрващайтесь к сист.админу!",cError) // Уничтожаем раннее созданный экземпляр объекта (класса). oPrinter:Destroy() RETU ENDI // Определяем перо для рисования линий (толщина шрифта) - форма линий (сплошная, тонкая, черная) oPrinter:SetPen(PS_SOLID, 1, BLACK) // Установка шрифта, в зависимости от сжатия текста. В массиве определяется толщина шрифта и высота... подбор эксперимент /* Массив {x,-Y} x-сжатие по горизонтали, чем меньше, тем сжатие (3-уже, чем 6) -Y так же сжатие, но может быть толщины линии */ DO CASE CASE (nLen = 80) .AND. (nW = 6) // Обычный, без сжатия по высоте OK oPrinter:SetFont("Courier New",10,{4,-41}) oPrinter:lineHeight := 164 // Чем меньше, тем плотнее сжатие ? Это определяет плотность по вертикали CASE (nLen = 80) .AND. (nW = 8) // Обычный - сжатие по высоте oPrinter:SetFont("Courier New",10,{4,-41}) oPrinter:lineHeight := 150 // Чем меньше, тем плотнее сжатие ? Это определяет плотность по вертикали CASE (nLen = 132).AND. (nW = 8) // Сжатый и сжатие по высоте oPrinter:SetFont("Lucida Console",8,{3,-50}) // oPrinter:SetFont('Courier New', 8,{3,-50}) oPrinter:lineHeight := 150 // ? Это определяет плотность по вертикали OTHE // Стандартный и сжатый OK oPrinter:SetFont("Lucida Console", 8,{3,-50}) oPrinter:lineHeight := 164 // ? Это определяет плотность по вертикали ENDC // ОБЯЗАТЕЛЬНО - кодировка OEM... иначе козебяки oPrinter:Charset(255) // Пробую по моему алгоритму, т.к. нужно выделять страницы FOR nQ := 1 TO nQty nH := Fopen( cFile, 0 ) // Открываем файл для чтения Fseek( nH, 0/*смещение*/, 0/*начало*/ ) // встаём на начало nPage := 1 // Начальная страница-счетчик. /* Делаем пока не доберемся до конца файла - считаем в буфер 0 байт Выводим на принтер текущую копию, анализируя попытки прервать печать документа */ WHIL Len( cBuff:=FreadStr(nH,nSize) ) <> 0 cStr += cBuff // Пополняемо-обрезаемая строка накопления // Выделяем строки и страницы из строки накопления WHIL TRUE // Не можем выделить полную подстроку из накапливаемой строки - выход. IF (nI:=At(CRLF,cStr)) == 0 THEN EXIT // Выделяем логически целую для печати строку. Пробел в начале для выделения пустых строк cCur := Subs( Token(" "+cStr,CRLF,1), 2 ) // Признак (nJ > 0) конца страницы в строке nJ := At( Chr(12), cCur ) // Признак окончания страницы, переводим текущий счетчик IF nJ <> 0 lStr := FALSE ENDI // Отрезаем от строки накопления всё после crlf cStr := Subs( cStr, nI+2 ) // Печатаем, если текущая страница попадает в интервал страниц IF nPage >= nBeg .AND. nPage <= nEnd oPrinter:NewLine() // перевод на следующую строку oPrinter:TextOut(cCur) // выводим текстовую строку IF !lStr .AND. (nPage < nEnd) // Делаем прогон страницы oPrinter:NewPage() ENDI ENDI // Увеличиваю счетчик страниц, если случилась смена страницы печати nPage += IF( lStr, 0, 1 ) lStr := TRUE // Обнуление признака конца страницы END END Fclose( nH ) // Закрываю текстовый файл NEXT nQ // Закрываю печать документа oPrinter:endDoc() // Уничтожаю объект принтера oPrinter:Destroy() RETU #undef FORM_A4 #undef PS_SOLID #undef RGB #undef BLACK #undef TRUE #undef FALSE #undef CRLF [/pre2]

AndreyZh: cFile - имя файла nBeg - начальная страница nEnd - конечная страница nQty - количество экземпляров nLen - 132 или 80 nW - 6 или 8 ---- без разницы, но какие-то значения д.б. заданы... при вызове раннее определяются умолчания.

Dima: AndreyZh я как бы и не ожидал от Вас маленького и самодостаточного примера на 5-10 строк , все как обычно ;) когда у меня в коде что то начинает работать не так как ожидалось , делаю простые примерчики и тестю, обычно виноват не (X)harbour а я но всякое бывает конечно. сделайте простой пример: вывод на печать пары(тройки) строк , лишняя строка при этом будет иметь место или нет ?

AndreyZh: Dima пишет: ...обычно виноват не (X)harbour а я но всякое бывает конечно. сделайте простой пример: вывод на печать пары(тройки) строк , лишняя строка при этом будет иметь место или нет... Спасибо за участие... только сейчас добрался до ПК, но те же коки... Правда, как ещё упросить пример НЕ ЗНАЮ!!! ПОМОГИТЕ люди добрые? [pre2] #define FORM_A4 9 #define PS_SOLID 0 #define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) ) #define BLACK RGB( 0x0 ,0x0 ,0x0 ) * --------------------------------------------------------------------------- * Головной модуль программы PROC Main() LOCA oPrint, nI:=0 LOCA cPrinter:="" // Определяю принтер, используемый по умолчанию в системе cPrinter := GetDefaultPrinter() // Определяем имя объекта класса для принтера, установленного по умолчанию в системе oPrinter := Win32Prn():New( cPrinter ) oPrinter:Create() oPrinter:Landscape := .F. // портретная ориентация oPrinter:FormType := FORM_A4 // А4 oPrinter:Copies := 1 // число копий.. ХЗ - не работает oPrinter:startDoc("Printering USLand") // Определяем перо для рисования линий (толщина шрифта) - форма линий (сплошная, тонкая, черная) oPrinter:SetPen(PS_SOLID, 1, BLACK) // Шрифты и сжатие. oPrinter:SetFont("Lucida Console", 8,{3,-53}) oPrinter:lineHeight := 164 oPrinter:Charset(255) FOR nI := 1 TO 20 oPrinter:NewLine() oPrinter:TextOut("Установка шрифта, в зависимости от сжатия текста. В массиве определяется толщина шрифта и высота... подбор эксперимент") oPrinter:NewLine() oPrinter:TextOut("--------------------------------------------------------------------------------------------------------------------------") oPrinter:NewLine() oPrinter:TextOut("--------------------------------------------------------------------------------------------------------------------------") NEXT nI oPrinter:endDoc() // Закрываю печать документа oPrinter:Destroy() // Уничтожаю объект принтера RETU [/pre2]

Dima: AndreyZh То что надо. Пустил тест на виртуальный принтер PdfFactory , все нормально. Копию документа выложить ? Правда oPrinter:Charset(255) не сработал и вылезли крякозяблы. Собирал с GTWIN Собирал так c:\hb32\bin\hbmk2 test -lxhb -lhbwin

Dima: AndreyZh пишет: oPrinter:Copies := 1 // число копий.. ХЗ - не работает Действительно не пашет....... Ни до oPrinter:Create() ни после oPrinter:Create() Цитата из исходника [pre2] // These next 6 variables must be set before calling ::Create() if // you wish to alter the defaults VAR FormType INIT 0 VAR BinNumber INIT 0 VAR Landscape INIT .F. VAR Copies INIT 1 VAR PaperLength INIT 0 // Value is * 1/10 of mm 1000 = 10cm VAR PaperWidth INIT 0 // " " " " " " [/pre2]

AndreyZh: Сделал на doPdf - печать через строчку, на HPLJ P2055 нормально, на Brother через строчку... Как можно на форуме приложить скан?

Dima: AndreyZh В форме ответа вверху есть кнопочки. Вот там где чел нарисован туда и нажми (картинка с компьютера) Или на обменник сложи

AlexMyr: Dima пишет: Правда oPrinter:Charset(255) не сработал и вылезли крякозяблы. добавьте REQUEST HB_CODEPAGE_UA1251 hb_cdpselect("UA1251")

Dima: AlexMyr Точно ;) А что с кол-вом копий ? Ведь реально не работает.



полная версия страницы