[ELMA3] Конвертация сгенерированного по шаблону файла в PDF в бизнес-процессе
В данной статье приводится пример организации бизнес-процесса, в ходе которого создается документ, генерируется файл по шаблону, конвертируется в pdf и прикрепляется в качестве версии созданного документа.
Процесс "Генерация файла по шаблону"
Данный процесс будет выглядеть следующим образом:
Список контекстных переменных представлен на следующем рисунке:
Рассмотрим каждую операцию по отдельности.
1. Сценарий "Создание документа"
Данный сценарий выглядит следующим образом:
Пример сценария с использованием PublicAPI
var docFolder = PublicAPI.Docflow.Folder.LoadOrNull(531); var docName = string.Format("Новый документ от {0}", DateTime.Now); var doc = PublicAPI.Docflow.Types.File.Create(docFolder, docName); doc.Save(); context.NovyyDokument = (File)doc;
Пример сценария без использования PublicAPI
var doc = InterfaceActivator.Create<File>(); //Определяем папку doc.Folder = (Folder)FolderManager.Instance.Load(531); //Задаем название doc.Name = "Новый документ от " + DateTime.Now.ToString(); //Сохраняем doc.Save(); // Сопоставляем созданный документ с контекстной переменной процесса context.NovyyDokument = (File)doc;
Данный сценарий:
- создает новый документ типа Файл в папке с указанным ID;
- в случае необходимости смены типа документа во всем сценарии необходимо будет заменить File на название класса необходимого типа документа. Также необходимо будет изменить тип контекстной переменной Новый документ;
- в строке doc.Folder = (Folder)FolderManager.Instance.Load(531); число 531 необходимо заменить на Id папки, в которую необходимо создать документ (его можно узнать в адресной строке браузера, зайдя в веб-части в необходимую папку, последнее число в адресе и будет Id папки).
2. Plug-in "Генерация документа"
Генерирует файл по шаблону в указанную контекстную переменную(Файл для генерации). На вкладке Настройки операции Генерация документа добавляем шаблон и переменную типа файл, в которую будет сохранен сгенерированный документ.
3. Внутренний подпроцесс "Конвертация в PDF" (описан ниже)
4. Сценарий «Добавление версии в документ»
Сценарий выглядит следующим образом:
Пример сценария с использованием PublicAPI
var version = PublicAPI.Docflow.DocumentVersion.Create(); version.Document = context.NovyyDokument; context.Temp = InterfaceActivator.Create<BinaryFile>(); context.Temp.Name = "Шаблон1.pdf"; context.Temp.CreateDate = DateTime.Now; context.Temp.InitializeContentFilePath(); System.IO.File.Copy(@"c:\\Шаблон1.pdf", context.Temp.ContentFilePath); version.File = context.Temp; version.Status = DocumentVersionStatus.Current;//устанавливаем статус версии Текущая context.NovyyDokument.Versions.Add(version); context.NovyyDokument.Save();
Пример сценария без использования PublicAPI
var version = InterfaceActivator.Create<DocumentVersion>(); version.Document = context.NovyyDokument; context.Temp = InterfaceActivator.Create<BinaryFile>(); context.Temp.Name = "Шаблон1.pdf"; context.Temp.CreateDate = DateTime.Now; context.Temp.InitializeContentFilePath(); System.IO.File.Copy(@"c:\\Шаблон1.pdf", context.Temp.ContentFilePath); Locator.GetServiceNotNull<IFileManager>().SaveFile(context.Temp); version.File=context.Temp; version.Status = DocumentVersionStatus.Current;//устанавливаем статус версии Текущая context.NovyyDokument.Versions.Add(version); context.NovyyDokument.Save();
Данный сценарий:
- создает и прикрепляет к созданному в п.1 документу версию. Название версии задается в строке context.Temp.Name = "Шаблон1.pdf" Его можно изменить на любое другое;
- в строке System.IO.File.Copy(@"c:\\Шаблон1.pdf", context.Temp.ContentFilePath) указывается путь к временному файлу в формате pdf из подпроцесса «Конвертация в pdf».
Пространства имен, которые необходимо использовать в модуле сценариев БП "Генерация файла по шаблону":
using System; using System.Collections.Generic; using System.Linq; using System.Text; using EleWise.ELMA.Documents.Managers; using EleWise.ELMA.Documents.Models; using EleWise.ELMA.Files; using EleWise.ELMA.Model.Common; using EleWise.ELMA.Model.Entities; using EleWise.ELMA.Model.Entities.ProcessContext; using EleWise.ELMA.Model.Managers; using EleWise.ELMA.Model.Services; using EleWise.ELMA.Model.Types.Settings; using EleWise.ELMA.Runtime.Managers; using EleWise.ELMA.Services; using Microsoft.CSharp;
Также необходимо подключить глобальную сборку Microsoft.CSharp (на вкладке Сценарий выбранного процесса, в правом меню нажать кнопку Добавить – Добавить ссылку на сборку. В открывшемся окне выбрать Microsoft.CSharp и нажать кнопку Ok).
Внутренний подпроцесс "Конвертация в PDF"
Он состоит из одной операции – сценария "Конвертация в PDF":
- в нем используются временные служебные файлы Шаблон1.doc (или Шаблон1.xls) и Шаблон1.pdf. Необходимо заранее определить, где они будут храниться и изменить путь до них во всем сценарии. По умолчанию это - c:\\Шаблон1.doc (или c:\\Шаблон1.xls ) и c:\\Шаблон1.pdf;
- первые две строки сценария удаляют временные файлы, для их последующего обновления;
- третья строка копирует сгенерированный в процессе "Генерация файла по шаблону" файл во временный файл Шаблон1.doc (или Шаблон1.xls);
- четвертая и пятая строки конвертируют данный файл в формат pdf.
Рассмотрим два случая:
1. Конвертация документа MS Word в pdf
Сценарий будет выглядеть следующим образом:
System.IO.File.Delete(@"c:\\Шаблон1.doc"); System.IO.File.Delete(@"c:\\Шаблон1.pdf"); System.IO.File.Copy(context.FaylDlyaGeneracii.ContentFilePath, @"c:\\Шаблон1.doc"); Document doc = new Document(@"c:\\Шаблон1.doc"); doc.Save(@"c:\\Шаблон1.pdf", Aspose.Words.SaveFormat.Pdf);
2. Конвертация таблицы Excel в pdf
Сценарий будет выглядеть следующим образом:
System.IO.File.Delete(@"c:\\Шаблон1.xls"); System.IO.File.Delete(@"c:\\Шаблон1.pdf"); System.IO.File.Copy(context.ShablonSchetNaOplatu.ContentFilePath, @"c:\\Шаблон1.xls"); Workbook workbook = new Workbook(@"c:\\Шаблон1.xls"); workbook.Save(@"c:\\Шаблон1.pdf", Aspose.Cells.SaveFormat.Pdf);
Пространства имен, которые необходимо использовать:
using System; using System.Collections.Generic; using System.Linq; using System.Text; 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.Xml; using Aspose.Words; //для конвертации файла формата doc using Aspose.Cells; //для конвертации файла формата xls
Также необходимо подключить глобальную сборку System.Xml (на вкладке Сценарий выбранного процесса, в правом меню нажать кнопку Добавить - Добавить ссылку на сборку. В открывшемся окне выбрать System.Xml и нажать кнопку Оk).
System.IO.File.Delete(@"c:\\Шаблон1.doc");
System.IO.File.Delete(@"c:\\Шаблон1.pdf");
System.IO.File.Copy(context.FaylDlyaGeneracii.ContentFilePath, @"c:\\Шаблон1.doc");
Aspose.Words.Document doc = new Aspose.Words.Document(@"c:\\Шаблон1.doc");
doc.Save(@"c:\\Шаблон1.pdf", Aspose.Words.SaveFormat.Pdf);