LibreOffice Drawのファイルから図形の情報を抜き出す(直線)

LibreOffice Drawのodgファイルから図形の情報を抜き出して使う」では矩形とコネクタだけ扱いましたが、直線も使いたくなったのでメモ。


サンプルを用意。

f:id:sonota88:20200208111458p:plain

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