[ELMA3] Функция формирования изображения штрихового кода для подстановки в шаблоны документов
При формировании документов из шаблонов возможна генерация изображений (а не только строковых и числовых значений). В данном примере представлена генерация штрихового кода по вычисляемому значению.
Примечание! Использование данной функции доступно только для генерации документа по шаблону. Не использовать при подстановке в задачах бизнес процессов и шаблонах обычных почтовых уведомлений.
Пример шаблона документа
Пример созданного документа
Пример класса расширений для предоставления функций генератора шаблонов
using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using EleWise.ELMA.ComponentModel; using EleWise.ELMA.Templates; using EleWise.TemplateGenerator; using EleWise.TemplateGenerator.Formats; using EleWise.TemplateGenerator.Functions; using ITino.ELMA.Documents.Barcode.Formats; namespace ITino.ELMA.Documents.Barcode.Components { /// <summary> /// Расширение для предоставления функций генератора шаблонов /// </summary> [Component] public class TemplateGeneratorFunctionsContainer : ITemplateGeneratorFunctionsContainer { /// <summary> /// Формирование изображения штрихового кода с использованием библиотеки ZXing /// </summary> /// <param name="context">Контекст вычисления значения функции</param> /// <returns>Штриховой код типа Image</returns> public static FormatedValue Barcode(FunctionEvaluationContext context) { if (context.Parameters.Count == 0) return (FormatedValue)null; BarcodeFormat barcodeFormat = new BarcodeFormat(); if (context.Parameters.Count > 1) { string s = context.Parameters[1] == null || context.Parameters[1].Value == null ? (string)null : context.Parameters[1].Value.ToString(); if (!string.IsNullOrEmpty(s)) barcodeFormat.Parse(s); } // Генерация штрих-кода var bw = new ZXing.BarcodeWriter(); bw.Format = barcodeFormat.Code; bw.Options.PureBarcode = !barcodeFormat.ShowText; if (barcodeFormat.Height != -1) bw.Options.Height = barcodeFormat.Height; if (barcodeFormat.Width != -1) bw.Options.Width = barcodeFormat.Width; if (barcodeFormat.Margin != -1) bw.Options.Margin = barcodeFormat.Margin; Bitmap bm = bw.Write(context.Parameters[0].Value.ToString()); if (barcodeFormat.Aspect != 1) { // Изменить размер ШК если масштаб не равен 1 bm = ResizeImage(bm, (int)(bm.Width * barcodeFormat.Aspect), (int)(bm.Height * barcodeFormat.Aspect)); } // Вернуть штрих код в виде изображения return new FormatedValue((Image)bm, (DrawingFormat)barcodeFormat); } // Функция "качественного" изменения размера изображения private static Bitmap ResizeImage(Image image, int width, int height) { var destRect = new Rectangle(0, 0, width, height); var destImage = new Bitmap(width, height); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); using (var graphics = Graphics.FromImage(destImage)) { graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; using (var wrapMode = new ImageAttributes()) { wrapMode.SetWrapMode(WrapMode.TileFlipXY); graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); } } return destImage; } } }
Точка расширения (интерфейс) ITemplateGeneratorFunctionsContainer определяет перечень классов (компонентов), которые будут зарегистрированы в системе при запуске сервера. При генерации документа по шаблону происходит последовательный перебор статических методов, реализованных в данном классе. Если система находит совпадение с названием нужного метода, производится его вызов и вычисление результата по данным входной контекстной переменной и ее параметров.
Метод public static FormatedValue Barcode(FunctionEvaluationContext context) определяет обработку входного значения переменной контекста. В случае, если контекст не удовлетворяет критериям при обработке (отсутствие значения или пустая строка), возвращается null, в следствие чего в генерируемых документах штриховой код будет отсутствовать.
Иначе, по передаваемым параметрам с помощью библиотеки ZXing, входящей в дистрибутив ELMA, формируется графическое изображение штрихового кода и возвращается в виде типа Image в генерируемый документ.
Ссылки на элементы API
ITemplateGeneratorFunctionsContainer: 3.13, 3.15, 4.0.
Ссылки на базу знаний
Текущий перечень функций генератора шаблонов
Функция формирования почтового адреса для подстановки в шаблоны документов и уведомлений