Удалить только собственное вложение с проверкой версии PDF

Учебные задачи

До записи удаления проверяем заголовок собственного PDF: метод требует версию не ниже 1.5. Другие документы и файлы не затрагиваются.

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

Серверная процедура отдельной учебной базы; собственный 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.Перейти(0, ПозицияВПотоке.Начало);
    Заголовок = Новый БуферДвоичныхДанных(8);
    Если ПотокPDF.Прочитать(Заголовок, 0, 8) <> 8 Тогда
        ВызватьИсключение "Недостаточно байтов для учебного заголовка PDF";
    КонецЕсли;
    СтрокаЗаголовка = ПолучитьСтрокуИзБуфераДвоичныхДанных(Заголовок, КодировкаТекста.UTF8);
    Если СтрокаЗаголовка <> "%PDF-1.5" И СтрокаЗаголовка <> "%PDF-1.6" И СтрокаЗаголовка <> "%PDF-1.7" И СтрокаЗаголовка <> "%PDF-2.0" Тогда
        ВызватьИсключение "Этот учебный PDF не прошёл явную проверку поддерживаемого заголовка: удаление не выполняется";
    КонецЕсли;
    ПотокPDF.Перейти(0, ПозицияВПотоке.Начало);
    Запись = Новый ЗаписьPDF(ПотокPDF);
    ИменаУдаления = Новый Массив;
    ИменаУдаления.Добавить("товар.json");
    Запись.ЗаписатьУдалениеВложений(ИменаУдаления);
    Запись.Закрыть();
    Запись = Неопределено;
    БайтыPDF = ПотокPDF.ЗакрытьИПолучитьДвоичныеДанные();
    ПотокPDF = Неопределено;
    ПотокЧтения = БайтыPDF.ОткрытьПотокДляЧтения();
    Чтение = Новый ЧтениеPDF(ПотокЧтения);
    Прочитанные = Чтение.ПолучитьВложения();
    Сообщить(Прочитанные.Количество() = 0);
    Сообщить(Прочитанные.Найти("товар.json") = Неопределено);
Исключение
    Если Чтение <> Неопределено Тогда
        Чтение.Закрыть();
    КонецЕсли;
    Если Запись <> Неопределено Тогда
        Запись.Закрыть();
    КонецЕсли;
    Если ПотокЧтения <> Неопределено Тогда
        ПотокЧтения.Закрыть();
    КонецЕсли;
    Если ПотокPDF <> Неопределено Тогда
        ПотокPDF.Закрыть();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Если Чтение <> Неопределено Тогда
    Чтение.Закрыть();
КонецЕсли;
Если Запись <> Неопределено Тогда
    Запись.Закрыть();
КонецЕсли;
Если ПотокЧтения <> Неопределено Тогда
    ПотокЧтения.Закрыть();
КонецЕсли;
Если ПотокPDF <> Неопределено Тогда
    ПотокPDF.Закрыть();
КонецЕсли;

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

  1. Исходный PDF принадлежит этому упражнению и содержит одно своё вложение.

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

  3. ЗаписатьУдалениеВложений получает массив имён, не коллекцию объектов ВложениеPDF.

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

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

  1. Для поддержанного заголовка две проверки Истина; при неподдержанном — объяснимое исключение до изменения.

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

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

Удалено собственное вложение из перечня документа; предварительно проверено требование версии.

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

  1. Проверка восьми байтов — ограниченная учебная проверка своего экспорта, не полноценная валидация произвольного PDF.

  2. Для удаления конфиденциальных данных из чужого документа нужны отдельная проверка и подходящий инструмент; этот урок такого обещания не даёт.

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

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

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

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

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