gifts2017

Выгрузка в PDF из 1С (Средствами OpenOffice)

Опубликовал Виктор Баринов (doom_2001) в раздел Программирование - Практика программирования

Функция позволяющая выполнить выгрузку табличного документа в PDF средствами OpenOffice

Тестировалось на OpenOffice 3.x

// Функция превращает табличный документ в PDF документ
// Возвращаемое значение: тип "Строка" - имя созданного PDF файла, 0 - в случае ошибки
// Параметры: ДанныеВыгрузки - Табличный или текстовый документ, который нужно выгрузить в PDF
//            ПутьВыгрузки - тип "Строка", путь для сохраниения PDF файла (без имени и расширения файла)
//            ИмяФайлаБезРасширения - тип "Строка", имя для вновь сформированного PDF файла
//
Функция ВыгрузитьТабличныйДокументВPDF(ДанныеВыгрузки, ПутьВыгрузки, ИмяФайлаБезРасширения)       
    Если НЕ ЗначениеЗаполнено(ПутьВыгрузки) Тогда
        ПутьВыгрузки = КаталогВременныхФайлов();
    КонецЕсли;   
    ПутьВыгрузки         = ?(Прав(ПутьВыгрузки, 1) = "\", ПутьВыгрузки, ПутьВыгрузки + "\");
   
    РасширениеXSL         = ".xls";
    РасширениеPDF         = ".pdf";
    ПолноеИмяФайлаXLS     = ПутьВыгрузки + ИмяФайлаБезРасширения + РасширениеXSL;
    //Выгрузка данных печати в файл XLS   
#Если Клиент Тогда
    Состояние("Создание временного файла...");
#КонецЕсли
    Попытка
        Если         ТипЗнч(ДанныеВыгрузки) = Тип("ТабличныйДокумент") Тогда        
            ДанныеВыгрузки.Записать(ПолноеИмяФайлаXLS, "XLS");
        ИначеЕсли     ТипЗнч(ДанныеВыгрузки) = Тип("ТекстовыйДокумент") Тогда
            ДанныеВыгрузки.Записать(ПолноеИмяФайлаXLS, "XLS");
        Иначе
#Если Клиент Тогда
            Сообщить("Данные для выгрузки переданы в неподдерживаемом формате. Дальнейшее выполнение невозможно." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
            Возврат 0;
        КонецЕсли;
    Исключение
#Если Клиент Тогда
        Сообщить("Произошла ошибка при выгрузке временного файла. Возможно ошибка доступа к папке, в которую происходит запись." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
        Возврат 0;
    КонецПопытки;
   
    Попытка
#Если Клиент Тогда
        Состояние("Открытие компоненты OpenOffice...");
#КонецЕсли
        ServiceManager    = Новый COMОбъект("com.sun.star.ServiceManager");       
       
        Скрипт             = Новый COMОбъект("MSScriptControl.ScriptControl");
        Скрипт.language    = "javascript";
        Скрипт.AddObject("OpenOffice", ServiceManager);
       
        //Открытие временного файла без отображения его окна
#Если Клиент Тогда           
        Состояние("Открытие временного файла...");
#КонецЕсли
        Скрипт.eval("Массив=new Array()");       
        Массив             = Скрипт.eval("Массив");       
        Скрипт.eval("Массив[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
        Скрипт.eval("Массив[0].Name     = 'Hidden'");
        Скрипт.eval("Массив[0].Value = true");
       
        Скрипт.AddCode("function SetItem(ind,val){Массив[ind]=val}");       
        Скрипт.AddObject("ServiceManager",ServiceManager);
        Desktop         = ServiceManager.createInstance("com.sun.star.frame.Desktop");       
        Document         = Desktop.LoadComponentFromURL("file:///" + ПолноеИмяФайлаXLS, "_blank", 0, Массив);
       
        //Сохранение в PDF встроенными средствами OpenOffice
#Если Клиент Тогда           
        Состояние("Запись в PDF...");
#КонецЕсли
        Скрипт.eval("Массив2=new Array()");       
        Массив2     = Скрипт.eval("Массив2");       
        Скрипт.eval("Массив2[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");       
        Скрипт.eval("Массив2[0].Name  = 'FilterName'");
        Скрипт.eval("Массив2[0].Value = 'writer_pdf_Export'");
       
        ПолноеИмяФайлаPDF         = "file:///" + СтрЗаменить(ПолноеИмяФайлаXLS, РасширениеXSL, РасширениеPDF);
        ПолноеИмяФайлаPDF         = СтрЗаменить(ПолноеИмяФайлаPDF, ВРег(РасширениеXSL), РасширениеPDF);
        ПолноеИмяФайлаPDF        = СтрЗаменить(ПолноеИмяФайлаPDF, "\", "/");       
               
        Document.storeToURL(ПолноеИмяФайлаPDF, Массив2);
        Document.close(-1);        //Закрыть документ
       
        //Контрольная очистка переменных
        Document     = Неопределено;
        Desktop     = Неопределено;
       
        //Удаление временного файла
#Если Клиент Тогда           
        Состояние("Удаление временного файла...");
#КонецЕсли       
        Попытка
            УдалитьФайлы(ПолноеИмяФайлаXLS);
        Исключение
#Если Клиент Тогда           
            Сообщить("Произошла ошибка при удалении временного файла. Возможно, потребуется удалить его вручную." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
        КонецПопытки;
       
        ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "file:///", "");
        ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "/", "\");
#Если Клиент Тогда
        Состояние("Выгрузка выполнена.");
        Предупреждение("Выгрузка выполнена." + Символы.ПС + ПолноеИмяФайлаPDF);       
#КонецЕсли
        Возврат ПолноеИмяФайлаPDF;
    Исключение
        Document.close(-1);
#Если Клиент Тогда
        Предупреждение(ОписаниеОшибки());
#КонецЕсли
        Возврат 0;
    КонецПопытки   
КонецФункции


См. также

Подписаться Добавить вознаграждение

Комментарии

1. Трактор Трактор (Трактор) 08.10.10 15:54
Баян.

Вместо конструкции
        Скрипт             = Новый COMОбъект("MSScriptControl.ScriptControl");
        Скрипт.language    = "javascript";
        Скрипт.AddObject("OpenOffice", ServiceManager);
        Скрипт.eval("Массив=new Array()");        
        Массив             = Скрипт.eval("Массив");
...Показать Скрыть

Можно написать так
Массив = Новый COMSafeArray("VT_VARIANT", 1);

Тут подробнее http://infostart.ru/public/20710/
2. k k (cool.dkf) 08.10.10 17:37
Через yoksel же проще. ...вот кто бы переделал косячный механизм конвертирования в xls...особенно рисунков...
3. halushka (halushka) 09.10.10 07:30
Может через Ёксель и проще передавать, но через ПДФ всяко проще получать.
Плюс за вариант с опенофисом. Чтот в эту сторону я не думал..
4. Ольга Ольгина (dyolga) 01.11.10 00:06
А куда вставить эту функцию, например если я хочу сохранить из 1С счет со вставленной печатью(как рисунок) в формат PDF и отправить клиенту? Буду очень благодарна за подсказку.
5. Виктор Баринов (doom_2001) 01.11.10 13:45
Вставлять рекомендую в место, где у Вас формируется табличный документ, т.к. он является первым обязательным параметром функции.
В общем варианте можно вставить в модуль объекта обработки с атрибутом "Экспорт", тогда можно будет использовать из любого места обработки.

Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа