Количество и формат страниц прикрепленного к документу PDF

21.06.23

Задачи пользователя - Адаптация типовых решений

Есть много подобных статей, но когда передо мной встала данная задача, я потратил немало времени на поиск нужных источников информации. В этой статье написано решение с самого начала, до появления свойств количества страниц и их формата (в одном файле могут быть листы разного размера) как у старых PDF, так и вновь добавленных. Использована конфигурация Appius-PLM.

Скачать исходный код

Наименование Файл Версия Размер
Обработка из пункта 4
.epf 6,85Kb
0
.epf 6,85Kb Скачать
Код из пункта 3
.epf 6,39Kb
0
.epf 6,39Kb Скачать

  Для решение данной задачи необходимо выполнить 4 этапа:

  1. Загрузить и установить Adobe Acrobat (в моём случае была установлена XI версия)
  2. Установить и зарегистрировать V83.ComConnector
  3. Добавить код для новых файлов в Справочник, хранящий PDF документы
  4. Запустить обработку для сбора и записи свойств уже хранящихся 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 файла!

В типовых конфигурациях будут отличаться названия справочника и часть с параметрами не понадобится, но в целом данный способ рабочий.

Надеюсь, кто-то, кто столкнется с такой задачей, облегчит себе жизнь и освободит несколько часов своего времени.

PDF количество страниц формат PLM документы свойства ComConnector V83.ComConnector

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4741    10    5    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3162    4    0    

20

Каждому менеджеру нужен свой Excel

Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    3923    dimanich70    11    

14

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1870    dimanich70    8    

14

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    2156    19    avmartynov    14    

44

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2326    28    progmaster    8    

3
Оставьте свое сообщение