Формат 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 і хірургічно прибрати зайве. Це точніше за підхід із регулярними виразами й не ламає випадково коректний вміст.
Розбираємо XML
Читаємо SVG як документ XML, зберігаючи його структуру
Видаляємо елементи з метаданими
Прибираємо елементи <metadata>, <title>, <desc>
Прибираємо атрибути редакторів
Видаляємо inkscape:*, sodipodi:* та інші простори імен редакторів
Видаляємо коментарі
Вичищаємо з документа всі коментарі XML
Чистимо простори імен
Прибираємо з кореневого елемента невикористані оголошення просторів імен
Серіалізуємо
Записуємо очищений 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. Щоб убезпечитися повністю, дістаньте їх і обробіть окремо.