Форум » [x]Harbour » печать штрих-кода » Ответить

печать штрих-кода

and3081: в поиске на эту тему- только совсем старые обсуждения. А как сейчас решаются такие задачи ? Нужно прицепить к печати квитанции штрих код. Это возможно не меняя свои исходники печати ?

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

Andrey: petr707 пишет: А вообще - FastReport решит все Ваши проблемы с отчетностью ( не реклама!) И не париться....

Vlad04: and3081 "Можно делать в RTF" - так как именно ? Писать свой движок с нуля, fwrite() и т.п.? Не вариант. Все написано Минимальные доработки программы. Штрих код так же печатается Примерно так SET PRINTER to 'C:\TEMP\Pic.txt' ; SET DEVICE TO PRINTER ; SET PRINTER ON Select TalonR //(nSele) //УЧРЕЖДЕНИЕ ?'|0:NAMEORG:'+HB_OEMTOANSI(Rtrim(k[1]) ) ?'|0:OGRN:'+HB_OEMTOANSI(Rtrim(k[4]) ) ?'|0:ADRES:'+HB_OEMTOANSI(Rtrim(k[19]) ) ... //Дата рождения ?'|0:BIRTH_D:'+dTOC(Klient->Birth_Date) ... sCmd:="start "+Par1+"REPORTF.EXE C:\TEMP\Pic.txt " + Par1+"Pic\"+Name_Pic+" C:\TEMP\TEMP.RTF " Run(sCmd) Готовишь шаблон, заполняешь его метками. Потом программа меняет метки на содержание

and3081: столько вариантов, глаза разбежались. Попробуем начать с вариантов без привлечения сторонних программ, не хотелось бы увеличивать зависимость. Например PDF библа hbhpdf. Это единственный вариант PDF в харбе ? Будет ли он работать с штрихкодовыми шрифтами ? Краткого описания функций нет ? Не хотелось бы потратить кучу времени, а потом выяснится, что чего то нужного не хватает. Как выяснилось с win_prn() классом.


nick_mi: and3081 пишет: Будет ли он работать с штрихкодовыми шрифтами ? petr707 пишет: ..\contrib\hbzebra\tests\ есть примеры там пример вывод штрихкодов(разных) в PDF

nick_mi: Как то было замаячила потребность вывода данных в PDF, накрапал на базе стандартных примеров отладочную программу вывода в PDF c некоторыми коментариями. [pre]/* * $Id: testhpdf.prg 15824 2010-11-13 18:57:30Z vszakats $ */ /* * Harbour Project source code: * * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) * www - http://harbour-project.org * */ #include "Common.ch" #include "Inkey.ch" #include "Setcurs.ch" #include "Error.ch" #include "Ads.ch" #include "wvtwin.ch" #include "hbgtinfo.ch" #include "hbgtwvg.ch" #include "wvgparts.ch" #include "hbzebra.ch" #include "harupdf.ch" PROCEDURE Main( FONT ) LOCAL pdf LOCAL page LOCAL TTName LOCAL embed := .t. LOCAL hfsize:= 12 LOCAL lportrait := .T. LOCAL def_font3 := "" LOCAL detail_font_name local detail_fnt_name := NIL cls REQUEST HB_CODEPAGE_RU866 // Установка REQUEST HB_CODEPAGE_RU1251 // языковых hb_CodePage_RU866() // кодовых hb_cdpselect ('RU866' ) // страниц // request HB_GT_WVT // request HB_GT_WVG_DEFAULT // ANNOUNCE HB_GTSYS If pcount() < 1 @ 1,1 say hb_translate (" Нет параметра Имя фонта По умолчанию Helvetica","RU866","RU1251") inkey (0) EndIf TTname := FONT pdf := HPDF_New() // Создать объект PDF // Для всех элементов адресация начинается // с левого нижнего угла (0,0) - максимальные // координаты - верхний правый угол // Возможные форматы : // HPDF_PAGE_SIZE_LETTER 1 8 x 11 (Дюймы) -> 612 x 792 // HPDF_PAGE_SIZE_LEGAL 2 8 x 14 (Дюймы) -> 612 x 1008 // HPDF_PAGE_SIZE_A3 3 297 x 420 (mm) -> 842 x 1200 // HPDF_PAGE_SIZE_A4 4 210 x 297 (mm) -> 596 x 842 // HPDF_PAGE_SIZE_A5 5 148 x 210 (mm) -> 420 x 596 // HPDF_PAGE_SIZE_B4 6 250 x 353 (mm) -> 709 x 1001 // HPDF_PAGE_SIZE_B5 7 176 x 250 (mm) -> 499 x 709 // HPDF_PAGE_SIZE_EXECUTIVE 8 7 x 10 (Дюймы) -> 522 x 756 // HPDF_PAGE_SIZE_US4x6 9 4 x 6 (Дюймы) -> 288 x 432 // HPDF_PAGE_SIZE_US4x8 10 4 x 8 (Дюймы) -> 288 x 576 // HPDF_PAGE_SIZE_US5x7 11 5 x 7 (Дюймы) -> 360 x 504 // HPDF_PAGE_SIZE_COMM10 12 4.125 x 9.5 (Дюймы) -> 297 x 684 if !empty(TTname) detail_fnt_name := HPDF_LoadTTFontFromFile(pdf, TTName,; // Загрузить фонт из файла embed) // pdf - объект PDF // TTName - имя файла с фонтом // embed - вложение (фонтав файл PDF) // .T. - да // .F. - нет // detail_fnt_name Возвращает имя фонта // содержащегося в файле else detail_fnt_name := HPDF_LoadTTFontFromFile(pdf, ; getenv("SystemRoot")+"\fonts\arial.ttf",; embed) TTname :="NIL" endif HPDF_SetCompressionMode( pdf, HPDF_COMP_ALL ) // Сжатие данных // pdf - объект PDF // HPDF_COMP_NONE 1 Ничего не сжимать // HPDF_COMP_TEXT 2 Сжимать текстовые данные. // HPDF_COMP_IMAGE 3 Сжимать графические объекты. // HPDF_COMP_METADATA 4 Сжимать прочие данные (fonts, cmaps и др.) // HPDF_COMP_ALL 5 Сжимать все // if lportrait // HPDF_Page_SetSize( pdf, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT) // Размер и ориентация объекта PDF // pdf - объект PDF // HPDF_PAGE_SIZE_A4 - размер страницы // см описание HPDF_New() // HPDF_PAGE_PORTRAIT - ориентация портрет // HPDF_PAGE_LANDSCAPE - ориентация ландшафт // else // HPDF_Page_SetSize( pdf, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE) // Размер и ориентация объекта PDF // endif HPDF_SetPageMode( pdf, HPDF_PAGE_MODE_USE_OUTLINE ) // режимы выода страницы // pdf - объект PDF // HPDF_PAGE_MODE_USE_NONE 0 Display the document with neither outline nor thumbnail. // HPDF_PAGE_MODE_USE_OUTLINE 1 Display the document with outline pane. // HPDF_PAGE_MODE_USE_THUMBS 2 Display the document with thumbnail pane. // HPDF_PAGE_MODE_FULL_SCREEN 3 Display the document with full screen mode. // HPDF_PAGE_MODE_EOF 4 If empty(detail_fnt_name) detail_font_name := "Arial" // "Helvetica" detail_fnt_name := "NIL" Else detail_font_name := detail_fnt_name endif @ 3,1 say " До того " + TTname + " " + detail_fnt_name @ 4,1 say " После того " +detail_font_name + " " + str(len (detail_font_name)) inkey(0) cdpage := "CP1251" def_font3 := HPDF_GetFont (pdf, detail_font_name ,; // Получить указатель на фонт cdpage) // pdf - объект PDF // detail_font_name - имя фонта // cdpage - кодовая страница for i :=1 to 2 page := HPDF_AddPage( pdf ) // Добавить страницу HPDF_Page_SetFontAndSize( page, def_font3, hfsize ) // Установить фонт для страницы и размер фонта // page - указатель на объект страница // def_font3 - указательна на фонт, полученый из HPDF_GetFont () // hfsize - размер фонта HPDF_Page_SetSize( page, HPDF_PAGE_SIZE_A4,; // Размер и ориентация объекта листа HPDF_PAGE_PORTRAIT ) // page - объект page, полученный HPDF_AddPage() // HPDF_PAGE_SIZE_A4 - размер листа // HPDF_Page_PORTRAIT - ориентация листа HPDF_SetCurrentEncoder(pdf, cdpage) // Установить кодовую страницу объекта PDF // pdf - объект PDF // cdpage - кодовая страница DrawBarcode( page, 640, 1, "CODE128", "123456789012345678901234567890" ) DrawBarcode( page, 680, 1, "PDF417", "Hello, World of Harbour!!! It's 2D barcode PDF417 :)" ) DrawBarcode( page, 760, 1, "DATAMATRIX", "Hello, World of Harbour!!! It's 2D barcode DataMatrix :)") height := HPDF_Page_GetHeight(page) // получить высоту страницы // page - объект листа width := HPDF_Page_GetWidth(page) // получить ширину страницы // page - объект листа @ 6,1 say "height " + str (height,5) @ 7,1 say "width " + str (width ,5) inkey (0) nameimg := "D:\HOME\CLIP_UTK\PortalPDF\sample1.jpg" hndl_img := HPDF_LOADJPEGIMAGEFROMFILE (pdf, nameimg) // Загрузить jpg из файла * HPdf_LoadPngImageFromFile // Загрузить PNG из файла * HPdf_LoadRawImageFromFile // Загрузить RAW из файла // pdf - объект PDF // nameimg - имя файла // hndl_img - указатель на объект image c_beg := 10 l_beg := 280 a_size := HPDF_IMAGE_GETSIZE (hndl_img) // Получить размер изображения // hndl_img - указатель на объект image // a_size - массив размеров // a_size[1] - ширина // a_size[2] - высота nWidth := a_size[1] nHeight := a_size[2] HPDF_PAGE_DRAWIMAGE (page, hndl_img, c_beg,; // Нарисовать изображение на листе l_beg, nWidth, nHeight) // page - объект листа // hndl_img - указатель на объект image // Координаты левый нижний угол: // c_beg - Колонка начала // l_beg - строка начала // nWidth - ширина // nHeight - высота // // *****замечание********* // все, что будет выведено после изображения // будет перекрывать изображение, и также изображение // бедет перекрывать все, что было выведено ранее npen := 3 HPDF_Page_SetLineWidth( page, npen ) // Установка ширины линии для рисования линий, // линий, прямоугольников, окружностей и т.д. // page - объект листа // npen - толщина линии HPDF_Page_BeginText( page ) // Начало процесса ввода текста // page - объект листа text := "<Standard Type1 fonts samples> " + "╤ЄрэфрЁЄэ√щ ъюф " +; hb_translate ("Наша-маша-лучше-всех Наша-маша-лучше-всех Наша-маша-лучше-всех Наша маша лучше всех " + ; "Наша маша лучше всехНаша маша лучше всехНаша маша лучше всехНаша маша лучше всех" + ; "Наша маша лучше всехНаша маша лучше всехНаша маша лучше всехНаша маша лучше всех","RU866","RU1251") HPDF_Page_TextOut( page, 2, 800, text ) // Напечатать текст // page - объект листа // 2 - колонка начало // 800 - строка нкачало // text - выводимый текст // // ******замечание************ // Если текст больше ширины листа - // то символы, выходящие за ширину листа теряются HPDF_Page_EndText( page ) // Окончание процесса вывода текста на лист // page - объект листа c_beg := 10 l_beg := 300 nWidth := 400 nHeight := 300 @ 10,1 say " c_beg " + str (c_beg,5) @ 11,1 say " l_beg " + str (l_beg,5) @ 12,1 say " c_end " + str (nWidth,5) @ 13,1 say " l_end " + str (nWidth,5) HPDF_Page_Rectangle( page, c_beg, l_beg, ; // Отрисовка прямоугольника. nWidth, nHeight) // page - объект листа // Координаты левый нижний угол: // c_beg - Колонка начала // l_beg - строка начала // nWidth - ширина // nHeight - высота HPDF_Page_Stroke( page ) // Закончить прорисовку графических объекта // page - объект листа HPDF_Page_BeginText( page ) // Начало ввода текста // page - объект листа c_beg := 10 l_beg := 600 c_end := 400 l_end := 300 nalign := 3 HPDF_Page_TextRect (page ,; // вписать текст в прямоугольник c_beg ,; // page - объект листа l_beg,; // координаты верхний левый угол: c_end ,; // c_beg - колонка l_end,; // l_beg - строка text, nalign ) // координаты правый нижний угол // c_end - колонка // l_end - строка // nalign - выравнивание // HPDF_TALIGN_LEFT 0 по левому краю // HPDF_TALIGN_RIGHT 1 по правому краю // HPDF_TALIGN_CENTER 2 по центру // HPDF_TALIGN_JUSTIFY 3 заполняет строку // // ****Замечание**** // Если встречается слово больше длины строки // то слово ивесь оставшийся текст не печатается HPDF_Page_EndText( page ) c_beg := 150 l_beg := 600 rad := 100 HPDF_PAGE_CIRCLE (page, c_beg,l_beg, rad) // Нарисовать Окружность // page - объект листа // координаты центра окружности: // c_beg - колонка // l_beg - строка // rad - радиус окружности в пикселях c_beg := 150 l_beg := 600 radx := 100 rady := 200 HPDF_PAGE_ELLIPSE (page, c_beg,l_beg, radx,rady) // Нарисовать элипс // page - объект листа // координаты центра элипса: // c_beg - колонка // l_beg - строка // radx - радиус элипса по горизонтали в пикселях // rady - радиус элипса по вертикали в пикселях c_beg := 150 l_beg := 200 radx := 100 rady := 200 HPDF_PAGE_ARC (page, c_beg,l_beg, rad, radx,rady) // Нарисовать дугу окружности // page - объект листа // координаты центра окружности: // c_beg - колонка // l_beg - строка // rad - радиус // radx - угол начала // rady - угол окончания HPDF_Page_Stroke( page ) // Закончить прорисовку графических объектов /* nameimg := "D:\HOME\CLIP_UTK\PortalPDF\sample1.jpg" hndlimg := HPDF_LOADJPEGIMAGEFROMFILE (pdf, nameimg) c_beg := 10 l_beg := 340 nWidth := 500 nHeight := 300 HPDF_PAGE_DRAWIMAGE (page, hndlimg, c_beg, l_beg, nWidth, nHeight ) */ hfsize := hfsize + 4 next namefile := "testhpdf.pdf" FErase( namefile ) ? HPDF_SaveToFile( pdf, namefile ) // Записывает сформированный PDF в файл // pdf - объект PDF // namefile - имя файла PDF417 // // *****Замечание******** // Если файл открыт другой программой, // функция завершится с кодом 0, но файл не // перезапишет inkey(0) RETURN PROCEDURE DrawBarcode( page, nY, nLineWidth, cType, cCode, nFlags ) LOCAL hZebra, nLineHeight nY := HPDF_Page_GetHeight( page ) - nY SWITCH cType CASE "EAN13" ; hZebra := hb_zebra_create_ean13( cCode, nFlags ) ; EXIT CASE "EAN8" ; hZebra := hb_zebra_create_ean8( cCode, nFlags ) ; EXIT CASE "UPCA" ; hZebra := hb_zebra_create_upca( cCode, nFlags ) ; EXIT CASE "UPCE" ; hZebra := hb_zebra_create_upce( cCode, nFlags ) ; EXIT CASE "CODE39" ; hZebra := hb_zebra_create_code39( cCode, nFlags ) ; EXIT CASE "ITF" ; hZebra := hb_zebra_create_itf( cCode, nFlags ) ; EXIT CASE "MSI" ; hZebra := hb_zebra_create_msi( cCode, nFlags ) ; EXIT CASE "CODABAR" ; hZebra := hb_zebra_create_codabar( cCode, nFlags ) ; EXIT CASE "CODE93" ; hZebra := hb_zebra_create_code93( cCode, nFlags ) ; EXIT CASE "CODE11" ; hZebra := hb_zebra_create_code11( cCode, nFlags ) ; EXIT CASE "CODE128" ; hZebra := hb_zebra_create_code128( cCode, nFlags ) ; EXIT CASE "PDF417" ; hZebra := hb_zebra_create_pdf417( cCode, nFlags ); nLineHeight := nLineWidth * 3 ; EXIT CASE "DATAMATRIX" ; hZebra := hb_zebra_create_datamatrix( cCode, nFlags ); nLineHeight := nLineWidth ; EXIT ENDSWITCH IF hZebra != NIL IF hb_zebra_geterror( hZebra ) == 0 IF EMPTY( nLineHeight ) nLineHeight := 16 ENDIF HPDF_Page_BeginText( page ) HPDF_Page_TextOut( page, 40, nY - 13, cType ) HPDF_Page_TextOut( page, 150, nY - 13, hb_zebra_getcode( hZebra ) ) HPDF_Page_EndText( page ) hb_zebra_draw_hpdf( hZebra, page, 300, nY, nLineWidth, -nLineHeight ) ELSE ? "Type", cType, "Code", cCode, "Error", hb_zebra_geterror( hZebra ) ENDIF hb_zebra_destroy( hZebra ) ELSE ? "Invalid barcode type", cType ENDIF RETURN STATIC FUNCTION hb_zebra_draw_hpdf( hZebra, page, ... ) IF hb_zebra_GetError( hZebra ) != 0 RETURN HB_ZEBRA_ERROR_INVALIDZEBRA ENDIF hb_zebra_draw( hZebra, {| x, y, w, h | HPDF_Page_Rectangle( page, x, y, w, h ) }, ... ) HPDF_Page_Fill( page ) RETURN 0 [/pre] и для него HBP # # $Id: hbvpdf.hbp 16868 2011-06-07 22:29:10Z vszakats $ # #-hblib -inc -lhbHpdf.lib -llibhpdf.lib -lhbzebra #-gtwvt #-gtwvg -lhwgdebug -lhbwin -lpng #-b -oportalpdf.exe #-w3 -es2 -instfile=inc:hbvpdf.ch portalpdf.prg #testhpdf.prg

and3081: Внимательно смотрим вопрос :) Будет ли он работать с ШТРИХКОДОВЫМИ шрифтами . А зебра их рисует сама, если я правильно понял. Зачем лишняя либа, если обычно работает, например (условно) setfont("EanGnivc",...) textout('1234567890') - и сразу получаем результат. Вот я и спросил, поддерживает ли hbhpdf такой способ. По идее обязан. Но вдруг нет ?

and3081: to nick_mi за пример спасибо, будем курить

nick_mi: Может и обязан, не проверял, но такого встроеного шрифта в PDF точно нет. Придется его подгружать из внешнего файла. И что будет лучше - тягать этот файл шрифта с программой по всем весям, или подлинковать библиотеку в EXE - дело каждого

Dima: Как мне так проще штрих код рисовать линиями той или иной толщины , алгоритмы есть на форуме и не один , это проще чем тягать с собой шрифт. Так и делаю.

and3081: to nick_mi Согласен. Пример заработал. Пока глубоко не копал, сразу вопрос по позиционированию при выводе текста. 1.позиционирование только в пикселях ? 2.размер формата А4 и А3 в пикселях строго фиксированный (как в комментах), т.е.не зависит от каких-нибудь разрешений и качества ? 3.встроенных функций указателя для вывода текста нет ? Т.е. для цикличного вывода строк, типа ведомости нужно самому написать функционал ? Буду вникать, наверное опять придется себе обзорчик по функциям писать. Никто не делал ?



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