Как объединить несколько PDF-файлов и распечатать их из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При пакетной печати комплектов документов (например, накладных, счетов-фактур, спецификаций или сертификатов качества) разработчики часто сталкиваются с аппаратными ограничениями оборудования. Если отправлять каждый отдельный PDF-файл в спулер операционной системы отдельным заданием, принтер начинает зависать, буфер переполняется, а паузы между заданиями приводят к существенным задержкам. Оптимальный выход из такой ситуации — предварительно объединить все сформированные PDF-файлы в один общий многостраничный документ и отправить его на физическое устройство единым заданием печати. Разберем по шагам, как решить эту задачу в 1С с помощью утилит Bullzip, специализированных консольных инструментов и методов платформы.

Склейка файлов с помощью утилиты mergepdf

В состав виртуального принтера Bullzip входит консольная утилита mergepdf.exe, предназначенная для объединения нескольких входящих документов в один результирующий файл. Синтаксис вызова утилиты требует указания пути к выходному файлу через параметр output и перечисления всех исходных файлов через вертикальную черту в параметре input.

Рассмотрим структуру команды для командной строки:


"C:\Program Files\Bullzip\PDF Printer\mergepdf.exe" output="C:\Temp\Result.pdf" input="C:\Temp\Doc1.pdf|C:\Temp\Doc2.pdf|C:\Temp\Doc3.pdf"

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

Проблема путей с русскими буквами и пути ее решения

При практическом использовании утилиты mergepdf возникает распространенная ошибка: если путь к файлам содержит кириллические символы или пробелы, на выходе формируется пустой или поврежденный PDF-документ. Причина заключается в том, что консольные утилиты часто некорректно обрабатывают системные кодировки строк ANSI/Windows-1251, передаваемые из сеанса Windows-приложения.

Проанализируем два надежных способа обхода этой проблемы:

  1. Использование коротких путей формата 8.3 (DOS-пути). Операционная система Windows поддерживает короткие псевдонимы путей к файлам и папкам, в которых кириллица и длинные имена автоматически заменяются символами латиницы (например, PROGRA~1). Получить такой путь в 1С можно через стандартный системный объект Scripting.FileSystemObject.
  2. Копирование файлов во временный каталог с латинскими именами. Перед объединением файлы временно выгружаются в каталог с гарантированно латинским путем (например, через КаталогВременныхФайлов()), объединяются, а затем временные копии удаляются с диска.

Посмотрим на пример преобразования длинного пути с кириллицей в короткий DOS-формат:


ФСО = Новый COMОбъект("Scripting.FileSystemObject");
Файл = ФСО.GetFile(ДлинныйКириллическийПуть);
КороткийПуть = Файл.ShortPath;

Альтернативные консольные утилиты для склейки PDF

Если развертывание компонентов Bullzip на рабочих местах пользователей или сервере вызывает сложности, рассмотрим альтернативные легковесные консольные инструменты, доказавшие стабильность при работе из 1С:

  1. PDFtk (PDF Toolkit). Популярная кроссплатформенная утилита для манипуляций с PDF. Синтаксис вызова: pdftk.exe input1.pdf input2.pdf cat output result.pdf.
  2. QPDF. Быстрая утилита с открытым исходным кодом, которая нативно поддерживает работу с кодировкой UTF-8 и не сбоит при наличии кириллицы в путях: qpdf.exe --empty --pages file1.pdf file2.pdf -- result.pdf.
  3. Ghostscript. Мощный интерпретатор PostScript и PDF. Позволяет сшивать файлы командой: gswin64c.exe -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=result.pdf -dBATCH file1.pdf file2.pdf.

Управление настройками Bullzip через COM-интерфейс

Помимо запуска исполняемых файлов, виртуальный принтер Bullzip предоставляет собственный программный интерфейс для автоматизации процесса создания документов через COM-объект Bullzip.PDFPrinterSettings. Это позволяет динамически задавать свойства печати без вывода диалоговых окон пользователю.

Разберем пример программной настройки параметров виртуального принтера:


НастройкиBullzip = Новый COMОбъект("Bullzip.PDFPrinterSettings");
НастройкиBullzip.SetValue("Output", "C:\Temp\Combined.pdf");
НастройкиBullzip.SetValue("ShowSaveAS", "never");
НастройкиBullzip.SetValue("ShowSettings", "never");
НастройкиBullzip.SetValue("ShowPDF", "no");
НастройкиBullzip.SetValue("ConfirmOverwrite", "no");
// Параметр MergeFile позволяет указать существующий файл для добавления новых страниц
НастройкиBullzip.SetValue("MergeFile", "C:\Temp\ExistingFile.pdf");
НастройкиBullzip.WriteSettings(Истина);

Важное ограничение: объект Bullzip.PDFPrinterSettings управляет формированием PDF-файла в файловой системе, но сам по себе виртуальный принтер не может отправить итоговый бинарный PDF на реальный физический принтер для печати на бумаге.

Отправка итогового PDF-файла на физический принтер

В платформе 1С:Предприятие нет штатной команды для прямой тихой передачи готового PDF-файла в спулер Windows без открытия внешних окон. Для реализации финального шага — вывода полученного общего документа на печать — применяются внешние обработчики:

  1. Использование SumatraPDF (рекомендуемый подход). Это бесплатная и быстрая программа просмотра, поддерживающая полностью фоновую печать без зависания процессов в памяти:
    
    КомандаПечати = СтрШаблон("SumatraPDF.exe -print-to ""%1"" -silent ""%2""", ИмяПринтера, ПутьКФайлу);
    ЗапуститьПриложение(КомандаПечати, , Истина);
    
    Для печати на принтер по умолчанию используется параметр -print-to-default.
  2. Утилита PDFtoPrinter. Специализированная консольная утилита, созданная именно для тихой отправки документов в очередь Windows: PDFtoPrinter.exe "ПутьКФайлу.pdf" "ИмяПринтера".
  3. Adobe Acrobat Reader. Запуск с ключом AcroRd32.exe /t "Путь" "Принтер". Следует учитывать, что процесс AcroRd32.exe часто остается висеть в диспетчере задач Windows после отправки задания, что требует его принудительного завершения.

Итоговый комплексный пример решения

Объединим подготовку файлов, вызов утилиты объединения и последующую отправку на физический принтер в единую процедуру на языке 1С:


Процедура ОбъединитьИРаспечататьPDF(МассивПутейКФайлам, ИмяВыходногоФайла, ИмяПринтера) Экспорт

    // 1. Формируем строку входящих файлов
    СтрокаВходящихФайлов = "";
    Для Каждого ПутьКФайлу Из МассивПутейКФайлам Цикл
        СтрокаВходящихФайлов = СтрокаВходящихФайлов + ?(ПустаяСтрока(СтрокаВходящихФайлов), "", "|") + ПутьКФайлу;
    КонецЦикла;

    // 2. Вызываем утилиту объединения mergepdf
    ПутьКMergePDF = "C:\Program Files\Bullzip\PDF Printer\mergepdf.exe";
    ПараметрыОбъединения = СтрШаблон("""%1"" output=""%2"" input=""%3""", ПутьКMergePDF, ИмяВыходногоФайла, СтрокаВходящихФайлов);
    
    КодВозврата = 0;
    ЗапуститьПриложение(ПараметрыОбъединения, , Истина, КодВозврата);
    
    Если КодВозврата <> 0 Тогда
        ВызватьИсключение "Ошибка объединения файлов через mergepdf. Код возврата: " + КодВозврата;
    КонецЕсли;

    // 3. Отправляем сформированный документ на печать через SumatraPDF
    ПутьКSumatra = "C:\Program Files\SumatraPDF\SumatraPDF.exe";
    КомандаПечати = СтрШаблон("""%1"" -print-to ""%2"" -silent ""%3""", ПутьКSumatra, ИмяПринтера, ИмяВыходногоФайла);
    
    ЗапуститьПриложение(КомандаПечати, , Истина, КодВозврата);

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

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

← На главную