logo

[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.

Ссылки на базу знаний

Текущий перечень функций генератора шаблонов

Функция формирования почтового адреса для подстановки в шаблоны документов и уведомлений