PicScrub logoPicScrub
Повернутися до форматів

Формат SVG

Scalable Vector Graphics

Структура XML

SVG стоїть осторонь від решти форматів на цьому сайті, бо він не двійковий, а звичайний текст XML. Ви можете відкрити SVG у текстовому редакторі й прочитати його. Через це видалення метаданих концептуально простіше, але водночас місць, де може сховатися інформація, стає більше.

Метадані можуть бути окремими елементами, атрибутами будь-якого елемента, коментарями XML або інструкціями обробки. А векторні редактори просто обожнюють напихати у файли SVG власні дані.

Базова структура SVG

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     width="100" height="100" viewBox="0 0 100 100">

  <!-- Елементи метаданих -->
  <title>Мій малюнок</title>
  <desc>Автор: Іван Ковальчук</desc>
  <metadata>
    <rdf:RDF xmlns:rdf="...">
      <!-- Метадані RDF/Dublin Core -->
    </rdf:RDF>
  </metadata>

  <!-- Векторний вміст -->
  <circle cx="50" cy="50" r="40" fill="red"/>
</svg>

Основні елементи

  • <svg>:кореневий елемент із viewBox і розмірами
  • xmlns:оголошення просторів імен
  • <defs>:багаторазові визначення (градієнти, візерунки)
  • <g>:елемент групування

Елементи з метаданими

Специфікація SVG передбачає кілька способів причепити метадані, і різні програми користуються різними. Одні очевидні (є буквально елемент <metadata>), інші не так впадають в око.

<metadata>

Контейнер для структурованих метаданих, зазвичай RDF/Dublin Core. Може містити імʼя автора, дату створення, права тощо.

<metadata>
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
           xmlns:dc="http://purl.org/dc/elements/1.1/">
    <rdf:Description>
      <dc:creator>Іван Ковальчук</dc:creator>
      <dc:date>2024-01-15</dc:date>
    </rdf:Description>
  </rdf:RDF>
</metadata>

<title>

Зрозумілий людині заголовок для всього SVG або окремих елементів. Часто використовується для доступності, але може виказати призначення документа.

<desc>

Елемент опису. Може містити докладні відомості про зображення, автора чи призначення файлу.

Коментарі XML

<!-- коментар --> може містити нотатки автора, дати створення, дані про програму або службову інформацію.

Простори імен редакторів

Ось де в SVG починається безлад. Кожен векторний редактор додає власні атрибути з простором імен, щоб зберігати те, чого SVG не підтримує сам по собі. Відкрийте файл Inkscape, і всюди побачите атрибути inkscape: та sodipodi:. Самі собою вони не загрожують приватності, але видають, якою програмою ви користуєтеся.

inkscape:* / sodipodi:*

Inkscape додає атрибути з простором імен для назв шарів, розташування напрямних, налаштувань документа та історії редагування.

<svg xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
     inkscape:version="1.2"
     sodipodi:docname="my-drawing.svg">
  <sodipodi:namedview inkscape:current-layer="layer1"/>
</svg>

Adobe Illustrator

Illustrator вбудовує чимало метаданих: версію, налаштування монтажних областей, а іноді й повні дані формату AI.

xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
xmlns:x="http://ns.adobe.com/Extensibility/1.0/"

Sketch / Figma

Сучасні дизайнерські інструменти можуть вбудовувати назви шарів, ідентифікатори компонентів і налаштування експорту у власні атрибути.

Інструкції обробки

Інструкції обробки XML (<?...?>) на початку файлів SVG можуть виказувати, у якій програмі створено файл.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="style.css"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

Що зберігається, а що видаляється

  • • оголошення <?xml ...?>:зберігається (обовʼязкове)
  • • <?xml-stylesheet ...?>:зберігається (функціональне)
  • • решта інструкцій обробки:видаляється

Обробка через DOM

Оскільки SVG є коректним XML, ми можемо розібрати його в дерево DOM і хірургічно прибрати зайве. Це точніше за підхід із регулярними виразами й не ламає випадково коректний вміст.

1

Розбираємо XML

Читаємо SVG як документ XML, зберігаючи його структуру

2

Видаляємо елементи з метаданими

Прибираємо елементи <metadata>, <title>, <desc>

3

Прибираємо атрибути редакторів

Видаляємо inkscape:*, sodipodi:* та інші простори імен редакторів

4

Видаляємо коментарі

Вичищаємо з документа всі коментарі XML

5

Чистимо простори імен

Прибираємо з кореневого елемента невикористані оголошення просторів імен

6

Серіалізуємо

Записуємо очищений XML назад у файл SVG

Підсумок обробки

Зберігається

  • • уся векторна графіка (контури, фігури, текст)
  • • стилі та CSS
  • • градієнти та візерунки
  • • фільтри та ефекти
  • • вбудовані зображення (за посиланням)
  • • viewBox і розміри
  • • стандартні простори імен SVG

Видаляється

  • • елемент <metadata>
  • • елемент <title>
  • • елемент <desc>
  • • коментарі XML
  • • атрибути inkscape:*
  • • атрибути sodipodi:*
  • • простори імен Adobe/Sketch
  • • невикористані оголошення просторів імен

Вбудовані зображення

Ось підступна деталь, про яку багато хто не здогадується: файли SVG можуть містити растрові зображення у вигляді data URI в base64. А в тих вбудованих JPEG чи PNG можуть ховатися власні метадані EXIF.

Поточне обмеження

Наразі PicScrub видаляє метадані рівня SVG, але не декодує й не обробляє вбудовані растрові зображення:

<image href="data:image/jpeg;base64,/9j/4AAQ..." />

Зараз PicScrub не обробляє растрові зображення, вбудовані у файли SVG. Щоб убезпечитися повністю, дістаньте їх і обробіть окремо.