エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Ruby/RSVG と Cairo を使って SVG から PDF を生成しためも

前回C++ で書いたのですが、調べたら Ruby でも同じように書くことができることがわかりました。

今回は libRSVG を Ruby から利用する Ruby/RSVG (rsvg2 gem) を利用。

require 'rsvg2'

source = <<~EOS
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg
   xmlns='http://www.w3.org/2000/svg'
   version='1.1'
   width='210mm'
   height='297mm'
>
  <rect x='100' y='100' width='100' height='100' fill='red' />
  <text
    font-family='sans-serif'
    font-size='18'
    x='200'
    y='200'>エンジニアのソフトウェア的愛情</text>
  <text
    font-size='12'
    x='200'
    y='220'>または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか</text>
</svg>
EOS

svg = RSVG::Handle.new_from_data(source)

dim = svg.dimensions

puts "document size = #{dim.width}x#{dim.height}"

surface = Cairo::PDFSurface.new('sample.pdf', dim.width, dim.height)

cairo = Cairo::Context.new(surface)

cairo.render_rsvg_handle(svg)


結果は前回と同じです。

Cairo::PDFSurface.new の第一引数に文字列を渡すと出力先のファイルのファイル名と解釈します。第一引数に write メソッドを持つオブジェクトを渡すと、そのメソッドを使って結果を書き出します。

詳しくはこちら: http://cairo.rubyforge.org/doc/ja/cairo-pdf-surface.html



SVG をベタに書くのがになったので、 Haml で描き直してみました。
ついでに Cairo::PDFSurface.new の第一引数に Fileインスタンスwrite メソッドを持つオブジェクト)を渡しています。
HamlSVG を書く話は 以前の記事 なんかもご参照ください。

require 'haml'
require 'rsvg2'

source = Haml::Engine.new(<<EOS).to_html
!!! XML
%svg{xmlns: 'http://www.w3.org/2000/svg', version: '1.1', width: '210mm', height: '297mm'}
  %rect{x: 100, y: 100, width: 100, height: 100, fill: 'red'}
  %text{font: {family: 'sans-serif', size: 18}, x: 200, y: 200} エンジニアのソフトウェア的愛情
  %text{font: {size: 12}, x: 200, y: 220} または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか
EOS

svg = RSVG::Handle.new_from_data(source)

dim = svg.dimensions

puts "document size = #{dim.width}x#{dim.height}"

surface = Cairo::PDFSurface.new(File.new('sample.pdf', 'w'), dim.width, dim.height)

cairo = Cairo::Context.new(surface)

cairo.render_rsvg_handle(svg)

いつか読むはずっと読まない:バチガルピ短篇

イーガンをまとめて読んでいた時期があったせいか、第一篇を読んでてイーガンを読んでいるような錯覚をしてしまいました。設定が。
作風が似ているかどうか判断できるほど、わたしの SF 脳は肥えていない。

第六ポンプ (ハヤカワ文庫SF)

第六ポンプ (ハヤカワ文庫SF)