Конвертация сгенерированного по шаблону файла в PDF в бизнес-процессе

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

Процесс "Генерация файла по шаблону"

Данный процесс будет выглядеть следующим образом:

Список контекстных переменных представлен на следующем рисунке:

Рассмотрим каждую операцию по отдельности.

1. Сценарий "Создание документа"

Данный сценарий выглядит следующим образом:

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.
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).

Примечание
В том случае, если в сценарии используются пространства имен EleWise.ELMA.Documents.Models и Aspose.Words, для метода Document необходимо явно прописать, с каким из них работать. Сценарий конвертации документа 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");
Aspose.Words.Document doc = new Aspose.Words.Document(@"c:\\Шаблон1.doc");
doc.Save(@"c:\\Шаблон1.pdf", Aspose.Words.SaveFormat.Pdf);

Прикрепленные файлы