При автоматизации документооборота в 1С часто возникает задача защиты передаваемой информации. Стандартное сохранение ТабличныйДокумент в формат PDF создает файл с текстовым слоем, что позволяет любому пользователю легко скопировать данные, цифры или структуру отчета. Чтобы превратить документ в «нередактируемую картинку», сохранив при этом формат PDF, существует несколько подходов. Рассмотрим их подробно, проанализируем преимущества каждого метода и разберем конкретные примеры реализации.
Рассмотрим самый элегантный и надежный способ, который не требует установки виртуальных принтеров или внешних библиотек. Идея заключается в том, чтобы сначала превратить отчет в растровое изображение (картинку), а затем поместить эту картинку в новый документ и сохранить его как PDF. Разберем этот процесс по шагам.
Для начала нам необходимо сохранить исходный ТабличныйДокумент во временный файл в формате PNG или JPG. Платформа 1С поддерживает это нативно через метод Записать(). После этого мы создаем «чистый» документ, вставляем туда наше изображение и сохраняем финальный результат в PDF.
Пример программной реализации:
// 1. Получаем исходный табличный документ (например, из макета)
ТабДок = Новый ТабличныйДокумент;
// ... здесь код заполнения ТабДок ...
// 2. Формируем путь для временного хранения картинки
ИмяВременногоФайлаКартинки = ПолучитьИмяВременногоФайла("png");
ТабДок.Записать(ИмяВременногоФайлаКартинки, ТипФайлаТабличногоДокумента.PNG);
// 3. Создаем новый табличный документ для формирования PDF
ИтоговыйТабДок = Новый ТабличныйДокумент;
ИтоговыйТабДок.ПолеСверху = 0;
ИтоговыйТабДок.ПолеСнизу = 0;
ИтоговыйТабДок.ПолеСлева = 0;
ИтоговыйТабДок.ПолеСправа = 0;
// 4. Добавляем картинку в новый документ
КартинкаОбъект = Новый Картинка(ИмяВременногоФайлаКартинки);
Рисунок = ИтоговыйТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаОбъект;
// Устанавливаем размер рисунка равным размеру страницы (опционально)
Рисунок.Верх = 0;
Рисунок.Лево = 0;
// Здесь можно рассчитать размеры в зависимости от масштаба
Рисунок.Высота = 297; // Пример для A4 в мм
Рисунок.Ширина = 210;
// 5. Сохраняем итоговый документ в PDF
ПутьКPDF = "C:\Temp\Report_ReadOnly.pdf";
ИтоговыйТабДок.Записать(ПутьКPDF, ТипФайлаТабличногоДокумента.PDF);
// Очистка временных файлов
УдалитьФайлы(ИмяВременногоФайлаКартинки);
Проанализируем ситуацию: в итоговом файле текст физически отсутствует как объект. Весь документ представляет собой одну большую фотографию вашего отчета, «обернутую» в контейнер PDF. Это полностью исключает возможность выделения текста мышкой или поиска по документу средствами программ просмотра (Adobe Reader, Chrome и т.д.).
Если задача стоит масштабнее — например, нужно обработать сразу сотни страниц или обеспечить максимально высокое качество сглаживания — целесообразно использовать профессиональные инструменты растрирования. Одним из стандартов является ImageMagick или Ghostscript.
Рассмотрим ситуацию, когда мы уже сохранили обычный PDF из 1С и хотим «сплющить» (flatten) его слои. Вызов консольной утилиты из кода 1С позволяет сделать это быстро и незаметно для пользователя. Проанализируем пример команды для ImageMagick:
// Пример команды для командной строки Windows
// convert -density 300 input.pdf -append output.pdf
// Параметр -density определяет DPI (качество), чем выше - тем четче текст на картинке
Выясним причину, почему это удобно: вы можете управлять степенью сжатия и качеством изображения. В 1С это реализуется через объект ЗапуститьПриложение(). Посмотрим на пример кода:
ИмяФайлаИсточника = "C:\Docs\Source.pdf";
ИмяФайлаРезультата = "C:\Docs\Result_Image.pdf";
// Команда для ImageMagick (утилита magick.exe)
Команда = "magick -density 300 """ + ИмяФайлаИсточника + """ -alpha remove """ + ИмяФайлаРезультата + """";
ЗапуститьПриложение(Команда, , Истина); // Истина - ждать завершения
Использование Ghostscript дает еще больше контроля. Команда с параметром -dNoOutputFonts заставляет движок отрисовывать глифы шрифтов как векторные кривые или растр, что также делает текст недоступным для стандартного выделения.
В сообщениях форума упоминалось использование Bullzip PDF Printer. Основная проблема здесь — задержка создания файла. Программа отправляет задание на печать, и 1С продолжает выполнение кода, не дожидаясь, пока принтер фактически запишет файл на диск. Если сразу после команды печати попытаться отправить этот файл по почте, возникнет ошибка «Файл не найден».
Чтобы решить эту проблему, проанализируем два пути:
Файл.Существует() и небольшой паузой Приостановить(1). Это «костыльный», но рабочий метод.OnPDFReady. В этом случае 1С получит сигнал от принтера, что файл готов, и только тогда продолжит работу.Напечатать().Иногда превращать документ в картинку невыгодно — файл становится слишком тяжелым (вместо 50 КБ он может весить 2-5 МБ). Если ваша цель — просто помешать рядовому пользователю скопировать текст, можно использовать установку флагов безопасности (Permissions).
Хотя штатные средства 1С не позволяют устанавливать пароли на PDF, это легко делается через небольшие утилиты или библиотеки типа iTextSharp (через COM-обертку). Установив флаг AllowContentCopying = false, вы сохраните текст как текст (что позволит файлу оставаться легким и четким), но стандартные средства просмотра заблокируют возможность его выделения.
Подведем итоги и выберем оптимальный путь в зависимости от ваших условий:
Рекомендация: Для большинства задач в 1С 8.3 (особенно при работе в облаке или на веб-сервере) наиболее стабильным является Метод 1. Он полностью автономен и гарантирует результат, требуемый автором вопроса — получение PDF без возможности выделения каких-либо областей.