Постановка задачи
При работе с клиентами возникла задача: использовать форматированный документ. Итак, существует справочник, в нем табличная часть. Для каждой строки требуется ввести описание, причем описание имеет тип форматированный документ. Потребовалось организовать печать табличной части справочника с описанием для каждой строки. Тип данных "Форматированный документ" не может выводится в табличный документ, поэтому пришлось организовывать печать через Microsoft Word. Для этого требуется:
- Сформировать html-файл. Сохранить его во временные файлы, создать временный каталог и выгрузить туда картинки и прочие файлы.
- Открыть html с помощью Microsoft Word и сохранить в pdf.
Все это требуется сделать программно.
1. Формирование временного файла html.
Один из самых простых, но определяющих внешний вид печатной формы этап. Вот пример формирования простого файла html:
&НаКлиенте
Процедура Тест(Команда)
// Формируем текстовый файл
ТекстHTML = Новый ТекстовыйДокумент;
ТекстHTML.ДобавитьСтроку("<html>");
ТекстHTML.ДобавитьСтроку("<body>");
ТекстHTML.ДобавитьСтроку("<div>");
ТекстHTML.ДобавитьСтроку("Привет мир!");
// Сюда можно добавить произвольную информацию
ТекстHTML.ДобавитьСтроку("</div>");
ТекстHTML.ДобавитьСтроку("</body>");
ТекстHTML.ДобавитьСтроку("</html>");
// Получаем имя временного файла
// Файл сохраняем в формате 'doc' для открытия его с помощью Microsoft Word
ИмяВрФайла = ПолучитьИмяВременногоФайла("doc");
//Записываем текстовый файл
ТекстHTML.Записать(ИмяВрФайла);
//Открываем файл
ЗапуститьПриложение(ИмяВрФайла);
КонецПроцедуры
Из типа данных "Форматированный документ" легко получить html строку и вставить её в html файл. Причем это можно сделать и с учетом картинок. Вот пример кода:
//Для хранения картинок html-файла требуется создать дополнительный каталог
Каталог = КаталогВременныхФайлов();
ИмяВрФайла = ПолучитьИмяВременногоФайла("doc");
ИмяФайлаБезРасширения = СтрЗаменить(ИмяВрФайла,КаталогВременныхФайлов(),"");
ИмяФайлаБезРасширения = СтрЗаменить(ИмяФайлаБезРасширения,".doc","");
ИмяВременногоКаталога = ИмяФайлаБезРасширения + ".files";
ДопКаталог = Каталог + ИмяВременногоКаталога;
СоздатьКаталог(ДопКаталог);
СтруктураКартинок = Новый Структура;
// Получаем html текст из форматированного документа
ТекстДокумента = "";
ФорматированныйДокумент.ПолучитьHTML(ТекстДокумента,СтруктураКартинок);
// Записываем картинки во временный каталог и меняем путь в тексте html
Для каждого ЭлементСтруктуры Из СтруктураКартинок Цикл
ФорматТекущейКартинки = ЭлементСтруктуры.Значение.Формат();
Если Не ФорматТекущейКартинки = ФорматКартинки.НеизвестныйФормат Тогда
//Записываем картинку во временный каталог
ФорматТекущейКартинкиСтрока = Строка(ФорматТекущейКартинки);
ИмяТемпФайла = ДопКаталог + "/" + ЭлементСтруктуры.Ключ+ "." + ФорматТекущейКартинкиСтрока;
ЭлементСтруктуры.Значение.Записать(ИмяТемпФайла);
// Меняем пусть в html тексте
ТекстДокумента = СтрЗаменить(ТекстДокумента, "src=""" + ЭлементСтруктуры.Ключ + """", "src=""" + ИмяВременногоКаталога +"/" + ЭлементСтруктуры.Ключ+ "." + ФорматТекущейКартинкиСтрока+"""");
КонецЕсли;
КонецЦикла;
// Добавляем в html-документ
ТекстHTML.ДобавитьСтроку(ТекстДокумента);
В html-документ можно передавать данные с учетом форматирования. В Microsoft Word существуют свои особенности. Так например следующая конструкция формирует строку курсивом и шрифтом "Times New Roman":
<p><em>Произвольный текст</em></p>
Подробно на форматах останавливаться не буду. В интернете существуют множество онлайн сервисов, в которых можно получить требуемый формат вывода. (Например: https://wordhtml.com/).
2. Открытие html с помощью Microsoft Word и сохранение в pdf
Средствами Microsoft Word возможно сохранение файла html в другие форматы (в том числе в pdf). Для данной операции использовалась следующая конструкция:
Попытка
// Создание com объекта
ОбъектВорд = Новый COMОбъект("Word.Application");
// Открытие файла
ОбъектВорд.Documents.add(ИмяВременногоФайла);
// Запрет отображения окна и диалогов
ОбъектВорд.Application.DisplayAlerts = -1;
ОбъектВорд.Application.Visible = Ложь;
//Получение ссылки на открытый документ
ДокументВорд = ОбъектВорд.Application.Documents(1);
// Получение временного имени файла
ИмяВрФайлаPdf = ПолучитьИмяВременногоФайла("pdf");
//Сохранить как Тип файла pdf-17
ДокументВорд.SaveAs2(ИмяВрФайлаPdf,17);
// Запрет отображения окна и диалогов
ДокументВорд.Application.DisplayAlerts = -1;
ДокументВорд.Application.Visible = Ложь;
// Закрытие документа
ДокументВорд.Application.Quit(0);
//Выход из com объекта
ОбъектВорд.Application.Quit();
Исключение
КонецПопытки;
//Открытие pdf файла
ЗапуститьПриложение(ИмяВрФайлаPdf);
После открытия файлов не следует забывать об удалении временных файлов.