開発^3

Web開発、宇宙開発、ゲーム開発の3種類についてつらつらと

ruby 1.9.3 + libharu 2.1.0 + 手軽に高橋メソッドな PDF v2

高橋メソッドをやろうと思う

Google Docsのプレゼンテーションはフォントサイズに限界値があることを知る

変換ツール手軽に高橋メソッドな PDF v2)を見つける

結構古いので動かすのに手間取る

動いた←いまここ

というわけで、忘れないうちにメモを残しておきます。

試した環境はさくらVPS、rvm使ってruby1.9.3をインストール済

1. libharu 2.1.0のインストール

現時点で最新は2.3.0RC2、Stableでも2.2.1があるっぽいですが、元サイトにあるパッチが2.1.0用なので2.1.0を取ってきてインストールします。


png.hが必要になるので入ってない場合はlibpngをインストール。後はいつもの通り。

$ sudo yum install libpng
$ sudo yum install libpng-devel

$ wget http://libharu.org/files/libharu-2.1.0.tar.gz
$ tar zxvf libharu-2.1.0.tar.gz
$ cd libharu-2.1.0

手軽に高橋メソッドな PDF v2の最後に載っているパッチをpatch.txtとして用意し、パッチ適用。

$ patch -p0 < ../patch.txt
$ ./configure
$ make
$ sudo make install
2. rubyインターフェイスのインストール

続いてrubyからhpdfを使えるように。
ただ、libhpdf 2.1.0付属のをそのまま入れると、STR2CSTRマクロがなくなっている為にruby 1.9系ではエラる。

ruby: symbol lookup error: /usr/local/rvm/rubies/ruby-1.9.3-p125/lib/ruby/site_ruby/1.9.1/x86_64-linux/hpdf.so: undefined symbol: STR2CSTR

ので、先にSTR2CSTRをStringValuePtrに置換してからインストール。

$ cd libharu-2.1.0/if/ruby/
$ vi hpdf.c # 全置換
$ ruby extconf.rb
$ make
$ make install
3. 手軽に高橋メソッドな PDF v2を入れる

手軽に高橋メソッドな PDF v2からソースをコピペして実行ファイルのt2pdf.rbと、入力データとなるt5.txtを作成。


t2pdf.rbを幾つか修正。変更点は以下の通り

  • rvm使ってるのでrubyのパスを変更
  • ソースコードをUTF8で保存するのでMagic comment追加
  • 入力ファイルのデフォルトをUTF8に(というかめんどいのでEUC-JP対応を消して入れかえ)
--- t2pdf.rb    2012-06-04 00:50:28.954321256 +0900
+++ t2pdf.rb.bak        2012-06-04 00:43:42.867116231 +0900
@@ -1,5 +1,4 @@
-#!/usr/bin/env ruby
-# -*- coding: utf-8 -*-
+#! /usr/local/bin/ruby -Ke
 # /home/tetsu/src/ruby/pdf/t5pdf.rb
 # created: April 15,2007 Sunday 23:26:24
 # author: tetsu(WATANABE Tetsuya)
@@ -25,11 +24,11 @@
 
 # Ruby 1.9 系なら不要ですが、文字化けを回避するために入力も固定
 class String
-  def w2s
-    NKF.nkf('-Ws', self)
+  def e2s
+    NKF.nkf('-Es', self)
   end
-  def s2w
-    NKF.nkf('-Sw', self)
+  def s2e
+    NKF.nkf('-Se', self)
   end
 end
 
@@ -175,7 +174,7 @@
     @jp_font = @pdf.get_font('MS-PGothic', @encode)
     @font_h['MS-PGothic'] = @jp_font
     @encoder = @pdf.get_encoder(@encode)
-    @root = @pdf.create_outline(nil, '目次'.w2s, @encoder);
+    @root = @pdf.create_outline(nil, '目次'.e2s, @encoder);
     @page_size = HPDFDoc::HPDF_PAGE_SIZE_A4
     @page_direction = HPDFDoc::HPDF_PAGE_LANDSCAPE
     @m = 20
@@ -253,7 +252,7 @@
         break
       end
     end
-    @pdf.create_outline(@root, @pagenumber.to_s + ' ' + msg.w2s, @encoder).set_destination(page.create_destination) if msg
+    @pdf.create_outline(@root, @pagenumber.to_s + ' ' + msg.e2s, @encoder).set_destination(page.create_destination) if msg
   end
 
   def logo_load(filename)
@@ -378,7 +377,7 @@
 
     arr.each_index do |i|
       if arr[i] =~ /^\/\/h (.+)$/
-        l = $1.w2s
+        l = $1.e2s
         x = (w - page.text_width(l)) / 2
         page.set_rgb_fill(*color_make(@h_color))
         page.begin_text
@@ -397,7 +396,7 @@
     page.set_font_and_size(@jp_font, size)
     y = 2
 
-    l = a.w2s
+    l = a.e2s
     x = (w - page.text_width(l)) / 2
     page.set_rgb_fill(*color_make(@h_color))
     page.begin_text
@@ -420,7 +419,7 @@
       if l =~ /^(.+):(http:\/\/\S+)$/
         l = $1
       end
-      text_width = page.text_width(l.w2s)
+      text_width = page.text_width(l.e2s)
       len = text_width if text_width > len
     end
 
@@ -449,7 +448,7 @@
         l = $1
         url = $2
       end
-      l = l.w2s
+      l = l.e2s
       # 行頭が半角スペースの場合ソースコード用
       x = if l[0, 1] == ' '
             l[0] = ''
@@ -571,7 +570,7 @@
 
   while b = f.gets("\n\n")
     if opt_SJIS
-      b = b.s2w
+      b = b.s2e
     end
     b_arr.push(b)
   end

4. 動作確認

$ chmod a+x t2pdf.rb
$ ./t2pdf.rb -p -n t5.txt

t5.pdfができてればOK。PDFの中身を確認して文字化けしてる場合は元ファイルがUTF-8になっているか確認を。