Ruby on Railsで日本語PDF

Standard
Ruby on Railsで日本語PDF

先月で契約が切れた派遣のお姉さんが恋しくてたまらない今日このごろ。巨乳という華を職場に返してもらいたい。
 
昨日からRailsで作ったWebアプリでPDF形式の出力はどうやるかっつーので右往左往してます。”ruby pdf 出力”とかでグーグル教授にたずねてみると、使えるライブラリがいろいろでてくるけど、pdf-writerらへんが多い気がする。で、http://d.hatena.ne.jp/octech/20070904 とか http://youichi-kato.cocolog-nifty.com/blog/2007/10/ruby_pdf_64d5.html とかを参考にpdf-writer を使ってみた。日本語パッチなんかも公開されてて普通に表示する分には問題なさそうなんだけれども、”―”(全角ダッシュ)とか”①”(”まるいち”とかの特殊文字)とかを出力しようとすると、バケたり途中で落ちるのか文字が出力されなかったりする。そんな文字使うなよって言えれば一瞬で片付く話なんだけど、まーそう言えるわけもないので他の手段を探してみる。

行き着いた先が “librsvg” っていうパッケージ。windowsにもインストールできる。http://kyle-in-jp.blogspot.com/2008/10/librsvgwindowssvgpng.html とか http://web.fpso.jp/article.php/20080101013132688 とかを参考にしてrsvgコマンドが使えるようになった。で、あとはrubyからsvgファイルを書き出してやればいいんだろうと思う。中身はxmlなのでrexmlを調べながらゴニョゴニョしてみた。

まず、テンプレートファイルを作る。Inkscapeってツールでこんな感じでテンプレートを作成。履歴書を作ってみよう。

Inkscape.jpg

Inkscape

GIMPに似てる。保存されるsvgファイルをfirefoxで開くとInkscapeで作成したのと同じ感じで表示される。ちなみにieだと↓
 
ie.jpg

ie

 
こういうとこが嫌い。プラグイン入れればPDFみたいな感じで表示できるらしい。
 
 
出力されたsvgファイルにrsvg-convertコマンドを実行するとpdfファイルに変換できる。

rsvg-convert hoge.svg -f pdf -o hoge.pdf

変換されたPDFはInkscapeの画面とまったく同じこの時点では。
 
svgファイルはテンプレートにしたいのでtext要素とtspan要素を全部削除してみた。↓みたいにして保存。
 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
id="svg2383"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="templete.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2389" />
<inkscape:perspective
id="perspective2550"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 526.18109 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2567"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 526.18109 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2429"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 526.18109 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2431"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 526.18109 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2435"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 526.18109 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
inkscape:document-units="mm"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.49497475"
inkscape:cx="401.35844"
inkscape:cy="623.80647"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="974"
inkscape:window-height="666"
inkscape:window-x="439"
inkscape:window-y="-1" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:65.77341461px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
x="22.938391"
y="83.420784"
id="text2403"
sodipodi:linespacing="125%"
transform="scale(1.0435025,0.9583111)"><tspan
sodipodi:role="line"
id="tspan2405"
x="22.938391"
y="83.420784">履歴書</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.89128971px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 26.263966,111.91017 L 458.60926,111.91017"
id="path2433" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.60533047px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 30.26396,1010.1662 L 30.26396,113.05536"
id="path2435" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.92985797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 456.58895,357.69693 L 456.58895,112.60063"
id="path2439" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.92985797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 455.2591,355.33662 L 700.3554,355.33662"
id="path2441" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4.78000402px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 699.02556,1010.8765 L 699.02556,358.49737"
id="path2443" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4.8522172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 27.555326,1011.9764 L 699.7951,1011.9764"
id="path2445" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 32.324881,151.30611 L 454.56865,151.30611"
id="path2447" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 349.51278,151.30611 L 349.51278,260.40259"
id="path2451" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 454.56865,260.40259 L 30.304576,260.40259"
id="path2453" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 454.56865,353.33662 L 30.304576,353.33662"
id="path2455" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 242.43661,260.40259 L 242.43661,353.33662"
id="path2457" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 30.304576,448.29096 L 697.00526,448.29096"
id="path2459" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.89128971px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 30.304576,558.39759 L 697.00526,558.39759"
id="path2463" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 30.304576,617.99659 L 697.00526,617.99659"
id="path2465" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 34.345184,678.64635 L 701.04587,678.64635"
id="path2467" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 30.284265,737.19459 L 696.98496,737.19459"
id="path2469" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 28.284264,793.76313 L 694.98496,793.76313"
id="path2471" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 28.284263,850.33167 L 694.98496,850.33167"
id="path2473" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 28.284262,910.94083 L 694.98496,910.94083"
id="path2475" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 30.304567,965.52968 L 697.00526,965.52968"
id="path2477" />
<image
y="77.468559"
x="475.68542"
id="image2437"
height="256.77161"
width="238.58885"
sodipodi:absref="D:\ICF_AutoCapsule_disabled\temptemptemp\chameleon.jpg"
xlink:href="chameleon.jpg" />
</g>
</svg>

 
 
このテンプレートをrubyでパースしてtext要素とtspan要素を追加してやろうっていう作戦。とりあえずrailsアプリケーションを作成してscaffoldでまー適当に。ちなみにrails2.3.2。ここでは

script/generate scaffold user name:string hurigana:string sex:integer birthday:date honseki:string address:string url:string keireki1:string keireki2:string keireki3:string keireki4:string keireki5:string

てな感じ。
 
ほいでshow.html.erb にアクション呼び出しを追加。

<%= link_to 'PDF', :controller=>'users', :action=>'outpdf', :id=>@user.id %> 

 
browser.jpg

show.html.erb

 
users_controller にpdfを出力するアクションを追加。とりあえず今はsvgファイルを出力するだけにしとく。

    def outpdf
    @user = User.find(params[:id])

    require "rexml/document"

    now_time = Time.now.strftime("%Y%m%d_%H%M%S")
    out_file_name = "pdf/test"+ now_time +".svg"
    out_doc = REXML::Document.new(open('pdf/templete.svg'))
    
      element1 = REXML::Element.new "text"
      element1.attributes["xml:space"] = "preserve"
      element1.attributes["style"] = "font-size:58.93929672px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element1.attributes["x"] = "53.762455"
      element1.attributes["y"] = "228.96014"
      element1.attributes["id"] = "text2487"
      element1.attributes["sodipodi:linespacing"] = "125%"
      element1.attributes["transform"] = "scale(0.9982159,1.0017872)"
      
      element1_1 = REXML::Element.new "tspan"
      element1_1.attributes["sodipodi:role"] = "line"
      element1_1.attributes["id"] = "tspan2489"
      element1_1.attributes["x"] = "53.762455"
      element1_1.attributes["y"] = "228.96014"
      element1_1.text=@user.name

      element1.add_element element1_1

      element2 = REXML::Element.new "text"
      element2.attributes["xml:space"] = "preserve"
      element2.attributes["style"] = "font-size:35.4600563px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element2.attributes["x"] = "40.934238"
      element2.attributes["y"] = "183.43661"
      element2.attributes["id"] = "text2491"
      element2.attributes["sodipodi:linespacing"] = "125%"
      element2.attributes["transform"] = "scale(1.2948805,0.772272)"

      element2_1 = REXML::Element.new "tspan"
      element2_1.attributes["sodipodi:role"] = "line"
      element2_1.attributes["id"] = "tspan2493"
      element2_1.attributes["x"] = "40.934238"
      element2_1.attributes["y"] = "183.43661"
      element2_1.text=@user.hurigana

      element2.add_element element2_1

      element3 = REXML::Element.new "text"
      element3.attributes["xml:space"] = "preserve"
      element3.attributes["style"] = "font-size:58.10338211px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element3.attributes["x"] = "378.81317"
      element3.attributes["y"] = "226.55891"
      element3.attributes["id"] = "text2495"
      element3.attributes["sodipodi:linespacing"] = "125%"
      element3.attributes["transform"] = "scale(0.9971094,1.0028989)"

      element3_1 = REXML::Element.new "tspan"
      element3_1.attributes["sodipodi:role"] = "line"
      element3_1.attributes["id"] = "tspan2497"
      element3_1.attributes["x"] = "378.81317"
      element3_1.attributes["y"] = "226.55891"
      if @user.sex == 1
        element3_1.text='男性'
      else
        element3_1.text='女性'
      end
      element3.add_element element3_1

      element4 = REXML::Element.new "text"
      element4.attributes["xml:space"] = "preserve"
      element4.attributes["style"] = "font-size:51.12689209px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element4.attributes["x"] = "74.711197"
      element4.attributes["y"] = "228.45775"
      element4.attributes["id"] = "text2499"
      element4.attributes["sodipodi:linespacing"] = "125%"
      element4.attributes["transform"] = "scale(0.6941387,1.4406342)"

      element4_1 = REXML::Element.new "tspan"
      element4_1.attributes["sodipodi:role"] = "line"
      element4_1.attributes["id"] = "tspan2501"
      element4_1.attributes["x"] = "74.711197"
      element4_1.attributes["y"] = "228.45775"
      element4_1.text = @user.birthday

      element4.add_element element4_1

      element5 = REXML::Element.new "text"
      element5.attributes["xml:space"] = "preserve"
      element5.attributes["style"] = "font-size:45.07497787px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element5.attributes["x"] = "102.33903"
      element5.attributes["y"] = "363.53403"
      element5.attributes["id"] = "text2507"
      element5.attributes["sodipodi:linespacing"] = "125%"
      element5.attributes["transform"] = "scale(0.8609203,1.1615477)"

      element5_1 = REXML::Element.new "tspan"
      element5_1.attributes["sodipodi:role"] = "line"
      element5_1.attributes["id"] = "tspan2509"
      element5_1.attributes["x"] = "102.33903"
      element5_1.attributes["y"] = "363.53403"
      element5_1.text = @user.address

      element5.add_element element5_1

      element6 = REXML::Element.new "text"
      element6.attributes["xml:space"] = "preserve"
      element6.attributes["style"] = "font-size:43.30581665px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element6.attributes["x"] = "80.986237"
      element6.attributes["y"] = "549.51605"
      element6.attributes["id"] = "text2511"
      element6.attributes["sodipodi:linespacing"] = "125%"
      element6.attributes["transform"] = "scale(1.0713052,0.9334408)"

      element6_1 = REXML::Element.new "tspan"
      element6_1.attributes["sodipodi:role"] = "line"
      element6_1.attributes["id"] = "tspan2513"
      element6_1.attributes["x"] = "80.986237"
      element6_1.attributes["y"] = "549.51605"
      element6_1.text = @user.url

      element6.add_element element6_1

      element7 = REXML::Element.new "text"
      element7.attributes["xml:space"] = "preserve"
      element7.attributes["style"] = "font-size:45.51148224px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element7.attributes["x"] = "116.97383"
      element7.attributes["y"] = "715.46594"
      element7.attributes["id"] = "text2515"
      element7.attributes["sodipodi:linespacing"] = "125%"
      element7.attributes["transform"] = "scale(1.1898328,0.8404542)"

      element7_1 = REXML::Element.new "tspan"
      element7_1.attributes["sodipodi:role"] = "line"
      element7_1.attributes["id"] = "tspan2517"
      element7_1.attributes["x"] = "116.97383"
      element7_1.attributes["y"] = "715.46594"
      element7_1.text = @user.keireki1

      element7.add_element element7_1

      element8 = REXML::Element.new "text"
      element8.attributes["xml:space"] = "preserve"
      element8.attributes["style"] = "font-size:45.51148224px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element8.attributes["x"] = "109.71171"
      element8.attributes["y"] = "786.03296"
      element8.attributes["id"] = "text2519"
      element8.attributes["sodipodi:linespacing"] = "125%"
      element8.attributes["transform"] = "scale(1.1898328,0.8404542)"

      element8_1 = REXML::Element.new "tspan"
      element8_1.attributes["sodipodi:role"] = "line"
      element8_1.attributes["id"] = "tspan2521"
      element8_1.attributes["x"] = "109.71171"
      element8_1.attributes["y"] = "786.03296"
      element8_1.text = @user.keireki2

      element8.add_element element8_1

      element9 = REXML::Element.new "text"
      element9.attributes["xml:space"] = "preserve"
      element9.attributes["style"] = "font-size:62.85676575px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic"
      element9.attributes["x"] = "258.85812"
      element9.attributes["y"] = "357.03894"
      element9.attributes["id"] = "text2503"
      element9.attributes["sodipodi:linespacing"] = "125%"
      element9.attributes["transform"] = "scale(1.0984637,0.9103624)"

      element9_1 = REXML::Element.new "tspan"
      element9_1.attributes["sodipodi:role"] = "line"
      element9_1.attributes["id"] = "tspan2505"
      element9_1.attributes["x"] = "258.85812"
      element9_1.attributes["y"] = "357.03894"
      element9_1.text = @user.honseki

      element9.add_element element9_1


      out_doc.elements["svg/g"].add_element element1
      out_doc.elements["svg/g"].add_element element2
      out_doc.elements["svg/g"].add_element element3
      out_doc.elements["svg/g"].add_element element4
      out_doc.elements["svg/g"].add_element element5
      out_doc.elements["svg/g"].add_element element6
      out_doc.elements["svg/g"].add_element element7
      out_doc.elements["svg/g"].add_element element8
      out_doc.elements["svg/g"].add_element element9

   File.open(out_file_name,"w") do |outfile|
     out_doc.write(outfile, 0)
   end
  end

 
とにかく愚直に上でテンプレートファイル作るときに削除したtext要素とtspan要素を追加していった。文字幅とかどうするかなー。。これでshow画面から”PDF”をクリック。名前とかは特殊文字とかpdf-writerでダメだった文字に変えてみた。pdf/ に作成されたsvgファイルが↓

<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svg='http://www.w3.org/2000/svg' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' inkscape:output_extension='org.inkscape.output.svg.inkscape' id='svg2383' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' inkscape:version='0.46' sodipodi:version='0.32' height='297mm' sodipodi:docname='templete.svg' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://www.w3.org/2000/svg' width='210mm'>
<defs id='defs3'>
<inkscape:perspective inkscape:vp_x='0 : 526.18109 : 1' inkscape:persp3d-origin='372.04724 : 350.78739 : 1' inkscape:vp_y='0 : 1000 : 0' inkscape:vp_z='744.09448 : 526.18109 : 1' sodipodi:type='inkscape:persp3d' id='perspective2389'/>
<inkscape:perspective inkscape:vp_x='0 : 526.18109 : 1' inkscape:persp3d-origin='372.04724 : 350.78739 : 1' inkscape:vp_y='0 : 1000 : 0' inkscape:vp_z='744.09448 : 526.18109 : 1' sodipodi:type='inkscape:persp3d' id='perspective2550'/>
<inkscape:perspective inkscape:vp_x='0 : 526.18109 : 1' inkscape:persp3d-origin='372.04724 : 350.78739 : 1' inkscape:vp_y='0 : 1000 : 0' inkscape:vp_z='744.09448 : 526.18109 : 1' sodipodi:type='inkscape:persp3d' id='perspective2567'/>
<inkscape:perspective inkscape:vp_x='0 : 526.18109 : 1' inkscape:persp3d-origin='372.04724 : 350.78739 : 1' inkscape:vp_y='0 : 1000 : 0' inkscape:vp_z='744.09448 : 526.18109 : 1' sodipodi:type='inkscape:persp3d' id='perspective2429'/>
<inkscape:perspective inkscape:vp_x='0 : 526.18109 : 1' inkscape:persp3d-origin='372.04724 : 350.78739 : 1' inkscape:vp_y='0 : 1000 : 0' inkscape:vp_z='744.09448 : 526.18109 : 1' sodipodi:type='inkscape:persp3d' id='perspective2431'/>
<inkscape:perspective inkscape:vp_x='0 : 526.18109 : 1' inkscape:persp3d-origin='372.04724 : 350.78739 : 1' inkscape:vp_y='0 : 1000 : 0' inkscape:vp_z='744.09448 : 526.18109 : 1' sodipodi:type='inkscape:persp3d' id='perspective2435'/>
</defs>
<sodipodi:namedview inkscape:cy='623.80647' inkscape:current-layer='layer1' inkscape:window-width='974' pagecolor='#ffffff' showgrid='false' inkscape:pageshadow='2' inkscape:window-x='439' id='base' bordercolor='#666666' inkscape:window-y='-1' inkscape:document-units='mm' inkscape:zoom='0.49497475' inkscape:window-height='666' borderopacity='1.0' inkscape:cx='401.35844' inkscape:pageopacity='0.0'/>
<metadata id='metadata4'>
<rdf:RDF>
<cc:Work rdf:about=''>
<dc:format>
image/svg+xml
</dc:format>
<dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:groupmode='layer' id='layer1' inkscape:label='Layer 1'>
<text transform='scale(1.0435025,0.9583111)' x='22.938391' y='83.420784' id='text2403' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:65.77341461px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='22.938391' y='83.420784' sodipodi:role='line' id='tspan2405'>
履歴書
</tspan>
</text>
<path d='M 26.263966,111.91017 L 458.60926,111.91017' id='path2433' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.89128971px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 30.26396,1010.1662 L 30.26396,113.05536' id='path2435' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:5.60533047px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 456.58895,357.69693 L 456.58895,112.60063' id='path2439' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.92985797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 455.2591,355.33662 L 700.3554,355.33662' id='path2441' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.92985797px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 699.02556,1010.8765 L 699.02556,358.49737' id='path2443' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4.78000402px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 27.555326,1011.9764 L 699.7951,1011.9764' id='path2445' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4.8522172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 32.324881,151.30611 L 454.56865,151.30611' id='path2447' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 349.51278,151.30611 L 349.51278,260.40259' id='path2451' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 454.56865,260.40259 L 30.304576,260.40259' id='path2453' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 454.56865,353.33662 L 30.304576,353.33662' id='path2455' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 242.43661,260.40259 L 242.43661,353.33662' id='path2457' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 30.304576,448.29096 L 697.00526,448.29096' id='path2459' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 30.304576,558.39759 L 697.00526,558.39759' id='path2463' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.89128971px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 30.304576,617.99659 L 697.00526,617.99659' id='path2465' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 34.345184,678.64635 L 701.04587,678.64635' id='path2467' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 30.284265,737.19459 L 696.98496,737.19459' id='path2469' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 28.284264,793.76313 L 694.98496,793.76313' id='path2471' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 28.284263,850.33167 L 694.98496,850.33167' id='path2473' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 28.284262,910.94083 L 694.98496,910.94083' id='path2475' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<path d='M 30.304567,965.52968 L 697.00526,965.52968' id='path2477' style='fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
<image xlink:href='chameleon.jpg' x='475.68542' y='77.468559' id='image2437' sodipodi:absref='D:\ICF_AutoCapsule_disabled\temptemptemp\chameleon.jpg' height='256.77161' width='238.58885'/>
<text transform='scale(0.9982159,1.0017872)' x='53.762455' y='228.96014' id='text2487' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:58.93929672px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='53.762455' y='228.96014' sodipodi:role='line' id='tspan2489'>
薙野①⑳\¥十―
</tspan>
</text>
<text transform='scale(1.2948805,0.772272)' x='40.934238' y='183.43661' id='text2491' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:35.4600563px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='40.934238' y='183.43661' sodipodi:role='line' id='tspan2493'>
なぎのゆうき
</tspan>
</text>
<text transform='scale(0.9971094,1.0028989)' x='378.81317' y='226.55891' id='text2495' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:58.10338211px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='378.81317' y='226.55891' sodipodi:role='line' id='tspan2497'>
男性
</tspan>
</text>
<text transform='scale(0.6941387,1.4406342)' x='74.711197' y='228.45775' id='text2499' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:51.12689209px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='74.711197' y='228.45775' sodipodi:role='line' id='tspan2501'>
1985-01-20
</tspan>
</text>
<text transform='scale(0.8609203,1.1615477)' x='102.33903' y='363.53403' id='text2507' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:45.07497787px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='102.33903' y='363.53403' sodipodi:role='line' id='tspan2509'>
横浜市旭区
</tspan>
</text>
<text transform='scale(1.0713052,0.9334408)' x='80.986237' y='549.51605' id='text2511' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:43.30581665px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='80.986237' y='549.51605' sodipodi:role='line' id='tspan2513'>

http://bugcloud.com/

</tspan>
</text>
<text transform='scale(1.1898328,0.8404542)' x='116.97383' y='715.46594' id='text2515' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:45.51148224px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='116.97383' y='715.46594' sodipodi:role='line' id='tspan2517'>
みなぎ小学校卒業
</tspan>
</text>
<text transform='scale(1.1898328,0.8404542)' x='109.71171' y='786.03296' id='text2519' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:45.51148224px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='109.71171' y='786.03296' sodipodi:role='line' id='tspan2521'>
十文字中学校卒業
</tspan>
</text>
<text transform='scale(1.0984637,0.9103624)' x='258.85812' y='357.03894' id='text2503' xml:space='preserve' sodipodi:linespacing='125%' style='font-size:62.85676575px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:MS PGothic;-inkscape-font-specification:MS PGothic'>
<tspan x='258.85812' y='357.03894' sodipodi:role='line' id='tspan2505'>
福岡県
</tspan>
</text>
</g>
</svg>

 
firefoxで開くと
 
browse_svg.jpg

browse_svg

 
ん?いいんじゃないか?以外にも。特殊文字とかも普通に表示できてる。じゃあpdfにしてみようよってことで、rsvg-convert を実行。
 
pdf_adobe.jpg

pdf

 
んあ、ずれた。フリーズしたよわたしゃ。。librsvg なのか svg ファイルの問題なのか rexml がいらんことしたのか検討つかん。。単純にtext要素とtspan要素の属性yとかを変えてやればいいんだろうけど、テンプレート作った後に毎回調整っていのはださいなー。うーん、ゴールまでが東京 – 大阪間ぐらい遠い。
 
 

2009/06/12 追記

outpdfアクションで出力されたsvgファイルがおかしいみたい。手でtext要素とtspan要素の属性の順番を変えてみたらいい感じだった。属性の順番ってattributesのオプションとかで指定できるの?できなそうだけど。。
 
 

Technorati Tags:

Rails + RMagick + RadRails

Standard
Rails + RMagick + RadRails

母の日に刺身用白エビなるものを送ったら、かき揚げにして食されたようです。冷凍じゃないやつを買った意味なしwこんばんわ、ジョン.B.チョッパーです。クニヒロさんも言ってましたが、ゴールデンウィークに海外旅行に行って日本に新型インフルエンザ持ち込んだ人は有罪でいいと思います。我慢をしろよ旅行ぐらい。こっちはお金ないからいろいろ我慢して引きこもってたっていうのに。そばとラーメンしか食べてないっちゅうねん。

だいぶ前に買った「Ruby on RailsによるWebアプリケーションスーパーサンプル」がビミョーに残っていたのでやりました。今日はそのメモ。

Cover image is not found
amazon.co.jpで詳細情報を見る


自分の環境は、ruby – 1.8.6 、Rails – 2.3.2(windows – InstantRails) 、eclipse3.4.1 にAptanaのRadRailsを入れてます。この本はRails1.2.6を採用して書かれてるので2.0以降との違いで時々つまづいてたんですが、今日すごくハマリました。。結局バージョンは関係なかったんですけどww

CHAPTER6でグラフ作成ライブラリのGruffを使うところがあるんですが、まずは本の通りにImageMagickRMagickGruffをインストール。で、config/environment.rbに” require ‘gruff’ “を追加。と、ここでサーバを起動すると落ちる。” no such file to load — gruff (MissingSourceFile) “とかって怒られる。いろいろ検索して解決せずに、この辺を参考にまずは正常にGruffがインストールできてるか確認する。あ、できたし。。(リンク先のソースは、” require_gem ‘gruff’ “を” require ‘gruff’ “にすれば動く)公式からたどってったGruff Graph 0.0.7 and Rails
にはgruffのパッケージを解凍してrailsappname/libにコピーしなさい的なことが書いてあるので、やってみるが、こっからハマる。今度はRMagickがないよって怒られて、RMagicもコピーしたらRMagick2がないよって怒られた。パスも入れてみたり四苦八苦した挙げ句、” .soファイルはJRubyではあつかえないよ “って感じのエラーがでた。あ、ああああああ。まったくもって意識しなかったけど、eclipse使って動かそうとしてるってことはJRubyってこと?ていうかその辺よくわかってねーし。そういえばActiveRecord-JDBCとか普通に入ってんな。。調べたらありました、RMagic4j。これか。最終的に、rubyのgemの下(ボクのだと、” C:\InstantRails\ruby\lib\ruby\gems\1.8\gems “)にあるgruff-0.3.4とrmagick4j-0.3.7をそっくりrailsappname/vendor/pluginsの下にコピーで解決。(railsappname/vendor/pluginsの下は勝手によんでくれるので、config/environment.rbは編集いらない)グラフを画像で表示してくれた。
 
myapp.jpg

でけたグラフ

 
いやーホント、初心者でいかんね。
 
 
P.S.
derbyいいね。なにがいいかって聞かれたらまったくわからんけど、ピュアjavaなところと、Apcheなところがかっこいいからいいんじゃないかw
 
 

Technorati Tags: , ,

my job’s memo

Standard
my job's memo

Webサービスクライアントの開発でつまずいたのでメモ。
知識がないって悔しい上に恥ずかしいね。
 
 

DataSetオブジェクト

 
 
Webサービスサーバ側のシステムプラットフォームはASP.NET
クライアント側はJava2EE
で、今回の開発はクライアント側の開発
 
 
要件の時点で相手側(サービス側システム)の主管からは
「こっちで用意してる既存のWebサービスを利用してもらえばデータのやりとりはOKだから全部あわせてね」
って感じで言われていた。(実際は向こうのシステムも開発中)
 
 
I/Fの設計書とかをもらって、とりあえず初体験のWebサービスの概要設計書を書いてみる。
(いま思えば、ここでちゃんと勉強しとけばよかったわけですけども)設計終わって
じゃーそろそろ製造したいからWDSLファイルくださいよっつって、相手側の開発担当者と
打ち合せしてるときに言われたのが、
 
「ちなみにそちらの言語はなんですか?」
「Javaですが」
「Javaかー。既存のクライアントの中にjavaのシステムが1つあるんですけど、DataSet型がうまく扱えないみたいな話がでてるんですよねー。」
「ん?」
 
 
んで、まーちょっと調べてみました。DataSetって?
http://www.atmarkit.co.jp/fdotnet/basics/adonet04/adonet04_01.html
 
javaと.NETでWebサービス
http://blogs.sqlpassj.org/akiraonishi/articles/4244.aspx
http://d.hatena.ne.jp/kkamegawa/20080926/p1
 
 
何その「いや普通に使えないよ」的な空気!なんで知らないんだろうなオレのあほーっ
結局むこうが対応してくれるわけもなく、こっちで解決策を考えないといけないっすよね
いやーしかし、調べてみるとつくづく常識みたいな感じですね。
今回は複雑なデータもらうわけじゃないので、XMLからDOMを利用して必要な情報だけとればいいのかな。
 
http://yamarou.at.infoseek.co.jp/javanawake/002.html
 
中国人プログラマに聞いたら、WDSLファイルをどの言語でも使えるように記述し直して、もっかいweblogicでクラスファイル生成すればうまいこといくアルよって言われたけど、どうなの?wできなそうな気がするけども?????
 
 
相手側のシステムの人からは↓の利用を検討してくださいっていう感じでメールがきたけれども
http://kickjava.com/src/groovy/sql/DataSet.java.htm
 
↑使ったら、相手からもらったDataSetオブジェクトがJavaで扱えるってこと?
仕組みがわからぬよいろいろと。ふごーふごー
 
 
 

Cover image is not found
amazon.co.jpで詳細情報を見る



 

Technorati Tags: , ,