1С 8.3 Сборка/разборка PDF с помощью pdftk server - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Сборка/разборка PDF с помощью pdftk server

К статье можно скачать обработку Сборка и разборка PDF через PDFtk
Работа с PDF через https://www.pdflabs.com/tools/pdftk-server/ из 1С 8.3: (Автор: krаs01)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   ПортированнаяВерсия = Истина;
   ИмяСтраницы = "page";
КонецПроцедуры

&НаКлиенте
Функция ШаблонКоманды(Действие)

   Если Действие = "ИнформацияОФайле" Тогда
       Возврат """[ИмяКаталогаПрограммы]pdftk.exe"" ""[ИмяФайлаОбработки]"" dump_data output ""[ИмяФайлаРезультата]""";
   ИначеЕсли Действие = "РазделитьФайл" Тогда
       Возврат """[ИмяКаталогаПрограммы]pdftk.exe"" ""[ИмяФайлаОбработки]"" burst output ""[ИмяФайлаРезультата]""";
   ИначеЕсли Действие = "СобратьФайл" Тогда
       Возврат """[ИмяКаталогаПрограммы]pdftk.exe"" ""[ИмяФайлаОбработки]"" cat output ""[ИмяФайлаРезультата]""";
   КонецЕсли;

КонецФункции // ШаблонКоманды()


&НаКлиенте
Процедура Разделить(Команда)

   ФайлОбработки = Новый Файл(ИмяФайлаДляРазделения);
   Если НЕ ФайлОбработки.Существует() Тогда
       ПоказатьПредупреждение(, "Нет файла");
       Возврат;
   КонецЕсли;

   КоличествоСтраниц = 0;
   ИмяКаталогаПрограммы = """C:\Program Files (x86)\PDFtk Server\bin\";
   Если ПортированнаяВерсия Тогда
       ИмяКаталогаПрограммы = СтрЗаменить(КаталогВременныхФайлов() + "\", "\\", "\") + "PDFtk\";
       ДанныеАрхива = ДвоичныеДанныеМакетаНаСервере("АрхивПрограммы");
       ИмяФайлаАрхива = ИмяКаталогаПрограммы + "Arc.zip";
       ДанныеАрхива.Записать(ИмяФайлаАрхива);
       ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайлаАрхива);
       ЧтениеZip.ИзвлечьВсе(ИмяКаталогаПрограммы);
       ЧтениеZip.Закрыть();
   КонецЕсли;

   Скрипт = Новый COMОбъект("WScript.Shell");
   ДанныеОкружения = Скрипт.Environment("Process");
   КаталогРаботы = ДанныеОкружения.Item("TEMP");

   //Результаты обработки ведутся в валидном каталоге системы (т.е. без русских букв)
   //КаталогРаботы = СтрЗаменить(КаталогВременныхФайлов() + "\", "\\", "\") + "PDFtk_work\";
   КаталогРаботы = СтрЗаменить(КаталогРаботы + "\", "\\", "\") + "PDFtk_work\";
   СоздатьКаталог(КаталогРаботы);
   РабочееИмяФайлаОбработки = КаталогРаботы + "source.pdf";
   КопироватьФайл(ФайлОбработки.ПолноеИмя, РабочееИмяФайлаОбработки);

   КаталогОбмена = ФайлОбработки.Путь;
   Если ЗначениеЗаполнено(КаталогРезультата) Тогда
       КаталогОбмена = КаталогРезультата;
   КонецЕсли;
   КаталогОбмена = СтрЗаменить(КаталогОбмена + "\", "\\", "\");

   ИмяФайлаИнфо = КаталогРаботы + "InfPDF.txt";

   Команда = ШаблонКоманды("ИнформацияОФайле");
   Команда = СтрЗаменить(Команда, "[ИмяКаталогаПрограммы]", ИмяКаталогаПрограммы);
   Команда = СтрЗаменить(Команда, "[ИмяФайлаОбработки]", РабочееИмяФайлаОбработки);
   Команда = СтрЗаменить(Команда, "[ИмяФайлаРезультата]", ИмяФайлаИнфо);

   Скрипт.Run(Команда, 0, 1);

   ФайлИнформации = Новый ЧтениеТекста(ИмяФайлаИнфо);
   СтрокаИнформации = ФайлИнформации.ПрочитатьСтроку();
   Пока СтрокаИнформации <> Неопределено Цикл
       Если СтрНайти(СтрокаИнформации, "NumberOfPages:") > 0 Тогда
           КоличествоСтраниц = Число(СокрЛП(СтрЗаменить(СтрокаИнформации, "NumberOfPages:", "")));
           Прервать;
       КонецЕсли;

       СтрокаИнформации = ФайлИнформации.ПрочитатьСтроку();
   КонецЦикла;
   ФайлИнформации.Закрыть();

   Если КоличествоСтраниц > 0 Тогда
       ШаблонИмениСтраницы = "page_";
       Если НЕ ПустаяСтрока(ИмяСтраницы) Тогда
           ШаблонИмениСтраницы = ИмяСтраницы + "_";
       КонецЕсли;

       ШаблонИмениСтраницы = ШаблонИмениСтраницы + "%04d.pdf";

       Команда = ШаблонКоманды("РазделитьФайл");
       Команда = СтрЗаменить(Команда, "[ИмяКаталогаПрограммы]", ИмяКаталогаПрограммы);
       Команда = СтрЗаменить(Команда, "[ИмяФайлаОбработки]", РабочееИмяФайлаОбработки);
       Команда = СтрЗаменить(Команда, "[ИмяФайлаРезультата]", КаталогРаботы + ШаблонИмениСтраницы);

       Скрипт.Run(Команда, 0, 1);

       УдалитьФайлы(РабочееИмяФайлаОбработки);

       МассивФайлов = НайтиФайлы(КаталогРаботы, "*.pdf");
       Для Каждого Файл Из МассивФайлов Цикл
           ПереместитьФайл(Файл.ПолноеИмя, КаталогОбмена + Файл.Имя);
       КонецЦикла;
   КонецЕсли;

   Если ПортированнаяВерсия Тогда
       УдалитьФайлы(ИмяКаталогаПрограммы);
   КонецЕсли;

   УдалитьФайлы(КаталогРаботы);
   Сообщить("Создано файлов страниц: " + Строка(КоличествоСтраниц));

КонецПроцедуры

&НаКлиенте
Процедура Собрать(Команда)

   Если Объект.ДокументыДляСборки.Количество() = 0 Тогда
       ПоказатьПредупреждение(, "Нет файлов");
       Возврат;
   КонецЕсли;

   ИмяКаталогаПрограммы = """C:\Program Files (x86)\PDFtk Server\bin\";
   Если ПортированнаяВерсия Тогда
       ИмяКаталогаПрограммы = СтрЗаменить(КаталогВременныхФайлов() + "\", "\\", "\") + "PDFtk\";
       ДанныеАрхива = ДвоичныеДанныеМакетаНаСервере("АрхивПрограммы");
       ИмяФайлаАрхива = ИмяКаталогаПрограммы + "Arc.zip";
       ДанныеАрхива.Записать(ИмяФайлаАрхива);
       ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайлаАрхива);
       ЧтениеZip.ИзвлечьВсе(ИмяКаталогаПрограммы);
       ЧтениеZip.Закрыть();
   КонецЕсли;

   Скрипт = Новый COMОбъект("WScript.Shell");
   ДанныеОкружения = Скрипт.Environment("Process");
   КаталогРаботы = ДанныеОкружения.Item("TEMP");

   //Результаты обработки ведутся в валидном каталоге системы (т.е. без русских букв)
   //КаталогРаботы = СтрЗаменить(КаталогВременныхФайлов() + "\", "\\", "\") + "PDFtk_work\";
   КаталогРаботы = СтрЗаменить(КаталогРаботы + "\", "\\", "\") + "PDFtk_work\";
   СоздатьКаталог(КаталогРаботы);
   РабочееИмяФайлаОбработки = КаталогРаботы + "out.pdf";
   ПромежутчноеИмяФайлаОбработки = КаталогРаботы + "_out.pdf";

   КаталогОбмена = КаталогРезультата;
   Если НЕ ЗначениеЗаполнено(КаталогОбмена) Тогда
       Файл = Новый Файл(Объект.ДокументыДляСборки[0].ИмяФайла);
       КаталогОбмена = Файл.Путь;
   КонецЕсли;
   КаталогОбмена = СтрЗаменить(КаталогОбмена + "\", "\\", "\");

   Команда = ШаблонКоманды("СобратьФайл");
   Команда = СтрЗаменить(Команда, "[ИмяКаталогаПрограммы]", ИмяКаталогаПрограммы);
   Команда = СтрЗаменить(Команда, "[ИмяФайлаОбработки]", ПромежутчноеИмяФайлаОбработки + """ """ + КаталогРаботы + "add.pdf");
   Команда = СтрЗаменить(Команда, "[ИмяФайлаРезультата]", РабочееИмяФайлаОбработки);

   Первая = Истина;
   Для Каждого СтрокаФайла Из Объект.ДокументыДляСборки Цикл

       Если Первая Тогда
           КопироватьФайл(СтрокаФайла.ИмяФайла, ПромежутчноеИмяФайлаОбработки);
           Первая = Ложь;
           Продолжить;
       КонецЕсли;

       КопироватьФайл(СтрокаФайла.ИмяФайла, КаталогРаботы + "add.pdf");
       Скрипт.Run(Команда, 0, 1);

       ПереместитьФайл(РабочееИмяФайлаОбработки, ПромежутчноеИмяФайлаОбработки);

   КонецЦикла;
   ПереместитьФайл(ПромежутчноеИмяФайлаОбработки, КаталогОбмена + "result.pdf");

   Если ПортированнаяВерсия Тогда
       УдалитьФайлы(ИмяКаталогаПрограммы);
   КонецЕсли;

   УдалитьФайлы(КаталогРаботы);

   Сообщить("Собрано файлов: " + Строка(Объект.ДокументыДляСборки.Количество()));

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПрограмму(Команда)

   ИмяФайла = ПолучитьИмяВременногоФайла("exe");
   ДанныеФайла = ДвоичныеДанныеМакетаНаСервере("ДистрибутивПрограммы");
   ДанныеФайла.Записать(ИмяФайла);

   КомандаСистемы(ИмяФайла);

КонецПроцедуры

&НаСервере
Функция ДвоичныеДанныеМакетаНаСервере(ИмяМакета)

   ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
   Возврат ОбработкаОбъект.ПолучитьМакет(ИмяМакета);

КонецФункции // ДвоичныеДанныеМакета()

&НаКлиенте
Процедура ИмяФайлаДляРазделенияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

   СтандартнаяОбработка = Ложь;
   ВыборФайлаРазборки = Истина;
   ОткрытьДиалогВыбораФайлов();

КонецПроцедуры


&НаКлиенте
Процедура ИмяФайлаСборкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

   СтандартнаяОбработка = Ложь;
   ВыборФайлаРазборки = Ложь;
   ОткрытьДиалогВыбораФайлов();

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьДиалогВыбораФайлов()

   ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

   ДиалогВыбора.Заголовок                   = "Выберите файл для загрузки данных";
   ДиалогВыбора.ПредварительныйПросмотр     = Ложь;
   ДиалогВыбора.МножественныйВыбор          = НЕ ВыборФайлаРазборки;
   ДиалогВыбора.ИндексФильтра               = 0;
   ДиалогВыбора.ПолноеИмяФайла              = ИмяФайлаДляРазделения;
   ДиалогВыбора.ПроверятьСуществованиеФайла = Ложь;

   ФорматФайла = "pdf";

   Фильтр = НСтр("ru = 'Файлы " + ФорматФайла + "     |*." + ФорматФайла + "'");
   ДиалогВыбора.Фильтр = Фильтр;

   ДиалогВыбора.Показать(Новый ОписаниеОповещения("ИмяФайлаНачалоВыбораЗавершение", ЭтотОбъект, Новый Структура("ДиалогВыбора", ДиалогВыбора)));

КонецПроцедуры // ОткрытьДиалогВыбораФайлов()


&НаКлиенте
Процедура ИмяФайлаНачалоВыбораЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

   ДиалогВыбора = ДополнительныеПараметры.ДиалогВыбора;

   Если (ВыбранныеФайлы <> Неопределено) Тогда
       Если ВыборФайлаРазборки Тогда
           ИмяФайлаДляРазделения = ДиалогВыбора.ПолноеИмяФайла;
       Иначе
           Первая = Истина;
           Для Каждого ЭлементВыбора Из ДиалогВыбора.ВыбранныеФайлы Цикл
               Если Первая Тогда
                   ТекущиеДанные = Элементы.ДокументыДляСборки.ТекущиеДанные;
               Иначе
                   ТекущиеДанные = Объект.ДокументыДляСборки.Добавить();
               КонецЕсли;
               Первая = Ложь;
               ТекущиеДанные.ИмяФайла = ЭлементВыбора;
           КонецЦикла;
       КонецЕсли;
   КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КаталогРезультатаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    #Если НЕ ВебКлиент Тогда
       Режим = РежимДиалогаВыбораФайла.ВыборКаталога;

       ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);

       ДиалогОткрытияФайла.Каталог = КаталогРезультата;
       ДиалогОткрытияФайла.ПолноеИмяФайла = "";
       Фильтр = НСтр("ru = 'Все файлы(*.*)     |*.*'");
       ДиалогОткрытияФайла.Фильтр = Фильтр;
       ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
       ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'");
       Если ДиалогОткрытияФайла.Выбрать() Тогда
           КаталогРезультата = ДиалогОткрытияФайла.Каталог;
       КонецЕсли;

       СтандартнаяОбработка = Ложь;
    #КонецЕсли

КонецПроцедуры
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 21.05.2018
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому