前回 は 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
メソッドを持つオブジェクト)を渡しています。
Haml で SVG を書く話は 以前の記事 なんかもご参照ください。
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 脳は肥えていない。
- 作者: パオロバチガルピ,Paolo Bacigalupi,中原尚哉,金子浩
- 出版社/メーカー: 早川書房
- 発売日: 2013/12/06
- メディア: 文庫
- この商品を含むブログ (1件) を見る