#svg
#svg
Вопрос:
У меня есть несколько сотен SVG-файлов.
Я ищу способ изменить шрифт, размер текста и сбросить возможную матрицу преобразования (чтобы текст не искажался) во всех из них, чтобы текст был одинаковым во всех файлах.
Есть идеи, как это сделать?
Спасибо
Ответ №1:
Проблема решена. Вот код для Matlab, который изменяет свойства объектов svg.
% this script requires the following functions
% struct2xml
% https://www.mathworks.com/matlabcentral/fileexchange/28639-struct2xml
% xml2struct
% https://uk.mathworks.com/matlabcentral/fileexchange/28518-xml2struct
% read the file into structure
filename = 'car_on_a_road.svg';
XML = xml2struct(filename);
% the text and its params are stored in flowRoot
for i = 1:length(XML.svg.g.flowRoot)
% modify fonts
if length(XML.svg.g.flowRoot{i}.flowPara) == 1
if isfield(XML.svg.g.flowRoot{i}.flowPara.Attributes,'style')==1
XML.svg.g.flowRoot{i}.flowPara.Attributes.style='font-size:16px';
end
end
% for 2 line text
if length(XML.svg.g.flowRoot{i}.flowPara) == 2
XML.svg.g.flowRoot{i}.flowPara{1}.Attributes.style='font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:100%;font-family:''Times New Roman'';-inkscape-font-specification:''Times New Roman, Italic'';text-align:start;writing-mode:lr-tb;text-anchor:start';
XML.svg.g.flowRoot{i}.flowPara{2}.Attributes.style='font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:100%;font-family:''Times New Roman'';-inkscape-font-specification:''Times New Roman, Italic'';text-align:start;writing-mode:lr-tb;text-anchor:start';
end
if isfield(XML.svg.g.flowRoot{i}.Attributes,'style')==1
XML.svg.g.flowRoot{i}.Attributes.style='font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:100%;font-family:''Times New Roman'';-inkscape-font-specification:''Times New Roman, Italic'';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none';
end
% only do if "transform" field exists
if isfield(XML.svg.g.flowRoot{i}.Attributes,'transform')==1
% only do if "matrix" text exists in this field
if contains(XML.svg.g.flowRoot{i}.Attributes.transform,'matrix')
% read original text position
parsed_matrix_data = regexp(XML.svg.g.flowRoot{i}.Attributes.transform,',','split');
%
E = str2double(parsed_matrix_data{5});
F = str2double(regexprep(parsed_matrix_data{6},'[)]',''));
% reset transformation matrix to remove any stretching of the text
XML.svg.g.flowRoot{i}.Attributes.transform = sprintf('translate(%f, %f )',E,F);
end
end
end
% save to file, to different dir
struct2xml( XML, strcat('modified',filename) )