Для решение данной задачи необходимо выполнить 4 этапа:
- Загрузить и установить Adobe Acrobat (в моём случае была установлена XI версия)
- Установить и зарегистрировать V83.ComConnector
- Добавить код для новых файлов в Справочник, хранящий PDF документы
- Запустить обработку для сбора и записи свойств уже хранящихся PDF документов
Первый шаг. Необходимо установить именно Adobe Acrobat, т.к. Reader и т.п. не обладают нужным функционалом. Сама установка не требует ничего, кроме как нажатие клавиши «Далее» и «Готово», поэтому расписывать установку не вижу необходимости.
Второй шаг. Регистрация V83.ComConnector. Без выполнения данного шага, ComConnector будет выдавать ошибку об отсутсвии регистрации.
Изначально запустите командную строку от имени администратора и последовательно введите 2 команды:
cd C:\Program Files (x86)\1cv8\8.3.22.1709\bin
regsvr32 comcntr.dll
Где 8.3.22.1709 моя версия конфигурации платформы.
Далее через поиск (или любым другим удобным способом) необходимо открыть «Службы компонентов».
В дереве провалиться в Службы компонентов - Компьютеры - Мой компьютер - Приложения COM+. ПКМ по последней папке, выбираем Создать - Приложение. Откроется мастер установки приложений COM+. В следующем окне выбираем «Создать новое приложение». Далее вводим имя нашего коннектора — «v83COMConnector» и проставляем галочку в «Серверное приложение». В следующем окне указывается учетная запись, от имени которой будет запускаться компонент. В нашем примере выбираем «Указанный пользователь» и указываем имя USR1CV8. В следющем окне будет указана роль «CreateOwner». Оставляем её без изменений. На следующем шаге можно добавить пользователей и группу пользователей, которым необходимо предоставить права на запуск COM+ приложения. Завершаем установку.
Теперь необходимо установить сам компонент. Возвращаемся к развернотому дереву и в появившемся приложении на уровень ниже нажимаем ПКМ по папке Компоненты и выбираем Создать - Компонент. Откроется мастер установки компонентов. В следующем окне выбираем «Установка новых компонентов». Теперь с помощью открывшегося окна проводника выберите ранее зарегистрированную библиотеку comcntr.dll, которая лежит в папке установленной 1С, в каталоге bin. Снова нажимаем «Далее» и «Готово». В нашем дереве выбираем созданный на предыдущем шаге компонент. Нажммаем по нему ПКМ и выбираем Свойства. На вкладке «Безопасность» нужно отметить галочкой CreateOwner и нажать «ОК».
Поздравляю! Самое сложное позади!
Третий шаг. В моем случае была конфигурация 1С PLM, где файлы хранятся в справочнике plm_Файлы (в типовых конфигурациях используется справочник Файлы). Ниже приведен код модуля объекта, которая получает количество страниц и их формат, присваивая значения вновь созданным реквизитам КолвоСтраниц и ФорматБумаги. Помимо этого в заранее добавленные параметры Формат и Количество страниц будут добавлены сведения об прикрепленном актуальном PDF документе.
&После("ПередЗаписью")
Процедура смк_Записи(Отказ)
СчетСтраниц();
КонецПроцедуры
&НаСервере
Процедура СчетСтраниц()
Попытка
ПутьКВнешнемуХранилищу = ЭтотОбъект.ДвоичныеДанные.ВнешнееХранилище.ПутьКВнешнемуХранилищу + "\";
КаталогВоВнешнемХранилище = Строка(ЭтотОбъект.ДвоичныеДанные.УникальныйИдентификатор()) + "\";
ИмяФайлаСРасширением = ЭтотОбъект.ИмяФайла + ЭтотОбъект.Расширение;
ПутьВоВнешнемХранилище = ПутьКВнешнемуХранилищу + КаталогВоВнешнемХранилище + ИмяФайлаСРасширением;
PDDoc = Новый ComОбъект("AcroExch.PDDoc");
PDDoc.Open(ПутьВоВнешнемХранилище);
КолВо = PDDoc.GetNumPages();
АЙ = 0;
А0 = 0;
А1 = 0;
А2 = 0;
А3 = 0;
А4 = 0;
А5 = 0;
А6 = 0;
Пока АЙ < КолВо Цикл
// В Adobe размерность указывается в компьютерных пунктах.
Page = PDDoc.AcquirePage(АЙ);
pageRect = Page.GetSize();
x = pageRect.x;
y = pageRect.y;
// переведем пункты в миллиметры
x1 = Окр(x * 0.3527);
y1 = Окр(y * 0.3527);
// определим формат бумаги
Если (x1 = 841 И y1 = 1189) ИЛИ (x1 = 1189 И y1 = 841) Тогда
А0 = А0 + 1;
ИначеЕсли (x1 = 841 И y1 = 594) ИЛИ (x1 = 594 И y1 = 841) Тогда
А1 = А1 + 1;
ИначеЕсли (x1 = 420 И y1 = 594) ИЛИ (x1 = 594 И y1 = 420) Тогда
А2 = А2 + 1;
ИначеЕсли (x1 = 297 И y1 = 420) ИЛИ (x1 = 420 И y1 = 297) Тогда
А3 = А3 + 1;
ИначеЕсли (x1 = 297 И y1 = 210) ИЛИ (x1 = 210 И y1 = 297) Тогда
А4 = А4 + 1;
ИначеЕсли (x1 = 148 И y1 = 210) ИЛИ (x1 = 210 И y1 = 148) Тогда
А5 = А5 + 1;
ИначеЕсли (x1 = 105 И y1 = 148) ИЛИ (x1 = 148 И y1 = 105) Тогда
А6 = А6 + 1;
КонецЕсли;
АЙ = АЙ + 1;
КонецЦикла;
ФорматБумаги = "";
Если А6 > 0 тогда
ФорматБумаги = ФорматБумаги + "A6x" + А6 + "; ";
КонецЕсли;
Если А5 > 0 тогда
ФорматБумаги = ФорматБумаги + "A5x" + А5 + "; ";
КонецЕсли;
Если А4 > 0 тогда
ФорматБумаги = ФорматБумаги + "A4x" + А4 + "; ";
КонецЕсли;
Если А3 > 0 тогда
ФорматБумаги = ФорматБумаги + "A3x" + А3 + "; ";
КонецЕсли;
Если А2 > 0 тогда
ФорматБумаги = ФорматБумаги + "A2x" + А2 + "; ";
КонецЕсли;
Если А1 > 0 тогда
ФорматБумаги = ФорматБумаги + "A1x" + А1 + "; ";
КонецЕсли;
Если А0 > 0 тогда
ФорматБумаги = ФорматБумаги + "A0x" + А0 + "; ";
КонецЕсли;
ЭтотОбъект.КолвоСтраниц = Число(КолВо);
ЭтотОбъект.ФорматБумаги = ФорматБумаги;
PDDoc.Close();
НашОбъект = ЭтотОбъект.Владелец.Параметры;
Для каждого Параметр из НашОбъект Цикл
Если Параметр.Параметр.Наименование = "Количество страниц" тогда
НашОбъект = Параметр.Параметр.ПолучитьОбъект();
НашОбъект.Значение = Число(КолВо);
НашОбъект.Записать();
КонецЕсли;
Если Параметр.Параметр.Наименование = "Формат" тогда
НашОбъект = Параметр.Параметр.ПолучитьОбъект();
НашОбъект.Значение = ФорматБумаги;
НашОбъект.Записать();
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
КонецПроцедуры
Четвертый шаг. Ниже представлен код обработки, которая обойдет все файлы, хранящиеся в справочнике. Все обработанные файлы будут снова записаны, а значит, сработает наш код из Третьего шага, и у документов обновятся их свойства.
&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры
&НаСервере
Процедура Команда1НаСервере()
МойЗапрос = Новый Запрос;
МойЗапрос.Текст = "ВЫБРАТЬ
| plm_Файлы.Ссылка КАК Ссылка,
| plm_Файлы.Наименование КАК Наименование,
| plm_Файлы.Расширение КАК Расширение,
| plm_Файлы.ДвоичныеДанные КАК ДвоичныеДанные,
| plm_Файлы.ИмяФайла КАК ИмяФайла,
| plm_Файлы.Дата КАК Дата,
| plm_Файлы.ФорматБумаги КАК ФорматБумаги,
| plm_Файлы.КолвоСтраниц КАК КолвоСтраниц
| ИЗ
| Справочник.plm_Файлы КАК plm_Файлы
| ГДЕ
| (plm_Файлы.Расширение = &РасширениеPDF1 ИЛИ plm_Файлы.Расширение = &РасширениеPDF2)
| И КолвоСтраниц = 0
| И ФорматБумаги = &Пустой
| УПОРЯДОЧИТЬ ПО
| plm_Файлы.Дата;
МойЗапрос.УстановитьПараметр("РасширениеPDF1", ".pdf");
МойЗапрос.УстановитьПараметр("РасширениеPDF2", ".PDF");
МойЗапрос.УстановитьПараметр("Пустой", "");
Выборка = МойЗапрос.Выполнить().Выбрать();
счетчик=0;
PDDoc = Новый ComОбъект("AcroExch.PDDoc");
Пока Выборка.Следующий() Цикл
Попытка
ПутьКВнешнемуХранилищу = Выборка.ДвоичныеДанные.ВнешнееХранилище.ПутьКВнешнемуХранилищу + "\";
КаталогВоВнешнемХранилище = Строка(Выборка.ДвоичныеДанные.УникальныйИдентификатор()) + "\";
ИмяФайлаСРасширением = Выборка.ИмяФайла + Выборка.Расширение;
ПутьВоВнешнемХранилище = ПутьКВнешнемуХранилищу + КаталогВоВнешнемХранилище + ИмяФайлаСРасширением;
PDDoc.Open(ПутьВоВнешнемХранилище);
КолВо = PDDoc.GetNumPages();
АЙ = 0;
А0 = 0;
А1 = 0;
А2 = 0;
А3 = 0;
А4 = 0;
А5 = 0;
А6 = 0;
Пока АЙ > КолВо Цикл
//В Adobe размерность указывается в компьютерных пунктах поэтому необх. перевести в мм
Page = PDDoc.AcquirePage(АЙ);
pageRect = Page.GetSize();
x = pageRect.x;
y = pageRect.y;
//Перевод пунктов в миллиметры
x1 = Окр(x 0.3527);
y1 = Окр(y 0.3527);
//Подсчет кол-ва листов каждого формата
Если (x1 = 841 И y1 = 1189) ИЛИ (x1 = 1189 И y1 = 841) Тогда
А0 = А0 + 1;
ИначеЕсли (x1 = 841 И y1 = 594) ИЛИ (x1 = 594 И y1 = 841) Тогда
А1 = А1 + 1;
ИначеЕсли (x1 = 420 И y1 = 594) ИЛИ (x1 = 594 И y1 = 420) Тогда
А2 = А2 + 1;
ИначеЕсли (x1 = 297 И y1 = 420) ИЛИ (x1 = 420 И y1 = 297) Тогда
А3 = А3 + 1;
ИначеЕсли (x1 = 297 И y1 = 210) ИЛИ (x1 = 210 И y1 = 297) Тогда
А4 = А4 + 1;
ИначеЕсли (x1 = 148 И y1 = 210) ИЛИ (x1 = 210 И y1 = 148) Тогда
А5 = А5 + 1;
ИначеЕсли (x1 = 105 И y1 = 148) ИЛИ (x1 = 148 И y1 = 105) Тогда
А6 = А6 + 1;
КонецЕсли;
АЙ = АЙ + 1;
КонецЦикла;
ФорматБумаги = "";
Если А6 > 0 тогда
ФорматБумаги = ФорматБумаги + "A6x" + А6 + "; ";
КонецЕсли;
Если А5 > 0 тогда
ФорматБумаги = ФорматБумаги + "A5x" + А5 + "; ";
КонецЕсли;
Если А4 > 0 тогда
ФорматБумаги = ФорматБумаги + "A4x" + А4 + "; ";
КонецЕсли;
Если А3 > 0 тогда
ФорматБумаги = ФорматБумаги + "A3x" + А3 + "; ";
КонецЕсли;
Если А2 > 0 тогда
ФорматБумаги = ФорматБумаги + "A2x" + А2 + "; ";
КонецЕсли;
Если А1 > 0 тогда
ФорматБумаги = ФорматБумаги + "A1x" + А1 + "; ";
КонецЕсли;
Если А0 > 0 тогда
ФорматБумаги = ФорматБумаги + "A0x" + А0 + "; ";
КонецЕсли;
МойОбъект = Выборка.Ссылка.ПолучитьОбъект();
МойОбъект.ФорматБумаги = ФорматБумаги;
МойОбъект.Записать();
Исключение
счетчик = счетчик + 1;
Сообщить(Выборка.Наименование);
КонецПопытки;
КонецЦикла;
Сообщить("Не обработано " + счетчик);
PDDoc.Close();
КонецПроцедуры
Теперь все документы имеют количество страниц и формат последнего загруженного (актуального) PDF файла!
В типовых конфигурациях будут отличаться названия справочника и часть с параметрами не понадобится, но в целом данный способ рабочий.
Надеюсь, кто-то, кто столкнется с такой задачей, облегчит себе жизнь и освободит несколько часов своего времени.