У меня есть файл SVG, созданный в Powerpoint, который я теперь хочу редактировать в Inkscape. При открытии и сохранении этого файла в Inkscape, без изменений, размер файла увеличивается со 120kB до 170kB (я сохраняю его как обычный SVG, а не Inkscape SVG).
Насколько я могу судить, это происходит потому, что SVG, сгенерированный Inkscape, довольно печатный и, следовательно, имеет много бесполезного пустого пространства.Есть ли способ сохранить файл SVG без красивой печати?
Например, эта часть исходного файла:
<linearGradient x1="272" y1="618" x2="272" y2="643" gradientUnits="userSpaceOnUse" spreadMethod="reflect" id="fill25"><stop offset="0" stop-color="#D2D2D2"/><stop offset="0.5" stop-color="#C8C8C8"/><stop offset="1" stop-color="#C0C0C0"/></linearGradient>
сохраняется как
<linearGradient
id="fill1"
spreadMethod="reflect"
gradientUnits="userSpaceOnUse"
y2="159"
x2="272"
y1="134"
x1="272">
<stop
id="stop6277"
stop-color="#D2D2D2"
offset="0" />
<stop
id="stop6279"
stop-color="#C8C8C8"
offset="0.5" />
<stop
id="stop6281"
stop-color="#C0C0C0"
offset="1" />
</linearGradient>
решение1
Есть ли способ сохранить файл SVG без красивой печати?
С оговорками, вы можете захотеть взглянуть наXML-форматированиеварианты в рамкахВывод SVGпредпочтения:
напр. XML-форматирование
Эти опции должны быть доступны черезРедактировать → Настройки → Ввод/вывод → Вывод SVG → Форматирование XML. Обратите внимание, чтоРедактировать → Настройкитакже доступен через Ctrl+ Shift+ P(как указано).
Отметив опцию Inline attributes
(выше), следует сохранить напр.:
<linearGradient
id="fill1"
spreadMethod="reflect"
gradientUnits="userSpaceOnUse"
y2="159"
x2="272"
y1="134"
x1="272">
<stop
id="stop6277"
stop-color="#D2D2D2"
offset="0" />
<stop
id="stop6279"
stop-color="#C8C8C8"
offset="0.5" />
<stop
id="stop6281"
stop-color="#C0C0C0"
offset="1" />
</linearGradient>
как напр.:
<linearGradient x1="272" y1="618" x2="272" y2="643" gradientUnits="userSpaceOnUse" spreadMethod="reflect" id="fill25"><stop offset="0" stop-color="#D2D2D2"/><stop offset="0.5" stop-color="#C8C8C8"/><stop offset="1" stop-color="#C0C0C0"/></linearGradient>
Предостережения
Некоторые небольшие накладные расходы все равно могут применяться к файлам, отредактированным в Inkscape, просто потому, что Inkscape может сохранять файлы в несколько ином формате, чем исходный (даже с "plain"
.svg
).Что касается начальных пробелов и т. п., то «целые»
.svg
теги могут иметь отступы для удобства печати, например:<g> <path fill="#FFFFFF" stroke="#F1F2F2" stroke-width="3" stroke-miterlimit="10" d="M314.267,104.257h-0.006H314.267z"/>
Если я не ошибаюсь, Indent, spaces
в настоящее время настройка, похоже, не оказывает никакого влияния на .svg
файлы, которые уже имеют красивые печатные теги, например (т.е. похоже, что эта опция применяется только к новым файлам).
Если вы хотите быть уверены, что начальные пробелы и т. п. удалены, вам, вероятно, следует использовать текстовый редактор или скрипт для их ручного удаления.
Вы можете использовать текстовый редактор, напримерБлокнот++чтобы открыть
.svg
файл и выбратьРедактировать → Операции с пустыми строками → Обрезать начальный пробелдля удаления начальных пробелов. Вы также можете использоватьРедактировать → Операции со строками → Удалить пустые строкичтобы удалить все пустые строки.Вы можете написать скрипт для выполнения вышеуказанных операций с одним или несколькими
.svg
файлами в заданном каталоге. Например, короткий пример вПитон 3:
например reduce_svg_files.py
# Remove leading spaces and blank lines from a set of text files (e.g. ".svg"
# files) in a directory with Python.
# Preserves '\n' (linefeed) line endings (for file size considerations) by
# reading/writing files as "binary".
# This script would be run in the same directory as the original files.
# --- Imports ---
import os
import os.path
import sys
# --- Variables ---
# Where are the original files located?
root_dir = '.\\'
# What is the directory/path to write any reduced files to?
mini_directory_name = 'mini'
mini_output_directory = os.path.join(root_dir, mini_directory_name)
# What file extension should the script work with?
ext = '.svg'
# What suffix should be added to the end of any reduced files?
mini_suffix = ' - mini'
# --- Main ---
try:
# Create the directory specified by "mini_output_directory", as needed.
os.makedirs(mini_output_directory, exist_ok=True)
# Read the directory contents (files and folder names) of "root_dir".
directory_items = os.listdir(root_dir)
# For every directory item returned...
for directory_item in directory_items:
# If that item is a file that also ends with "ext"...
if os.path.isfile(directory_item) and directory_item.endswith(ext):
# Create a list to hold the reduced contents of the file.
svg_contents = []
# Read the contents of the original file.
with open(directory_item, 'rb') as svg_file:
# For each line in the file...
for svg_line in svg_file:
# Remove any leading spaces, etc. with ".lstrip()" and
# store each "cleaned" line in svg_contents[] (from above).
svg_contents.append(svg_line.lstrip())
# Then...
# Remove the "ext" from the original file name by replacing it
# with "nothing".
mini_title = directory_item.replace(ext, '')
# Add "mini_suffix" and then the "ext" back to the stripped
# file name to create the name for the reduced file.
mini_file = mini_title + mini_suffix + ext
# Create the full path to where the reduced file should be
# stored.
mini_path = os.path.join(mini_output_directory, mini_file)
# Write the reduced file to this path.
with open(mini_path, 'wb') as mini_output_path:
mini_output_path.writelines(svg_contents)
# If there is a problem working with the OS while running the script, catch any
# error then quit.
except OSError as err:
print('')
print(err)
sys.exit()
Обратите внимание, что оба варианта выше сохраняют форматирование, сохраняя окончания строк. Как вы указали в комментариях, если окончания строк не являются проблемой, вы можете выполнить (примерно) те же два шага выше в Notepad++ одной операцией, какРедактировать → Операции с пустыми строками → Удалить ненужные пустые строки и EOL(превращая .svg
содержимое любого файла в одну текстовую строку с пробелами).
Если вы также хотите удалить пробелы между тегами, вы можете использовать скрипт Python выше и изменить:
svg_contents.append(svg_line.lstrip())
чтобы просто:
svg_contents.append(svg_line.strip())
Однако имейте в виду, что второй вариант может привести к тому, что любые .svg
выходные файлы будут отображаться неправильно (и, следовательно, станут нечитаемыми), если каждая строка не состоит из «целых» <tag>
элементов (т. е. убедитесь, что исходное .svg
содержимое файла выглядит как желаемое вами содержимое, а не как нежелательный «список элементов» в вашем исходном вопросе).