ЗаписьPDF.ЗаписатьВложения

Методы · WriteAttachments

Дописывает вложения в существующий PDF-документ. Если в документе уже существуют вложения с именами, указанными в коллекции вложений, то вложения в документе заменяются на вложения из коллекции. Если документ записывается в формате PDF или PDF/A-3 и указан параметр <Вложения>, то вложения добавляются в документ в формате PDF и PDF/A-3. При записи вложений в документы форматов PDF/A-1 и PDF/A-2 генерируется исключение.

Синтаксис

ЗаписатьВложения(<Вложения>)
Полное описание, параметры и ограничения

ЗаписьPDF.ЗаписатьВложения (PDFWriter.WriteAttachments)

ЗаписьPDF (PDFWriter)

ЗаписатьВложения (WriteAttachments)

Доступен, начиная с версии 8.3.16.

Синтаксис:
ЗаписатьВложения(<Вложения>)
Параметры:

<Вложения> (обязательный)
Тип: КоллекцияВложенийPDF.
Объект, содержащий вложения PDF-документа.
Описание:

Дописывает вложения в существующий PDF-документ.
Если в документе уже существуют вложения с именами, указанными в коллекции вложений, то вложения в документе заменяются на вложения из коллекции.
Если документ записывается в формате PDF или PDF/A-3 и указан параметр <Вложения>, то вложения добавляются в документ в формате PDF и PDF/A-3.

При записи вложений в документы форматов PDF/A-1 и PDF/A-2 генерируется исключение.

Доступность:

Тонкий клиент, сервер, толстый клиент.

См. также:
ЗаписьPDF, метод ЗаписатьВложенияАсинх
ЗаписьPDF, метод НачатьЗаписьВложений
ДокументPDF, метод Записать
ДокументPDF, метод ЗаписатьАсинх

Использование в версии:

Доступен, начиная с версии 8.3.16.

Описание изменено в версии 8.3.21.

Методическая информация

Практические примеры

Прочитать и дополнить собственный временный PDF по имени файла

Конструкторы ЧтениеPDF и ЗаписьPDF на основании имени файла показаны на новом уникальном учебном PDF. После проверки удаляется только этот файл, не каталог и не пользовательский документ.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. В отдельной учебной базе создайте серверную процедуру общего модуля УчебныеЗадачи. Вставьте фрагмент в тело своей экспортной процедуры.

  2. Серверному процессу нужны обычные права на свой временный каталог. КаталогВременныхФайлов на сервере относится к серверу, не к диску тонкого клиента.

  3. Имя создаётся из нового UUID внутри урока. Не заменяйте его путём к важному PDF: упражнение изменяет и затем удаляет только созданный им файл.

  4. Учебные данные: ячейка Книга: 3 шт. и вложение товар.json. Сертификатов, подписей и сети нет.

ИмяPDF = КаталогВременныхФайлов() + "УчебныйPDF_" + Строка(Новый УникальныйИдентификатор) + ".pdf";
СозданСвойФайл = Ложь;
Поток = Неопределено;
Чтение = Неопределено;
Запись = Неопределено;
Попытка
    Поток = Новый ФайловыйПоток(ИмяPDF, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
    СозданСвойФайл = Истина;
    Документ = Новый ТабличныйДокумент;
    Документ.Область("A1").Текст = "Книга: 3 шт.";
    Документ.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
    Поток.Закрыть();
    Поток = Неопределено;
    Чтение = Новый ЧтениеPDF(ИмяPDF);
    Сообщить(Чтение.ПолучитьВложения().Количество() = 0);
    Чтение.Закрыть();
    Чтение = Неопределено;
    Вложения = Новый КоллекцияВложенийPDF;
    ТекстJSON = "{""товар"":""Книга"",""количество"":3}";
    БайтыJSON = ПолучитьДвоичныеДанныеИзСтроки(ТекстJSON, КодировкаТекста.UTF8, Ложь);
    Вложения.Добавить("товар.json", БайтыJSON, "application/json", ТипСвязиВложенияPDF.Данные);
    Запись = Новый ЗаписьPDF(ИмяPDF);
    Запись.ЗаписатьВложения(Вложения);
    Запись.Закрыть();
    Запись = Неопределено;
    Чтение = Новый ЧтениеPDF;
    Чтение.Открыть(ИмяPDF);
    Прочитанные = Чтение.ПолучитьВложения();
    ФайлJSON = Прочитанные.Найти("товар.json");
    Если ФайлJSON = Неопределено Тогда
        ВызватьИсключение "В собственном PDF нет записанного JSON";
    КонецЕсли;
    Сообщить(Прочитанные.Количество() = 1);
    Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ФайлJSON.Содержимое, КодировкаТекста.UTF8) = ТекстJSON);
Исключение
    Если Чтение <> Неопределено Тогда
        Чтение.Закрыть();
    КонецЕсли;
    Если Запись <> Неопределено Тогда
        Запись.Закрыть();
    КонецЕсли;
    Если Поток <> Неопределено Тогда
        Поток.Закрыть();
    КонецЕсли;
    Если СозданСвойФайл Тогда
        УдалитьФайлы(ИмяPDF);
        СозданСвойФайл = Ложь;
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Если Чтение <> Неопределено Тогда
    Чтение.Закрыть();
КонецЕсли;
Если Запись <> Неопределено Тогда
    Запись.Закрыть();
КонецЕсли;
Если Поток <> Неопределено Тогда
    Поток.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
    УдалитьФайлы(ИмяPDF);
    СозданСвойФайл = Ложь;
КонецЕсли;
ПроверкаФайла = Новый Файл(ИмяPDF);
Сообщить(Не ПроверкаФайла.Существует());

Разбор по шагам

  1. ФайловыйПоток с СоздатьНовый атомарно требует нового имени. Если файл уже существует, открытие не заменяет его и флаг собственности не устанавливается.

  2. Через собственный поток экспортируем PDF и закрываем поток. ЧтениеPDF(ИмяPDF) автоматически открывает файл для чтения.

  3. Закрываем читателя до открытия писателя. ЗаписьPDF(ИмяPDF) дописывает JSON в этот же собственный документ.

  4. После закрытия записи создаём другой читатель без аргументов и явно открываем по имени. Проверяем вложение и байты.

  5. Очистка закрывает PDF-объекты и поток, затем удаляет точное имя только при подтверждённом флаге создания. Последняя проверка убеждается, что файл больше не существует.

Как проверить результат

  1. Четыре сравнения Истина: до записи вложений 0, после 1, JSON совпадает, свой временный PDF удалён.

  2. В отладчике путь ИмяPDF относится к временному каталогу процесса выполнения, а не обязательно к папке вашего компьютера.

  3. Если возникло исключение открытия, чужой файл не должен удаляться: флаг СозданСвойФайл остаётся Ложь.

Ожидаемый результат

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

На что обратить внимание

  1. Нельзя менять имя на присланный документ: этот урок предназначен только для собственных тестовых данных.

  2. Удаление временного PDF не является гарантией уничтожения данных на носителе.

  3. Ошибка освобождения или удаления должна быть разобрана отдельно; отсутствие файла не обещается при исключении файловой системы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Дополнить свой PDF вложением после экспорта

ЗаписьPDF редактирует уже сформированный собственный документ. После добавления JSON закрываем запись и проверяем вложение независимым читателем.

Где и как запускать

Серверная процедура отдельной учебной базы; собственный PDF и потоки в памяти.

Подготовка

  1. Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  2. Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.

  3. Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.

  4. Документ PDF строится из собственной ячейки Книга: 3 шт. Внешний PDF, установленный PDF-редактор, криптографический сертификат и реальные персональные данные не нужны.

  5. Файловый путь нигде не используется. Для просмотра в PDF-программе сохраните только полученные собственные двоичные данные в отдельно выбранный новый учебный файл.

Чтение = Неопределено;
Запись = Неопределено;
ПотокЧтения = Неопределено;
ПотокPDF = Новый ПотокВПамяти;
Документ = Новый ТабличныйДокумент;
Документ.Область("A1").Текст = "Книга: 3 шт.";
Документ.Область("A1").ЦветТекста = Новый Цвет(30, 90, 180);
Попытка
    Документ.Записать(ПотокPDF, ТипФайлаТабличногоДокумента.PDF);
    Вложения = Новый КоллекцияВложенийPDF;
    ТекстJSON = "{""товар"":""Книга"",""количество"":3}";
    БайтыJSON = ПолучитьДвоичныеДанныеИзСтроки(ТекстJSON, КодировкаТекста.UTF8, Ложь);
    Вложения.Добавить("товар.json", БайтыJSON, "application/json", ТипСвязиВложенияPDF.Данные);
    ПотокPDF.Перейти(0, ПозицияВПотоке.Начало);
    Запись = Новый ЗаписьPDF;
    Запись.Открыть(ПотокPDF);
    Запись.ЗаписатьВложения(Вложения);
    Запись.Закрыть();
    Запись = Неопределено;
    БайтыPDF = ПотокPDF.ЗакрытьИПолучитьДвоичныеДанные();
    ПотокPDF = Неопределено;
    ПотокЧтения = БайтыPDF.ОткрытьПотокДляЧтения();
    Чтение = Новый ЧтениеPDF(ПотокЧтения);
    Прочитанные = Чтение.ПолучитьВложения();
    ФайлJSON = Прочитанные.Найти("товар.json");
    Если ФайлJSON = Неопределено Тогда
        ВызватьИсключение "Дополнительное вложение не записано";
    КонецЕсли;
    Сообщить(Прочитанные.Количество() = 1);
    Сообщить(ПолучитьСтрокуИзДвоичныхДанных(ФайлJSON.Содержимое, КодировкаТекста.UTF8) = ТекстJSON);
Исключение
    Если Чтение <> Неопределено Тогда
        Чтение.Закрыть();
    КонецЕсли;
    Если Запись <> Неопределено Тогда
        Запись.Закрыть();
    КонецЕсли;
    Если ПотокЧтения <> Неопределено Тогда
        ПотокЧтения.Закрыть();
    КонецЕсли;
    Если ПотокPDF <> Неопределено Тогда
        ПотокPDF.Закрыть();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Если Чтение <> Неопределено Тогда
    Чтение.Закрыть();
КонецЕсли;
Если Запись <> Неопределено Тогда
    Запись.Закрыть();
КонецЕсли;
Если ПотокЧтения <> Неопределено Тогда
    ПотокЧтения.Закрыть();
КонецЕсли;
Если ПотокPDF <> Неопределено Тогда
    ПотокPDF.Закрыть();
КонецЕсли;

Разбор по шагам

  1. Поток уже содержит настоящий PDF из собственного табличного документа. Возвращаем позицию в начало.

  2. Создаём ЗаписьPDF без аргументов и открываем свой поток. ЗаписатьВложения дописывает вложения, не заменяет PDF исходным JSON.

  3. Закрываем ЗаписьPDF до закрытия его потока: это обязательный порядок для потокового конструктора и открытия.

  4. Полученные байты читаем новым ЧтениеPDF; проверяем и наличие имени, и содержимое.

Как проверить результат

  1. Два сравнения Истина и найденный товар.json.

  2. Вместо добавления в коллекцию исходного экспорта выполнена отдельная операция изменения собственного PDF.

Ожидаемый результат

В существующий учебный PDF добавлено и проверено одно вложение.

На что обратить внимание

  1. ЗаписьPDF не следует считать генератором страниц с нуля: для первой страницы здесь использован ТабличныйДокумент.

  2. Нельзя экспериментировать этим методом с важным или подписанным чужим PDF: изменение документа затрагивает его состояние.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.