[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. Результат.
После выполнения процесса получим следующий документ: