「LibreOffice Drawのodgファイルから図形の情報を抜き出して使う」では矩形とコネクタだけ扱いましたが、直線も使いたくなったのでメモ。
サンプルを用意。
fodg で保存して draw:page
要素を見てみると、こんな感じ。
<draw:page draw:name="page1" draw:style-name="dp2" draw:master-page-name="標準"> <draw:line draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:x1="2.6cm" svg:y1="1.5cm" svg:x2="4.5cm" svg:y2="1.6cm" > <text:p/> </draw:line> <draw:line draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:x1="1.4cm" svg:y1="1.8cm" svg:x2="1.5cm" svg:y2="3.6cm" > <text:p/> </draw:line> <draw:line draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:x1="6.5cm" svg:y1="1.6cm" svg:x2="5.6cm" svg:y2="3.6cm" > <text:p/> </draw:line> </draw:page>
素朴な内容ですね。素朴に抽出します。
require "rexml/document" def xpath_match(el, xpath) return REXML::XPath.match(el, xpath) end def extract_pages(doc) return xpath_match(doc, "//draw:page") end def extract_lines(page) xpath_match(page, "draw:line") end def print_line(line_el) print "x1=" , line_el["svg:x1"] print ", y1=" , line_el["svg:y1"] print ", x2=" , line_el["svg:x2"] print ", y2=" , line_el["svg:y2"] print "\n" end # -------------------------------- xml = File.read("sample_line.fodg") doc = REXML::Document.new(xml) pages = extract_pages(doc) line_els = extract_lines(pages[0]) line_els.each { |line_el| print_line(line_el) }
実行。
$ ruby extract_lines.rb x1=2.6cm, y1=1.5cm, x2=4.5cm, y2=1.6cm x1=1.4cm, y1=1.8cm, x2=1.5cm, y2=3.6cm x1=6.5cm, y1=1.6cm, x2=5.6cm, y2=3.6cm