logo

[ELMA3] Сценарий формирования изображения фиксированного размера для подстановки в шаблон документа

В данной статье представлен сценарий генерации изображения, которое будет вписано в определённые рамки (в пикселях). Если исходное изображение выходит за установленные рамки, оно будет уменьшено с сохранением пропорций. За основу исчисления масштаба уменьшения принимается наибольшая сторона изображения.

1. Создан шаблон, в котором находится таблица. В таблицу необходимо подставить изображение, которое не превышает её размеров. В таблице указывается контекстная переменная для шаблона: {Image({$FileWithImage};’scale:100’)}.

2. Графическое изображение процесса:

В первой задаче загружается исходное изображение, далее сценарий подгоняет его под наш элемент таблицы, потом происходит генерация документа по шаблону и в последней задаче мы можем ознакомиться с результатом.

3. Сценарий.

Для работы сценария необходимо подключить глобальные сборки System.Drawing и Microsoft.CSharp.

Пространства имен:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EleWise.ELMA.API;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.Model.Entities.ProcessContext;
using System.Drawing;
using System.Drawing.Drawing2D;
using EleWise.ELMA.Runtime.Managers;
using EleWise.ELMA.Services;
using Microsoft.CSharp;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Files;

Текст сценария:

//задаём в пикселях размер таблицы, в которую необходимо вписать изображение
            int tableWidth = 600;
            int tableHeight = 600;
           float nPercent = 1; //коэффициент масштабирования
            Image fromFile = Image.FromFile(context.Image.ContentFilePath);
            var imageHeight = fromFile.Size.Height;
            var imageWidth = fromFile.Size.Width;
            //если изображение не вписывается в заданные размеры, уменьшаем его
            if (imageHeight > tableHeight | imageWidth > tableWidth)
            {
            	//определяем сторону изображения, по которой проводится масштабирование
            	if (imageHeight > imageWidth)
            	{ 
            	nPercent = (float)tableHeight / (float)imageHeight;
            	}
            	else
            	{ 
            	nPercent = (float)tableWidth / (float)imageWidth;
            	}
            	int newWidth = System.Convert.ToInt32(imageWidth * nPercent);
            	int newHeight = System.Convert.ToInt32(imageHeight * nPercent);
            	//проводим ресайз
            	Bitmap newImage = new Bitmap(fromFile, new Size(newWidth, newHeight));
				string path = context.Image.ContentFilePath + ".tmp";
	            newImage.Save(path);
	           	//сохраняем уменьшенное изображение в файл
	           	context.FileWithImage = InterfaceActivator.Create<BinaryFile>();
				context.FileWithImage.Name = "image.png";
				context.FileWithImage.CreateDate = DateTime.Now;
				context.FileWithImage.InitializeContentFilePath();
				System.IO.File.Copy(@path, context.FileWithImage.ContentFilePath);
				Locator.GetServiceNotNull<IFileManager>().SaveFile(context.FileWithImage);
			}
			else
			{
				context.FileWithImage = context.Image;
			}

4. Результат.

После выполнения процесса получим следующий документ: