ЧтениеPDF.ПолучитьВложения

Методы · GetAttachments

Возвращает вложения, содержащиеся в PDF-документе.

Синтаксис

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

ЧтениеPDF.ПолучитьВложения (PDFReader.GetAttachments)

ЧтениеPDF (PDFReader)

ПолучитьВложения (GetAttachments)

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

Синтаксис:
ПолучитьВложения()
Возвращаемое значение:
Тип: КоллекцияВложенийPDF.

Описание:

Возвращает вложения, содержащиеся в PDF-документе.

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

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

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

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

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

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

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

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

Прочитать и дополнить собственный временный 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 с JSON и прочитать вложение обратно

Табличный документ экспортируется в PDF прямо в память с одним JSON-вложением. ЧтениеPDF открывает полученные байты через поток.

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

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

Подготовка

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

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

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

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

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

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

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

  1. Третий аргумент Записать передаёт вложения при экспорте в обычный PDF.

  2. ЗакрытьИПолучитьДвоичныеДанные завершает наш поток записи; переменную обнуляем, чтобы не закрывать его повторно.

  3. Новый поток чтения открывается из полученных байтов. Конструктор ЧтениеPDF на основании потока сразу открывает документ.

  4. Сначала освобождается объект ЧтениеPDF, затем собственный поток; порядок соблюдён и при исключении.

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

  1. Пять сравнений Истина; содержимое извлечённого JSON полностью совпадает с исходным.

  2. Количество вложений относится к PDF, не к числу страниц или товаров.

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

Получен и разобран собственный PDF с проверенным JSON-вложением.

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

  1. PDF/A-1 и PDF/A-2 не принимают такие вложения: используйте разрешённый формат, а не меняйте расширение файла.

  2. Не закрывайте переданный поток раньше PDF-объекта; окончание работы не равно исчезновению переменной.

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

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

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

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

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