Штрихкодирование файлов формата PDF (1С "Документооборот КОРП 2.0")

28.04.17

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

Была поставлена задача обеспечить возможность штрихкодирования файлов формата PDF. Цель: проштрихкодировать попадающий в систему документ, который есть только в формате PDF (предоставлен контрагентом, счет на оплату и т.д.)

В конфигурациях 1С (например, "Документооборот") уже есть механизм генерации штрихкода и вставка его в документы распространенных форматов электронных документов. Как же вставить штрихкод в документ, который априори не предназначен для редактирования?

Рассматрев все стороны вопроса (покупка софта с возможностью редактирования файлов PDF, вставка картинки в PDF как бинарный файл), остановились на варианте использования утилит рапрастраняемых бесплатно.

Итак, формат PDF не предназначен для редактирования. Это формат файла для обмена печатными формами документов, который позволяет (в некоторой степени) быть уверенным, что в документ не внесут каких либо изменений. Можно преобразовать PDF в мультистраничный графический формат и графическими утилитами вставить штрихкод. Но в этом случае изменяется формат файла. Другой вариант - картинку штрихкода преобразовать в формат PDF и наложить два файла PDF друг на друга с помощью утилиты PDFtk.

Механизм опробован на конфигурации 1С "Документооборот КОРП 2.0" версии 2.0.19.1

В общем модуле "ШтрихкодированиеСервер" добавить функцию "ВставитьКартинкуВФайлPDF"

В общем модуле "ШтрихкодированиеКлиентСервер.ВставитьШтрихкодСИспользованиемНастроек" для расширения "PDF" вызывать новую функцию "ВставитьКартинкуВФайлPDF"

На сервере необходимо установить пару утилит. ImageMagick и pdftk_server
На момент написания были доступны такие версии:
ImageMagick-7.0.5-4-Q16-x64-static.exe
pdftk_server-2.02-win-setup.exe

Функция ВставитьКартинкуВФайлPDF(Расширение, ДвоичныеДанныеФайла, ДвоичныеДанныеКартинки, ДанныеОПоложении) Экспорт
   ИмяВременногоФайлаPDF = ПолучитьИмяВременногоФайла(Расширение);
    НовыйПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанныеФайла.Записать(ИмяВременногоФайлаPDF);
  
    ИмяВременногоФайлаКартинки = ПолучитьИмяВременногоФайла("JPG");
    ДвоичныеДанныеКартинки.Записать(ИмяВременногоФайлаКартинки);
  
    ПоложениеНаСтранице = ДанныеОПоложении.ПоложениеНаСтранице;
    Гравити = "SouthWest";
  
   Попытка       СмещениеПоГоризонтали = Число(ДанныеОПоложении.СмещениеПоГоризонтали);
   Исключение   СмещениеПоГоризонтали = 0;
   КонецПопытки;
  
   Попытка       СмещениеПоВертикали = Число(ДанныеОПоложении.СмещениеПоВертикали);
   Исключение   СмещениеПоВертикали = 0;
   КонецПопытки;
  
    СмещениеПоГоризонтали = 20 + СмещениеПоГоризонтали;
    СмещениеПоВертикали = 10 + СмещениеПоВертикали;
    Пейдж = "A4-" + Строка(СмещениеПоГоризонтали) + "-" + Строка(СмещениеПоВертикали);
 
   Если ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыРасположенияШтрихкода.ПравыйНижний") Тогда
       Гравити = "SouthEast";
   ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыРасположенияШтрихкода.ПравыйВерхний") Тогда
       Гравити = "NorthEast";
   ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыРасположенияШтрихкода.ЛевыйВерхний") Тогда
       Гравити = "NorthWest";
   ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыРасположенияШтрихкода.ЛевыйНижний") Тогда
       Гравити = "SouthWest";
    КонецЕсли;
  
   Попытка
       ИМ = Новый COMОбъект("ImageMagickObject.MagickImage.1");
   Исключение
      ВызватьИсключение(НСтр("ru = 'Не обнаружен ImageMagick'"));
   КонецПопытки;
  
    ФайлPDFtk = Новый Файл("C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe");
   Если НЕ ФайлPDFtk.Существует() Тогда
      ВызватьИсключение(НСтр("ru = 'Не обнаружен PDFtk'"));
   КонецЕсли;
  
    ИМ.Convert(ИмяВременногоФайлаКартинки, "-page", Пейдж, "-gravity", Гравити, ИмяВременногоФайлаКартинки + ".pdf");
  
    СтрКоманда = """C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe"" """
       + ИмяВременногоФайлаPDF + """ multistamp """
       + ИмяВременногоФайлаКартинки + ".pdf"""
       + " output """ + ИмяВременногоФайлаPDF + ".pdf""";
     
    WshShell = Новый COMОбъект("WScript.Shell");
    Процесс = WshShell.Run(СтрКоманда, , Истина);
      
    УдалитьФайлы(ИмяВременногоФайлаPDF);
    УдалитьФайлы(ИмяВременногоФайлаКартинки);
    УдалитьФайлы(ИмяВременногоФайлаКартинки + ".pdf");
  
  Возврат ИмяВременногоФайлаPDF + ".pdf";
КонецФункции

ImageMagick конвертирует картинку в PDF, а PDFtk соединяет два файла PDF в один.

штрихкод картинка вставить pdf документооборот штрихкодирование

См. также

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

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

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

29400 руб.

29.06.2023    4453    9    4    

18

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

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

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

7200 руб.

02.08.2023    2956    4    0    

19

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8822    YA_418728146    6    

141
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. fomix 33 04.05.17 07:47 Сейчас в теме
А пример получившегося pdf документа можно в студию?
4. Goody 128 04.05.17 11:36 Сейчас в теме
2. kolya_tlt 86 04.05.17 08:54 Сейчас в теме
в системе же есть функционал добавление ШК в документ. мы на проекте добавили к word документу и сохранили его в pdf. получилось все легче и проще
3. Goody 128 04.05.17 11:19 Сейчас в теме
(2) Ну так это если есть документ формата WORD. А у нас есть моменты, когда исходный документ в PDF. Ситуация с точностью до наоборот же... :-)
5. LynxX 99 05.07.17 08:58 Сейчас в теме
Спасибо за идею !
Используем данный механизм при печати вложенных PDF файлов из Документооборота. Указываем в колонтитулах Имя пользователя, Дату и Время печати при выдаче в производство. Ушли от самонаборных печатей, мастера счастливы!!! Еще раз спасибо!
6. Soft-unity 18.09.17 15:19 Сейчас в теме
Ребята, помогите, пожалуйста. у меня выскакивает ошибка "Не обнаружен ImageMagick". Хотя он установлен, ImageMagickObject.dll зарегистрировал. Версия ImageMagick-7.0.7-2-Q16-x64-static.exe

С этим разобрался, а вот теперь 1С вылетает, никто не сталкивался с таким?)
11. rmarkovych 25 28.03.18 15:05 Сейчас в теме
(6) У меня похожая проблема. Не подскажете, как Вы разобрались и где была проблема?
13. pashamix 02.06.18 12:54 Сейчас в теме
(6)
Ребята, помогите, пожалуйста. у меня выскакивает ошибка "Не обнаружен ImageMagick". Хотя он установлен, ImageMagickObject.dll зарегистрировал. Версия ImageMagick-7.0.7-2-Q16-x64-static.exe

С этим разобрался, а вот теперь 1С вылетает, никто не сталкивался с таким?)


Как именно удалось разобраться? тоже пишет, что не обнаружен ImageMagick.
16. ikalmykia 06.03.20 17:36 Сейчас в теме
(6) А где вы нашли файл ImageMagickObject.dll? В корне установки его нет.
ImageMagick-7.0.5-4-Q16-x64-static.exe или ImageMagick-7.0.5-4-Q16-x64-dll.exe устанавливали?
Для регистрации прописывали в cmd regsvr32 путькфайлу/ImageMagickObject.dll?
18. ikalmykia 06.03.20 18:01 Сейчас в теме
(6)А где вы нашли файл ImageMagickObject.dll? В корне установки его нет.
Для регистрации прописывали в cmd regsvr32 путькфайлу/ImageMagickObject.dll?
7. rmarkovych 25 22.12.17 13:04 Сейчас в теме
Здравствуйте! ДО 2.1.0.28
Вставил функцию, немного подшаманил с кодом, но не работает. Ошибок нет, но и штрихкода тоже...
Может не там, или не то.
Помогите, пожалуйста
ИначеЕсли Расширение = "pdf" Тогда
		ИмяФайла = ВставитьКартинкуВФайлPDF(Расширение,ДвоичныеДанныеФайла, ДвоичныеДанныеИзображения, НастройкиПоложения);
		Результат = Истина;
8. Goody 128 22.12.17 16:48 Сейчас в теме
(7)
ДвоичныеДанныеФайла, ДвоичныеДанныеИзображения

Под отладчиком посмотреть? "Подшаманил" - это может быть все что угодно )))
19. nievinor 06.04.20 10:39 Сейчас в теме
(7) Добрый день. Могли бы вы подсказать как вы добавили печать штампа на pdf? А то сейчас у меня делема как добавить текст и рамку в документ
9. rmarkovych 25 22.12.17 20:13 Сейчас в теме
ДвоичныеДанныеФайла и ДвоичныеДанныеИзображения - не пустое значение. Расширение - pdf. По "подшаманил" я подразумевал не Вашу функцию, а там, где идет проверка на Расширение. Но под отладчиком в Вашу функцию попасть не могу, "проскакиват" ее
10. Goody 128 07.02.18 14:24 Сейчас в теме
включите отладку на сервере.
12. rmarkovych 25 29.03.18 09:50 Сейчас в теме
Всем спасибо. Заработало!
15. rmarkovych 25 22.03.19 09:33 Сейчас в теме
(12) Общем модуле в функции ШтрихкодированиеКлиентСервер после проверки на Расширение = "docx" добавил

ИначеЕсли Расширение = "pdf" Тогда
ИмяФайла = ВставитьКартинкуВФайлPDFСоШтампом(Расширение,ТекстНадписи, ДвоичныеДанныеФайла, ДвоичныеДанныеИзображения, НастройкиПоложения);
ДвоичныеДанныеФайлаЗаполненогоФайла = Новый ДвоичныеДанные(ИмяФайла); 
АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДвоичныеДанныеФайлаЗаполненогоФайла, Объект, "Вставка регистрационного штампа", УникальныйИдентификатор);
Результат = Истина;
17. ikalmykia 06.03.20 17:38 Сейчас в теме
(15) А где вы нашли файл ImageMagickObject.dll? В корне установки его нет.
ImageMagick-7.0.5-4-Q16-x64-static.exe или ImageMagick-7.0.5-4-Q16-x64-dll.exe устанавливали?
Для регистрации прописывали в cmd regsvr32 путькфайлу/ImageMagickObject.dll?
14. pashamix 19.06.18 01:34 Сейчас в теме
Кто подскажет, как через COM из 1С выполнить команды
convert IMG_0001.JPG -gravity NorthWest -splice 53x11 -gravity NorthEast -splice 53x12 IMG_0001.JPG
convert IMG_0001.JPG -gravity North -annotate +0+0 "текст вставки" IMG_0001.JPG

Т.е сделать аналогично этому
ИМ.Convert(ИмяВременногоФайлаКартинки, "-page", Пейдж, "-gravity", Гравити, ИмяВременногоФайлаКартинки + ".pdf");
21. Larkin 396 17.11.20 08:46 Сейчас в теме
Плюсую, но:
1. Для Документооборота функция должна возвращать двоичные данные.
2. Временные файлы не все подчищаются. Остается новый pdf файл.

Еще в многостраничный pdf ШК вставляется на все страницы, но это к багам не отношу ;).

В целом: после небольшого шаманства и выноса переменных путей к софту в настройки получилась вполне рабочая тема.
22. Glebis 13 08.08.23 11:06 Сейчас в теме
Вместо приведения к строке смещения по горизонтали и вертикале рекомендую использовать формат для удаления неразрывного пробела для чисел больше 1000.
Оставьте свое сообщение