В конфигурациях 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 в один.