Конвертации

Форматирование дат

$D.date.format(value, format)

Позволяет отформатировать дату по нужному шаблону.

$D.date.format(new Date('October 14, 2019 11:30:00'), 'dd.MM.YY');// = "14.10.19"
$D.date.format('1571039928020', 'dd.MM.YY');// = "14.10.19"
$D.date.format(1571039928020, 'dd.MM.YY');// = "14.10.19"
$D.date.format($D.java.newLong('1571039928020'), 'dd.MM.YY');// = "14.10.19"
$D.date.format($D.java.newDate('1571039928020'), 'dd.MM.YY');// = "14.10.19"
$D.date.format($D.date.parse('14.10.19', 'dd.MM.YY'), 'dd.MM.YY');// = "14.10.19"

$D.date.parse(value, format)

Позволяет прочитать дату по нужному шаблону (потом можно передать в date.format для смены представления даты).

$D.date.parse('14.10.19', 'dd.MM.YY');// = "2019-10-14T00:00:00.000+03:00"

Преобразование XML в JSON строку

$D.xmlToJSON(XMLString)

$D.xmlToJSON(XMLString)

Где XMLString - строка в формате XML (пример)

//объявляем тестовый пример xml строки (символ "\" - перенос строки)
var xml = '<human profession = "слесарь">\
<body>\
<arms>\
<arm name = "right">\
<fingers>\
<finger number = "first"></finger>\
<finger number = "second"></finger>\
<finger number = "third"></finger>\
</fingers>\
</arm>\
<arm name = "left">\
<fingers>\
<finger number = "first"></finger>\
<finger number = "second"></finger>\
<finger number = "third"></finger>\
</fingers>\
</arm>\
</arms>\
</body>\
</human>'
//передаем в парсер xml строку
var res = $D.xmlToJSON(xml)
/*res = {
"human": {
"@profession": "слесарь",
"body": {
"arms": {
"arm": [
{
"@name": "right",
"fingers": {
"finger": [
{
"@number": "first"
},
{
"@number": "second"
},
{
"@number": "third"
}
]
}
},
{
"@name": "left",
"fingers": {
"finger": [
{
"@number": "first"
},
{
"@number": "second"
},
{
"@number": "third"
}
]
}
}
]
}
}
}
}
*/
//преобразуем полученный JSON в JS объект
var data = JSON.parse(res)
//пример осуществления доступа до ключей объекта
return data.human.body.arms.arm[0].fingers.finger[0]['@number'];
//return = first
});

$D.fileLinkToBase64(link)

$D.fileLinkToBase64(link)

Экспортирует html код, переданный в поле типа String, в pdf файл

$D.htmlToPDF = function(html:String,height)

$D.htmlToPDF(html, height)

height - параметр высоты страницы в миллиметрах. По умолчанию 297 мм.

$D.htmlToPDF = function(html:String)
//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
//DirectualEngine.sendSMS('','79151111111', 'test')
//return context.scenarioObject.fields().id > 0 ? true : false;
//получаем значение ID текущего объекта
var templateID = null;
templateID = $D.getValueFromTemplate("{{id}}");
var code = '<html><head></head><body><span>тест</span></body></html>';
var htmlToPDF;
htmlToPDF = $D.htmlToPDF(code);
//добавляем в текущий объект значение
$D.saveObject("htmlToPDF",{id:templateID,field1:htmlToPDF});
return true;
});

Результат выполнения функции — ссылка на pdf файл.

$D.convertToPdf = function(link)

$D.convertToPdf = function(link)
//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
//DirectualEngine.sendSMS('','79151111111', 'test')
//return context.scenarioObject.fields().id > 0 ? true : false;
//получаем значение ID текущего объекта
var templateID = null;
templateID = $D.getValueFromTemplate("{{id}}");
//получаем ссылку на конвертируемый файл из глобальной переменной
var file = $D.getValueByID("GlobalVariables","docx","value")
//объявляем переменную, в которую будет записан результат и выполняем конвертацию
var convertToPDFdocx;
convertToPDFdocx = $D.convertToPdf(file);
//добавляем результат в текущий объект в поле convertToPdfResultDOCX
$D.saveObject("convertToPDF",{id:templateID,convertToPdfResultDOCX:convertToPDFdocx});
return true;
});

Результат выполнения функции — ссылка на сконвертированный файл .pdf.

Создает документ в структуре FileUpload. Если по исходной ссылке можно понять имя сети, то имя файла будет соответствовать исходному.

$D.office.modify = function(link, options)

$D.office.modify = function(link, options)
//var file = "http://someurl.somefile.docx"
//var options = {
// header:{text:headerVal, bold:true, italic:true, underline:true, size:15, fontName:"Andale Mono", alignment:"right"},
// footer:{text:footerVal, bold:true, size:15, fontName:"Andale Mono", alignment:"right"},
// }
//var url = $D.office.modify(file, options)

В options можно указать формат добавления header и footer в документ:

{
header:{text:"Header\n test", bold:true, size:15, fontName:"Arial", alignment:"right"},
footer:{text:"Footer\n test", bold:true, size:15, fontName:"Arial", alignment:"right"},
table:{ borderWidth: 0, position: "header", cells: {
A1: {text:"Cell content", bold:true, size:15, fontName:"Arial", alignment:"right"},
B1: {text:"Cell content", bold:true, size:15, fontName:"Arial", alignment:"right"},
C1: {text:"Cell content", bold:true, size:15, fontName:"Arial", alignment:"right"
}
}
}
}

Параметры в options:

header/footer/table: указывает, настройки какого блока описываются; text: Содержимое блока; bold: true - жирный текст, false - обычный; size: задаёт размер шрифта; fontName: задаёт шрифт текста; borderWidth: ширина границ таблицы (0 - границы будут скрыты); position: место вставки таблицы (header/footer); cells: перечисление ячеек таблицы; (для создания таблицы 2x2 нужно указать 4 ячейки A1, A2, B1, B2); color: определяет цвет шрифта;

Результат работы функции — ссылка на модифицированный файл.

$D.office.convert = function(link, format)

Результат выполнения функции — ссылка на сконвертированный файл. Форматы: .docx → .pdf, .txt, .html, .jpg .doc(97-2003) → .pdf, .txt, .html, .jpg .xls → .pdf, .jpg

$D.office.convert = function(link, format)
//$D.office.convert(url, 'pdf')
//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
//получаем значение ID текущего объекта
var ID = null;
ID = $D.getValueFromTemplate("{{id}}");
//получаем ссылку на конвертируемый файл из глобальной переменной
var fileDOCX = $D.getValueByID("GlobalVariables","docx","value")
//конвертируем из docx в pdf
var convertDOCXToPDF = $D.office.convert(fileDOCX, 'pdf')
//записываем результат (ссылку на файл) в текущий объект в поле DOCXtoPDF
$D.saveObject("yourStructure",{id:ID,DOCXToPDF:convertDOCXToPDF});
return true;
});

Конвертация текста в разных разметках

Поддержка множества форматов, таких как Markdown, HTML, LaTeX, ODT и других. Более подробное описание библиотеки: https://pandoc.org/

$D.office.transform(data, initialFormat, targetFormat) data: ссылка на файл в FileUpload или же простой текстовые данные; initialFormat: формат передаваемого файла или текстовых данных; targetFormat: целевой формат.

Результат выполнения функции — ссылка на сконвертированный файл.

$D.office.transform(data, initialFormat, targetFormat)
//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
//получаем значение ID текущего объекта
var templateID = null;
templateID = $D.getValueFromTemplate("{{id}}");
var filePandoc = $D.getValueByID("GlobalVariables","pandoc","value");
var pandocResultHTML = $D.office.transform(filePandoc, "markdown", "html");
//Результатом работы метода будет ссылка на файл в FileUpload.
//добавляем в текущий объект значение в поле
$D.saveObject("officeTransform",{id:templateID,pandocMarkdownToHTML: pandocResultHTML});
return true;
});

DOMParser

$D.jsoup.connect(url)

Используется для парсинга объектов DOM в документе.Реализованы 2 метода загрузки библиотеки Jsoup: parse & connect.

Рассмотрим на примере извлечения первого элемента, выделенного заголовком H3 из docx документа.

Подробнее функционал можно изучить в документации библиотеки Jsoup.

//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
//Получаем ID текущего объекта
var templateID = null;
templateID = $D.getValueFromTemplate("{{id}}");
//получаем docx документ из глобальной переменной (можно использовать ссылку на хранилище fileUpload)
var docxTemplate = $D.getValueByID("GlobalVariables","domParser","value");
//конвертируем docx в xhtml
var xhtml = $D.office.convert(docxTemplate, "xhtml");
//парсим полученный xhtml документ
var doc = $D.jsoup.connect(xhtml);
//сохраняем первый элемент DOM, выделенный тегом <h3></h3>
var result = doc.select('h3').first().text();
//добавляем в текущий объект полученное значение
$D.saveObject("DOMparse",{id:templateID,DOMparseResult:result});
return true;
});

Сохраняет текст из платформы в файл (html, csv)

$D.fs.saveText = function('Text', format)

$D.fs.saveText = function('Text', format)
//$D.fs.saveText('<html><body>test</body></html>', 'html')
//$D.fs.saveText('1;2;3', 'csv')

Результат выполнения функции — ссылка на сконвертированный файл.

Встречается ситуация, когда в готовый .pdf документ требуется добавить "шапку" или "подвал". При этом, на первой странице в шапке ничего быть не должно, зато на последней информация должна отличаться от других. Для этого используется JS SDK метод pdf.modify.

$D.pdf.modify(url, options)

  • url (тип string) - линка на pdf-файл

  • options (тип json) - массив, содержащий для одной/нескольких/всех страниц параметры масштабирования страницы, параметры вставки "шапки", "футера" (page, scale, header, footer, table) Принимаемые значения:

    • page (тип int): <номер страницы> - указание, какие страницы модифицируются, может принимать следующие значения:

      • положительное число - порядковый номер страницы с начала. Например: "1" — первая страница,

      • отрицательное число - порядковый номер страницы с конца. Например: "-1" — последняя страница, "-3" — третья страница с конца (8-я страница из 10).

      • 0, либо null, либо ключ-значение “page” отсутствует — страницы, которые соответствуют всем оставшимся страницам pdf, не указанные в других элементах массива options. Например, в options были параметризированы первая и последняя страницы 10-страничного документа, тогда 0 будет параметризировать страницы с 2 по 9 включительно.

    • scale (тип float): 0.0-1.0 — коэффициент масштабирования страницы. Особенности обработки параметра scale:

      • если на странице есть header — позиционировать (прижимать) смасштабированную страницу к низу;

      • если на странице есть footer — позициониовать смасштабированную страницу к верху;

      • если есть и то, и другое — позиционировать страницу посередине (как в примере кода).

    • header | footer | table (тип json): переиспользуем options реализованные в методе officeModify()

Пример options.

  • Однотипное изменение всех страниц.

[
{
"scale": 0.8,
"header": {"text": "some text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"footer": {"text": "some another text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
}
]
  • Изменение первой/промежуточных/последней страниц:

[
{
"page": 1,
"scale": 0.8,
"header": {"text": "some text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"footer": {"text": "some another text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"table": {
"borderWidth": 0, "position": "footer", "cells": {
"A1": {"text":"first row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"B1": {"text":"second row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
}
}
},
{
"page": -1,
"scale": 0.8,
"header": {"text": "some text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"footer": {"text": "some another text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"table": {
"borderWidth": 0, "position": "footer", "cells": {
"A1": {"text":"first row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"B1": {"text":"second row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
}
}
},
{
"page": 0,
"scale": 0.8,
"header": {"text": "some text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"footer": {"text": "some another text", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"table": {
"borderWidth": 0, "position": "footer", "cells": {
"A1": {"text":"first row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"B1": {"text":"second row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
}
}
},
]

Реализована работа с вертикально ориентироваными ("portrait") документами. Планируется реализация "landscape" документами.

Пример реализации метода:

//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
var url = 'https://api.directual.com/fileUploaded/yourApp/9c4db617-35e5-4788-87d6-3e37f6ae7c40.pdf';
var result;
var options = {};
options =
[
{
"page": 1,
"scale": 0.8,
"header": {"text": "HEADER TEXT 1", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"footer": {"text": "footer TEXT 1", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"table": {
"borderWidth": 0, "position": "footer", "cells": {
"A1": {"text":"first row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"B1": {"text":"second row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
}
}
},
{
"page": -1,
"scale": 0.8,
"header": {"text": "HEADER TEXT 2", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"table": {
"borderWidth": 0, "position": "header", "cells": {
"A1": {"text":"first row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"A2": {"text":"second row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"B1": {"text":"вторая колонка", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
}
}
},
{
"page": 0,
"scale": 0.5,
"footer": {"text": "footer TEXT 3", "bold": true, "size":12, "fontName": "Times New Roman", "alignment": "right"},
"table": {
"borderWidth": 0, "position": "footer", "cells": {
"A1": {"text":"first row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
"B1": {"text":"second row", "bold":true, "size":12, "fontName":"Times New Roman", "alignment":"left"},
}
}
},
];
result = $D.pdf.modify(url, options);
return result;
});

Особенность функции На примере выше указаны настройки для двух и более страниц ("page": 1, "page": -1, "page": 0). Если в качестве шаблона функция получит одностраничный документ, а настройка была для нескольких страниц, то на странице появится только "footer".

Можно провести две итерации, сначала добавить "header", а затем "footer".

Для $D.pdf.modify предусмотрен функционал, который позволяет вставить шапку и подвал документа из файла по ссылке.

"header": {"file": URL}

Пример.

//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
var url = 'https://api.directual.com/fileUploaded/yourApp/9c4db617-35e5-4788-87d6-3e37f6ae7c40.pdf';
var result;
var options = [
{
"scale": 0.8,
"header": {"file": "https://api.directual.com/fileUploaded/PCC-dev/97b54874-2dd5-4e80-9420-4cfe4bf444d3.pdf"},
"footer": {"file": "https://api.directual.com/fileUploaded/PCC-dev/97b54874-2dd5-4e80-9420-4cfe4bf444d3.pdf"}
}
];
result = $D.pdf.modify(url, options);
return result;
});

Объединение нескольких .pdf документов в один

$D.pdf.merge(arr)

Где arr - массив ссылок на файлы (внешние / внутренние)

//example code
DirectualEngine.addEventListener(AppEvents.START, function(context){
var templateID = null;
templateID = $D.getValueFromTemplate("{{id}}")
var arr = [];
var url1 = 'https://api.directual.com/fileUploaded/yourApp/a0e13ac1-df12-4e1d-8c47-456a1bc1edf5.pdf';
var url2 = 'https://api.directual.com/fileUploaded/yourApp/8836be48-e3a7-40e1-b41c-fdca4c1a8a24.pdf';
arr = [url1,url2];
var result = $D.pdf.merge(arr);
$D.saveObject("111",{"id":templateID,"result":result})
return true;
});

Результат выполнения функции — ссылка на сконвертированный файл.

Вставка колонтитулов по шаблону

$D.pdf.overlay(initURL, templateURL, yShift)

Если необходимо поместить некоторый xhtml текст внутрь шаблона, существует метод $D.pdf.overlay.

$D.pdf.overlay(initURL, templateURL, yShift)

initURL — исходный документ, который будет вставлен внутрь шаблона. Исторически используется вместе с методом htmlToPDF, в котором уменьшается высота документа с 297мм до значения, которое позволит разместить в шаблон. Конвертируются данные из xhtml в pdf (заданной высоты); templateURL — Ссылка на .docx шаблон. В нём может быть, например, шапка и нижний колонтитул; yShift — опциональный, сдвигает контент исходного документа вниз.

DirectualEngine.addEventListener(AppEvents.START, function(context){
var html = $D.getValueFromTemplate("{{html}}")
var templateUrl = $D.office.convert('link_to_your_template.docx')
var initUrl = $D.htmlToPDF(html, 150)
return $D.pdf.overlay(initUrl, templateUrl, 100);
});

Результат выполнения функции — ссылка на сконвертированный файл .pdf.