Попробуйте использовать Scour для очистки SVG - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь использовать scour изнутри python, чтобы очистить svg, который выходил из svgutils.

        from scour import scour
        options = "--remove-metadata"
        with open(input_svg, 'rb') as f1:
            with open(output_svg, 'wb') as f2:
                scour.start(options, f1, f2)

Если я это сделаю, произойдет сбой с десятичным сообщением об ошибке:

File "C:\Users\Andreas\Anaconda3\lib\site-packages\scour\scour.py", line 2762, in scourUnitlessLength
length = getcontext().create_decimal(str(length))

InvalidOperation: [<class 'decimal.ConversionSyntax'>]

Я попытался повторить то же самое в CLI, чтобы увидеть, был ли мой текст Python неправильным, но появляется та же ошибка. С SVG все в порядке - я даже сделал очень маленький тестовый svg, чтобы убедиться, что это не сбой, исходящий из данных.

Есть что-то, что я мог упустить из виду? Является ли scour правильным способом очистки svg изнутри python или я должен сделать это по-другому?

1 Ответ

1 голос
/ 26 апреля 2019

Наконец ...

Мое решение моей проблемы.

svgutils предоставляет svg, который технически правильный, но он всегда добавляет единицу к размерам и координатам в svg. 456,0 -> 456,0pt

Технически это неверно, так как исходные значения свободных единиц должны оставаться такими. Это убивало нечисть. К сожалению, с некоторых лет в сообществе рыцарей было мало активности, иначе стоило бы уведомить их об их ошибке.

Мое решение для работы svgutils и scour вместе:

from scour import scour
import svgutils
import re


sv1 = svgutils.transform.fromfile(svg_file)
# do something with the svg here

reg = re.compile("(\.\d)(pt)") # regex to search numbers with "pt"

svg = sv1.to_str().decode() # svgutils delivers ascii byte strings.
svg = reg.sub(r"\1", svg) # the incorrectly added "pt" unit is removed here

scour_options = scour.sanitizeOptions(options=None) # get a clean scour options object
scour_options.remove_metadata = True # change any option you like
clean_svg = scour.scourString(svg, options = scour_options) # use scour

Это работает. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...