Класс для API ZINT «Barcode Generator»

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

Класс для API ZINT «Barcode Generator»

Сообщение Игорь Столяров »

Библиотека для создания практически любых штрих-кодов.
В примере показан вывод штрих-кодов в окно и отчёт.

(Перекрестная ссылка на альтернативу viewtopic.php?p=40124#p40124) добавил Admin

zint.jpg
Вложения
zint-2025-04-20.zip
Версия: 20.04.2025 г.
(509.49 КБ) 280 скачиваний
Последний раз редактировалось Игорь Столяров 20 Апрель 2025, 19:40, всего редактировалось 16 раз.
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

Небольшая доработка класса для управления т.н. "тихой зоной" для разгона сканера и / или
установки отступа кода от края картинки / рамки.

Нужно учитывать, что разные коды работают по разному. Например DATA MATRIX (используемый
в системе маркировки) практически не требует зоны распознования и поэтому удобен для компактного размещения.
В некоторых кодах "тихая зона" сразу включена по умолчанию и её можно наоборот отключать.

Вообще нужно смотреть какие параметры коды принимают, и собственно, выполняют. Например:

Код: Выделить всё

  Loc:MyZint.Setting(MySymbol)             ! Печать штрих-кода в отчёте  
  Loc:MyZint.Setting.sColor = Color:Red    ! Пусь штрих-код будет красненьким
  Loc:MyZint.Setting.sBorderWidth = 2      ! Добавили рамку вокруг кода, удобно для контроля
  
  If MySymbol = ZINT_BARCODE_AZTEC         ! Для этого кода нет "тихой зоны" -> делаем сами
     Loc:MyZint.Setting.sWSpaceWidth  = 2  ! - Отступ по ширине
     Loc:MyZint.Setting.sWSpaceHeight = 2  ! - Отступ по высоте
  else
     Loc:MyZint.Setting.sQuietZone = True  ! Включить "тихую зону" для уверенного распознования кода сканером
  end

  Loc:MyZint.PrintNewReport(?Image, Tovar.SCod, Report)
Также в классе немного изменена структура методов и устранено старое ограничение, когда для
печати разных видов кодов требовалась полная реинициализация объекта ZINT. Теперь мона всё ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

В первом сообщении добавил обновление класса ZINT BarCode для библиотеки ZINT версии 2.13.0
Список изменений: https://sourceforge.net/projects/zint/f ... nt/2.13.0/
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

Класс для API ZINT «Barcode Generator»

Сообщение Игорь Столяров »

Привет всем !

Вышло долгожданное обновление библиотеки ZINT 2.14.0 ... но с засадой.
Теперь комплект идёт с TCL файлами и предлагается самостоятельно (как-то) из них собрать Win x32 DLL. :shock:

Вопрос: кто-нибудь в теме как мона трансформировать TCL DLL -> Win x32 DLL ?
Заранее спасибо за помощь.

Комплект в папке _ZInt на FTP или по ссылке: https://sourceforge.net/projects/zint/
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

Класс для API ZINT «Barcode Generator»

Сообщение Игорь Столяров »

В первом сообщении добавил обновление класса ZINT BarCode для библиотеки ZINT версии 2.15.0.9

Впервые самостоятельно собрана DLL Win x32 с поддержкой нативной записи штрих-кода в PNG (мною впервые !) ✨

Опубликую полный список изменений здесь, т.к. судя по всему, проект сменил команду и там сейчас
небольшой бардак (+ "настоящие программеры" из GNU считают разработчков под Win32 вторым сортом):

Код: Выделить всё

Version 2.15.0.9 (dev) not released yet (2025-04-16)
====================================================

**Incompatible changes**
------------------------
- Buffer length of member `errtxt` in `zint_symbol` extended 100 -> 160
  (client buffers may need checking/extending)
- New `raw_segs` & `raw_seg_count` fields in `zint_symbol` for use with new
  output option `BARCODE_RAW_TEXT`
- Symbol structure members `option_1`, `option_2` and `option_3` now updated
  after `ZBarcode_Encode()` and variants are called, and there are three new
  methods in the Qt Backend to access to them
- New Qt Backend method `isBindable()` for new flag `ZINT_CAP_BINDABLE`
- GS1 Composites now return warning if CC type upped from requested due to size
  of composite data
- EAN-8 with add-on now returns warning that it's non-standard
- UPC-E now returns warning if first digit of 7 digits ignored (not '0' or '1')

Changes
-------
- Add new `BARCODE_RAW_TEXT` option for `output_options` which sets new fields
  `raw_segs` and `raw_seg_count` with encoded data
- Add API funcs `ZBarcode_UTF8_To_ECI()` and `ZBarcode_Dest_Len_ECI()`
- Set `option_1`, `option_2`, `option_3` to values used in encodation, and add
  new access methods `encodedOption1()` etc. to Qt Backend, and use in GUI to
  provide better feedback
- AZTEC: give more precise warnings in low ECC situations, and indicate via
  `option_1` by setting to -1 (min 3 words), 0 (<5% + 3 words)
- Better warning messages on non-compliant heights
- composite: warn if CC type upped from requested
- gs1: csumalpha: improve warning, report both chars (ticket #332, props Harald
  Oehlmann)
- New `ZBarcode_Cap()` flag `ZINT_CAP_BINDABLE`, differentiated from
  `ZINT_CAP_STACKABLE`, and new Qt Backend method `isBindable()`
- DOTCODE: now pads rows if given number of columns instead of failing if rows
  below min (5)
- EAN-8 + add-on: warn as non-compliant
- UPC-E: warn if first digit of 7 (or 8 if check digit given) not '0' or '1'
- Extend `errtxt` buffer 100 -> 160
- Add new symbologies `BARCODE_EAN8`, `BARCODE_EAN_2ADDON`,
  `BARCODE_EAN_5ADDON`, `BARCODE_EAN13`, `BARCODE_EAN8_CC` and
  `BARCODE_EAN13_CC` as replacements for `BARCODE_EANX`, `BARCODE_EANX_CHK` and
  `BARCODE_EANX_CC` and use in CLI/GUI (`BARCODE_EANX` etc. marked as legacy)
- For EAN/UPC accept space as alternative add-on separator to '+', and accept
  GTIN-13 format with & without 2-digit or 5-digit add-on (no separator)

Bugs
----
- CODABLOCKF: fix misencodation of extended ASCII 0xB0-0xB9 when followed by
  digit (ignore 2nd byte of FNC4 when categorizing Code C characters)
- AZTEC: fix GS1 mode with Structured Append (wasn't outputting initial FNC1)
- set_height: fix non-compliance false positives by using epsilon in checks
- UPU_S10: fix Service Indicator warning re "H" (ticket #331, props Milton Neal)
- CLI: fix `separator` check to use new `ZINT_CAP_BINDABLE` instead of
  `ZINT_CAP_STACKABLE`
- ZBarcode_Cap: add missing symbologies to `ZINT_CAP_BINDABLE` (was
  `ZINT_CAP_STACKABLE`)
- MAILMARK_2D: fix postcode validation: no limited alphanumerics, spaced-out
  DPS "outward"-only allowed, all-blank DPS allowed (ticket #334, props Milton
  Neal)
- manual/man page: fix DATAMATRIX Sizes tables "28 12x26" -> "27 12x26"


Version 2.15.0 (2025-02-25)
===========================

***2.14.0 regression fix***
---------------------------
- CODE128: start code no longer omitted for data starting with numerics followed
  by extended ASCII (Latin-1)

**Incompatible changes**
------------------------
- New `text_length` field in `zint_symbol`

Changes
-------
- iso4217: remove 191 (HRK), 694 (SLL), 931 (CUC); add 926 (VED)
- Add `text_length` (length of `text`) to `zint_symbol`
- PLESSEY: add show default check characters option

Bugs
----
- CODE128: fix 2.14.0 regression (see above), never start in mode C1
- CODE32: ignore `option_2` (check digit options)
- PZN: ignore `option_2` (check digit options) except for indicates PZN7 only
- DPD: exclude DEL from ident tag also
- out_maybe_mkdir: fix `utf8_to_wide()` return (Windows only)
- man page: fix Code 93 `--vers=1` hide -> show default check digits


Version 2.14.0 (2025-02-05)
===========================

**Incompatible changes**
------------------------
- New `memfile` & `memfile_size` fields in `zint_symbol` for use with new output
  option `BARCODE_MEMORY_FILE`
- Buffer length of member `text` (HRT) in `zint_symbol` extended 200 -> 256
  (client buffers may need checking/extending)
- Invalid `input_mode` now returns warning
- Aztec Code symbols that due to input length & user-requested version have less
  than recommended 5% error correction codewords now return warning
- New CODE128-only special extra escapes beginning `\^`
- Add-ons for UPC-A and UPC-E now descend to be level with the main symbol guard
  bars, and the righthand outside digit is now placed 1X less from main symbol
  to avoid touching any add-on
- GS1-128 symbols now warn if READER_INIT option used

Changes
-------
- BMP: lessen heap memory usage by only `malloc()`ing a row
- GIF: lessen heap memory usage by paging; use standard colour char map
- Add `BARCODE_MEMORY_FILE` to `symbol->output_options` to allow outputting to
  in-memory buffer `symbol->memfile` instead of to file `symbol->outfile`,
  ticket #301
- CODE16K (was for CODE128): improve encodation on A/B shifting, props Daniel
  Gredler (Okapi)
- CODE128: add new extra escape `\^1` for manual insertion of FNC1s, ticket
  #324, props Jim Shank;
  new  extra escapes `\^A`, `\^B`, `\^C` and `\^@` for manual switching of
  Code Sets;
  add minimal encodation algorithm, props Alex Geller (ZXing) and Bue Jensen
  (BWIPP);
- library: return warning on invalid `input_mode` reset
- library/CLI: expanded error messages
- GS1: new AIs 7250-7259 (GSCN 22-246);
  iso4217: new ISO 4217 currency code 924;
  new AIs 7041 (GSCN 23-272) (packagetype) and 716 (GSCN-24-157)
- AZTEC: workaround MSVC 2022 optimizer bug in `az_populate_map()` loops,
  ticket #317, props Andre Maute;
  return warning if ECC < 5% (due to bit-stuffing when version given)
- MAXICODE: zero-pad US postcodes that lack "+4" (Annex B.1.4a), from
  OkapiBarcode, props Daniel Gredler;
  add minimal encodation algorithm, props Bue Jensen (BWIPP)
- GUI: use X11 (xcb) as platform instead of Wayland on Linux to avoid various
  weird behaviours;
  in "grpDATF.ui" use "PlainText" rather than "RichText" for tracker ratio
  examples as height of text messing up sometimes
- UPCA/UPCE: descend add-ons to same level as guards and adjust righthand
  outside digit to be 4X/2X instead of 5X/3X away from main symbol so as not to
  touch add-on TODO: revisit when standard clarified
- manual: make explicit that AI "(00)" and "(01)" prefixes added by Zint are
  HRT-only; clarify Codablock-F length maximum & add examples
- add DXFILMEDGE (MR #159, props Antoine Mérino)

Bugs
----
- raster/BMP/GIF/PCX/TIF: fix dealing with very large data (use `size_t`)
- raster: add `raster_malloc()` to fail > 1GB (avoids very large output files;
  also lessens to some degree chances of being victim of OOM killer on Linux)
- GUI: printing scale dialog: set maxima on X-dim and resolution to keep scale
  <= 200
- BMP/EMF/PCX/TIF: fix endianness on big-endian machines (note TIF now always
  written as little-endian - simplifies testing)
- ITF14/DPLEIT/DPIDENT: ignore `option_2` (check digit options)
- GUI: scalewindow: fix cropping of initial resolution and bound X-dim <= 10
- GUI: factory reset: reset preview background colour also
- GUI: cliwindow: `#if _WIN32` -> `#ifdef _WIN32`
- QZint: fix legacy width and security level getters/setters, MR #158, props
  Philip Ye
- CODE128: fix extended char latching when exactly 3 extended chars at end
- library: need to check for valid UTF-8 after de-escaping
- MAXICODE: maintain current set between segments
- MSYS2: fix stdout output on Windows under MSYS2 (mailing list, props Frank)
- DATAMATRIX: fix mis-encodation by only doing special end-of-data processing
  on last segment
Make Clarion Great Again ! 😎
Аватара пользователя
morkovin
Ветеран
Сообщения: 930
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 3 раза
Контактная информация:

Класс для API ZINT «Barcode Generator»

Сообщение morkovin »

Посмотрел пример, но не понял, как сохранить сгенерированный QR-код (image) в файл с нужным мне именем и расширением?
WBR, morkovin
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

Класс для API ZINT «Barcode Generator»

Сообщение Игорь Столяров »

morkovin писал(а): 21 Апрель 2025, 9:48 как сохранить сгенерированный QR-код (image) в файл с нужным мне именем и расширением
Здесь ответ делится на 2 части ... :D

1. Библиотека ZINT имеет проблемы с некоторыми русскими именами файлов.
Поэтому мы предпочитаем формировать картинки со штрих-кодами в папке TEMP Windows.
Т.е. Вы можете указать нужный Вам формат (по умолчанию GIF) и забрать картинку из TEMP:

Код: Выделить всё

  Loc:MyZint.Setting(ZINT_BARCODE_QRCODE)    ! Создаём QR код  
  Loc:MyZint.FileExt = 'png'
  If Loc:MyZint.WriteToFile('https://forum.clarionlife.net') = 0  then Message(Loc:MyZINT.FileName).
2. С другой стороны - а почему собственно нет ? (если Вы понимаете, что хотите сделать).
Обновите пожалуйста файлы INC / CLW прикреплённые к этому сообщению. Теперь можно вот так:

Код: Выделить всё

  Loc:MyZint.Setting(ZINT_BARCODE_QRCODE)    ! Создаём QR код  
  Loc:MyZint.Setting.sOutFile = 'D:\TestZint.png'
  If Loc:MyZint.WriteToFile('https://forum.clarionlife.net') = 0  then Message(Loc:MyZINT.FileName).

3. Но предупреждаю, что Вы получите ошибку, если зададите какой-нибудь кандибобер вроде:

Код: Выделить всё

  Loc:MyZint.Setting(ZINT_BARCODE_QRCODE)    ! Создаём QR код  
  Loc:MyZint.Setting.sOutFile = 'D:\СБИС++\TestZint.png'
  If Loc:MyZint.WriteToFile('https://forum.clarionlife.net') = 0  then Message(Loc:MyZINT.FileName).
1.jpg
Вложения
zint-21-04-2025.zip
(18.38 КБ) 118 скачиваний
Make Clarion Great Again ! 😎
Аватара пользователя
morkovin
Ветеран
Сообщения: 930
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 3 раза
Контактная информация:

Класс для API ZINT «Barcode Generator»

Сообщение morkovin »

Игорь Столяров писал(а): 21 Апрель 2025, 13:17 2. С другой стороны - а почему собственно нет ? (если Вы понимаете, что хотите сделать).
Обновите пожалуйста файлы INC / CLW прикреплённые к этому сообщению. Теперь можно вот так:
КОД: ВЫДЕЛИТЬ ВСЁ

Loc:MyZint.Setting(ZINT_BARCODE_QRCODE) ! Создаём QR код
Loc:MyZint.Setting.sOutFile = 'D:\TestZint.png'
If Loc:MyZint.WriteToFile('https://forum.clarionlife.net') = 0 then Message(Loc:MyZINT.FileName).
Спасибо! Этот вариант полностью устраивает. Имена файлов у меня - это GUID студента, далее файл считывается LL-репортером в QR image для печати на титульном листе диплома (вот ведь придумали! :? ).
P.S. Использую ZINT через командную строку, но думаю перейти на Ваш вариант.
WBR, morkovin
Аватара пользователя
morkovin
Ветеран
Сообщения: 930
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 9 раз
Поблагодарили: 3 раза
Контактная информация:

Класс для API ZINT «Barcode Generator»

Сообщение morkovin »

Переменная
Loc:MyZint.Setting.sOutFile =
слишком короткая (всего 40 символов)
В zint.inc нашёл строку:

Код: Выделить всё

ZINT_xTypeQImage    Queue,Type
iFile                 CString(40)  ! GUID(36) & '.' & EXT(3)
                    end
Изменил на

Код: Выделить всё

ZINT_xTypeQImage    Queue,Type
iFile                 CString(200)  ! GUID(36) & '.' & EXT(3)
                    end
Работает. Будут какие-либо негативные последствия?
WBR, morkovin
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7948
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 92 раза

Класс для API ZINT «Barcode Generator»

Сообщение Игорь Столяров »

morkovin писал(а): 21 Апрель 2025, 17:12 Работает. Будут какие-либо негативные последствия?
Неть. Я внёс указанные Вами изменения, но мне также нужно будет добавить
очистку файлов с прямым указанием имени в Destruct.

Поэтому Вам лучше сразу включать опцию:

Код: Выделить всё

  Loc:MyZint.NoDelFile = True      ! Не удалять файл с штрих-кодом при деактивации класса
  If Loc:MyZint.WriteToFile( ...  
morkovin писал(а): 21 Апрель 2025, 16:34 Использую ZINT через командную строку
Эту тему уже неоднократно поднимали с CURL.
У меня штатный Защитник Win10 x64 постоянно нервно реагирует на запуск внешнего EXE из приложения.
Make Clarion Great Again ! 😎
Ответить