web-dev-qa-db-ja.com

Python SVGパーサー

pythonを使用してSVGファイルを解析して、座標/パスを抽出したいと思います(これは、「パス」ID、特にd = "..." />の下にリストされていると思います)。データは最終的に2軸CNCの駆動に使用されます。

私はSOとGoogleでこのようなパスの文字列を返すことができるライブラリを検索して、さらに解析できるようにしましたが、役に立ちません。そのようなライブラリは存在しますか?

18

変換を無視して、次のようにSVGからパス文字列を抽出できます。

from xml.dom import minidom

doc = minidom.parse(svg_file)  # parseString also exists
path_strings = [path.getAttribute('d') for path
                in doc.getElementsByTagName('path')]
doc.unlink()
26
icktoofay

D-stringの取得は svgpathtools を使用して1行または2行で実行できます。

from svgpathtools import svg2paths
paths, attributes = svg2paths('some_svg_file.svg')

pathsは、svgpathtools Pathオブジェクトのリストです(曲線情報のみを含み、色やスタイルなどは含まれません)。 attributesは、各パスの属性を格納する対応する辞書オブジェクトのリストです。

たとえば、d-stringsを出力するには...

for k, v in enumerate(attributes):
    print v['d']  # print d-string of k-th path in SVG
7
AndyP

問題はパス文字列の抽出に関するものでしたが、結局のところ線描画コマンドが必要でした。 minidomでの回答に基づいて、svg.pathで解析するパスを追加して、線画座標を生成しました。

#!/usr/bin/python3
# requires svg.path, install it like this: pip3 install svg.path

# converts a list of path elements of a SVG file to simple line drawing commands
from svg.path import parse_path
from xml.dom import minidom

# read the SVG file
doc = minidom.parse('test.svg')
path_strings = [path.getAttribute('d') for path
                in doc.getElementsByTagName('path')]
doc.unlink()

# print the line draw commands
for path_string in path_strings:
    path = parse_path(path_string)
    for e in path:
        if type(e).__name__ == 'Line':
            x0 = e.start.real
            y0 = e.start.imag
            x1 = e.end.real
            y1 = e.end.imag
            print("(%.2f, %.2f) - (%.2f, %.2f)" % (x0, y0, x1, y1))
2
Frank Buss