$B"#(B $B

$B%F%-%9%H%U%!%$%k$H$7$F$B9b66%a%=%C%I(B $B$J%W%l%<%s%F!<%7%g%s!W$r:n@.$7$F(B PDF $B2=$7$F$7$^$$$^$7$g$&!#(B $B=`Hw$,$G$-$F$7$^$($P!"$H$C$F$b

$B0JA0(B PDFlib $B$r;HMQ$7$?$[$\F1Ey$N$b$N(B($B:#2s$O!V$Y$D$d$/%a%=%C%I!W$H!V%$%a!<%8!W$d!V%m%4!W$N%5%]!<%H$NDI2C(B)$B$r(B $B!V(B $B (OLD) $B!W(B $B$H$7$F:n@.$7$F$$$?$N$G$9$,(B PDFlib $B$N%i%$%;%s%9$b$"$j!"$$$$(B PDF $B$N%i%$%V%i%j$rC5$7$F$$$^$7$?!#(B $B:#2s$9$P$i$7$$(B PDF $B%i%$%V%i%j$H$G$"$($^$7$?$N$G!"5!G=3HD%$b4^$a$F?7$7$/%9%/%j%W%H$r=q$$$F$_$^$7$?!#(B

PDF $B%i%$%V%i%j$H$7$F(B Haru Free PDF Library II $B$r;H$o$;$F$$$?$@$-$^$7$?!#(B $B$"$j$,$H$&$4$6$$$^$9!#(B Ruby $B$N$?$a$N%5%]!<%H$b$"$j$^$9!#(B $B$<$R(B PDF $B$rD>@\:n@.$9$k>l9g$K8!F$$7$F$_$F$/$@$5$$!#(B $B$H$F$b$$$$$G$9!#(B

2007/5/17 $B8=:_(B

  • ruby 1.9.0 (2007-05-15 patchlevel 0) [i686-linux]
  • ruby 1.8.5 (2006-08-25) [i386-linux]
$B$GF0:n3NG'$r$7$F$$$^$9!#(B

$B:#8e%5%s%W%k$N(B PDF $B$d

$B"#(B $B;H$$J}(B

$B9b66%a%=%C%I$JFbMF$N%F%-%9%H%U%!%$%k$r:n@.$7$^$9!#(B $B:n@.$N$?$a$N%k!<%k$O!"(B

  • $B6uGr9T$,$"$k$H2~%Z!<%8(B
  • $B0l9T$O0l9T(B
  • $B9T$N@hF,$,!VH>3Q%9%Z!<%9!W$N>l9g$O(B Wiki $B5-K!$HF1$8$h$&$K$=$N$^$^=PNO(B
  • $B9T$N@hF,$,!V(B//$B!W$N>l9g$K$O!"%3%a%s%H!V%$%a!<%8$J$I$r07$($k3HD%%3%^%s%I$"$j!W(B
  • $B8=:_F~NO%F%-%9%H$N4A;z%3!<%I$O(B EUC-JP $B$G$9(B
  • -S $B%*%W%7%g%s$r;XDj$9$k$3$H$GF~NO%F%-%9%H$G(B SJIS $B$N4A;z%3!<%I$r07$($^$9(B
  • adobe reader $B$O(B URL $B$r(B URL $B$H$7$FG'<1$7$^$9$,!"(BURL $B$NKd$a9~$r%5%]!<%H(B
  • $B!V(BL:$BJ8;zNs!W$G:84s$;!"!V(BR:$BJ8;zNs!W$G1&4s$;$K$J$j$^$9(B
$B$G$9!#(B

$B7k2L$H$7$F$N=PNO$O!"(B

  • $B$G$-$k$@$1Bg$-$J%U%)%s%H$G%Z!<%8$$$C$Q$$$K(B
  • $B9T$O%;%s%?%j%s%0$5$l$^$9(B
  • PDF $B>e$O(B A4 $B2#%5%$%:(B
  • acrobat(Adobe Reader)$B$G%W%l%<%s%F!<%7%g%s$9$k$H$-$K$O%U%k%9%/%j!<%s%b!<%I(B($BI=<(%a%K%e!<$+$i(B)$B$G(B
  • $BFI$_>e$25!G=$,M-8z$N>l9g$K;H$($^$9(B $BFI$_>e$2$K$O(B MS Office 2003/XP $B$J$I$,I,MW$G$9(B MS Office 2007 $B$O$@$a$G$7$?(B(T-T)
$B$G$9!#(B

$B Ruby $B$G:n$C$?(B //l tetsu.jpg //f uzura.ttf $B9b66(B $B%a%=%C%I(B PDF $BJQ49(B $B%9%/%j%W%H(B $BF~NO$O(B $B%F%-%9%H(B $B%U%!%$%k(B $B$H$C$F$b(B $B $B$H$$$&F~NO%U%!%$%k$+$i!"t5.pdf ) 1.6MB $B$,:n@.$G$-$^$9!#(B $B%$%a!<%8$,F~$C$F$$$F$9$3$7Bg$-$/$J$C$F$$$^$9!#(B $B$3$N=PNO$G$O $ t2pdf.rb -p -g t5.txt $BF~NO%U%!%$%kL>$,(B t5.txt $B$N>l9g!"=PNO%U%!%$%kL>$O(B t5.pdf $B$K$J$j$^$9!#(B

$B%*%W%7%g%s(B

$B%*%W%7%g%s$O!"
$B%*%W%7%g%s(B$B@bL@(B
-p$B%Z!<%8HV9f$r=PNO(B
-SSJIS $B$NF~NO%F%-%9%H$N%5%]!<%H(B
-g$BGX7J$K%0%j%C%I$rI=<((B
-n$BF~NO$N%F%-%9%H$K30It%U%!%$%k$rMxMQ$9$k%*%W%7%g%s$,$"$C$?>l9g$KL5;k$7$^$9(B(//f, //i, //l)
-f TrueTypeFontPATHTrueType $B%U%)%s%H$r;HMQ$7$^$9(B
-l LogoImagePATH(jpeg,png)$B%m%4$K%$%a!<%8$r;XDj$9$k$3$H$,2DG=$G$9(B Jpeg $B$H(B PNG $B$r%5%]!<%H$7$F$$$^$9(B
-a$B%"%s%A%g%3(B($B.$5$/I=<($7$^$9(B

TrueType $B%U%)%s%H(B

TrueType $B%U%)%s%H$r;XDj$9$k$3$H$,2DG=$G$9!#(B $BK\J8$G;XDj$b2DG=$G$9$,!"K\J8$rJQ99$;$:$KB?$/$N%U%!%$%k$r07$&>l9g$O!"%*%W%7%g%s$r;XDj$/$@$5$$!#(B TrueType $B%U%)%s%H$K$h$C$F$OF0:n$7$J$$$b$N$b$"$k$h$&$G$9!#(B $B$^$?!"%l%$%"%&%HE*$Kl9g$O!"$=$N%U%)%s%H$O%5%]!<%H$7$F$$$J$$%?%$%W$J$N$GJL$N%U%)%s%H$r;XDj$7$F$/$@$5$$!#(B $B%U%)%s%H%U%!%$%k$N3HD%;R$O!"!V(B.ttf$B!W$N$_$N$h$&$G$9!#(B $B%m!<%I$G%(%i!<$,$G$J$$>l9g$G$b(B PDF $B%U%!%$%k$r:n@.$9$kCJ3,$G%(%i!<$K$J$k>l9g$b$"$k$h$&$G$9!#(B

$B$3$3$K=q$$$?%U%)%s%H$K$D$$$F$O!"$"$kDxEY3NG'$7$?$D$b$j$G$9$,!"$b$7$+$9$k$H$&$^$/F0:n$7$J$$$+$b$7$l$^$;$s!#(B $B$=$N$H$-$O$9$$$^$;$s$G$9!#(B

TrueType $B$N%U%)%s%H$G$9$,!"BQ5W%F%9%HE*$K$?$/$5$s$N%U%)%s%H$r;HMQ$7$F$_$^$7$?!#(B $BF1;~$K$+$J$j$N?t$r;H$&$3$H$,2DG=$G$9!#(B $B;d$N$3$3$N%9%/%j%W%H$G$O!"0l%Z!<%8$K0l%U%)%s%H$K$J$C$F$$$k$N$G$9$,!"$b$C$H<+M3EY$r;}$?$;$F$bBg>fIW$=$&$G$9!#(B $B$?$@$7!"%U%)%s%H$N%?%$%W$K$h$C$F$O%(%i!<$K$J$k>l9g$b$"$j$^$9!#(B $B$9$Y$F$N%U%)%s%H$,;H$($k$o$1$G$O$"$j$^$;$s$N$G!"?7$7$$%U%)%s%H$r;HMQ$9$k>l9g$O3NG'$7$J$,$i?J$a$F$/$@$5$$!#(B

// $B7O$N5!G=(B

v2 $B$G$N3HD%5!G=$O!"!V(B//$B!W$N%3%a%s%H$KBP$7$F$J$I!W$K$J$j$^$9!#(B

//i $B%$%a!<%8%U%!%$%kL>(B
//l $B%m%4%$%a!<%8%U%!%$%kL>(B   $B%5%$%:$OBg$-$9$.$J$$$h$&$K(B
//f TrueType$B%U%)%s%HL>(B
//%$B?t;z(B $BJ8;zNs(B               $B$Y$D$d$/%a%C%=%IE*$K1_%0%i%U$r=q$-$^$9(B
//h $B%X%C%@J8;zNs(B             $B%Z!<%8$N@hF,$KJ8;zNs$r!V@D!W$G=PNO$7$^$9(B
//c r,g,b r,g,b r,g,b        $BJ8;z?'!"GX7J?'!"%X%C%@?'(B
$B%$%a!<%8$NI=<($O!"Cf1{$K$I!<$s$H5/$-$^$9!#(B $B9b66%a%=%C%IE*$K%$%a!<%8$b07$C$F$$$^$9!#(B

$B%m%4$O!">.$5$a$N%$%a!<%8I=<($K$J$j$^$9!#(B

$B!V$Y$D$d$/%a%=%C%I!W$N$?$a$K1_%0%i%U:n@.5!G=$rMQ0U$7$^$7$?!#(B

//%50 $B4|BT$G$o$/$o$/(B
//%30 $B$,$s$P$C$?!<(B
//%15 $BHh$l$?(B($B$((B
//% $B$A$g$C$T$jIT0B(B
$B$HF~NO$9$k$3$H$G!"!V$Y$D$d$/%a%=%C%I!WE*$J1_%0%i%U$N!V9b66%a%=%C%I!WE*$JJ8;zI=<($r9T$J$C$F$$$^$9!#(B $B$"$kDxEY1s$/$G$b$_$($k$h$&$K!#(B $BK\Ev$OJ8;z0LCV$O$A$c$s$HD4@0$G$-$l$P$$$$$N$G$9$,!"$J$+$J$+Fq$7$$$N$H1s$/$G$_$K$/$/$J$C$F$O!"$3$N%D!<%k$H$7$F$N0UL#$,$J$$$N$G(B($B$$$$$o$1(B

$B!V%X%C%@!W$K$D$$$F$O!"J8;zNs$,>.$5$/H/I=

$B?';XDj$G$9$,!"(Br,g,b $B$r:GBgCM(B 1 $B$N>.?tE@$G;XDj$7$F$/$@$5$$!#(B $BGr!V(B1,1,1$B!W9u!V(B0,0,0$B!W@D!V(B0,0,1$B!W3%?'!V(B0.5,0.5,0.5$B!W$J$I$G$9!#(B $B!V(Br,r,r$B!W$N$h$&$K$9$k$H!"%i%s%@%`$K?'$r@8@.$7$^$9!#(B

$B3HD%$r4^$s$@%5%s%W%k$G$9!#(B

$B=U(B
$B:y(B
//i $B:y$N%$%a!<%8%U%!%$%k(B
//l $B<+A0%m%4(B
//h $B:y$O$$$$$G$9$M(B

//%60 $B$$$^$N5$;}(B
//%30 $B$A$g$C$H4|BT(B
//% $BIT0B$b$9$3$7(B
//h $B=U!":y$N%$%a!<%8$K$D$$$F$N5$;}(B

URL $B$NKd$a9~$_(B

URL $B$rKd$a9~$s$@(B PDF $B$r:n@.$G$-$^$9!#(B $BJ8;zNs$N$"$H$K!V(B :http://... $B!W$H%3%m%s(B(:)$B$N$"$H$K(B URL $B$r=q$$$F$/$@$5$$!#(B

Ruby:http://www.ruby-lang.org/
$B$3$N>l9g$OKd$a9~$_$G$9$,!"(Badobe reader $B$O!"(BURL $BJ8;zNs$r$=$N$^$^(B URL $B$H$7$F2r

$BA0Ds$7$F$$$k$3$H(B

$B8=:_$NA0Ds>r7o$O!"(B

  • Linux $B>e$G$N=hM}$rA[Dj$7$F$$$^$9(B
    • $B4A;z%3!<%I$HI,MW$J%i%$%V%i%j$r%$%s%9%H!<%k$9$k$3$H$G(B Win $B7O$G$bF0$/$H$O;W$$$^$9(B
  • $BF~NO%U%!%$%kL>$N3HD%;R$O(B .txt $B$G$*4j$$$7$^$9(B
  • $B=PNO%U%!%$%kL>$O!"F~NO%U%!%$%kL>$N3HD%;R(B .txt $B$r(B .pdf $B$KJQ99$7$?$b$N$G$9(B
  • $B0l9T$"$?$j$NJ8;z?t$,$9$/$J$$$?$aF~NO$N4A;z%3!<%I$N<+F0H=Dj$,Fq$7$$$G$9(B
    • $B8=:_$N%G%U%)%k%H$NF~NO4A;z%3!<%I$O(B EUC-JP $B$rA[Dj$7$F$$$^$9(B
    • SJIS $B$r;HMQ$9$k>l9g$O(B -S $B%*%W%7%g%s$r;HMQ$7$F$/$@$5$$(B
$B$G$9!#(B

$B0u:~(B

$B$b$7$b;f$K0u:~$9$k$H$-$K$O!"%=!<%9%3!<%I$J$7$N>l9g;f0lKg$K(B 16 $B%Z!<%8$/$i$$$G$A$g$&$I$$$$$N$G$O$J$$$G$7$g$&$+(B? $B%=!<%9%3!<%I$,$"$k>l9g$O$"$o$;$FD4@0$/$@$5$$!#(B

$BFI$_>e$2$N$?$a$K(B

$B>r7o$,$$$/$D$+$"$k$N$G$9$,!"(Badobe reader $B$GF|K\8l$rFI$_>e$2$k$?$a$N(B FAQ $B$G$9!#(B

$BF|K\8l$NFI$_>e$2%(%s%8%s$O(B MS Office 2003 $B$^$?$O(B MS Office XP $B$r$*;}$N>l9gDI2C5!G=$GBP1~2DG=$G$9!#(B MS Office 2007 $B$O!"BP1~$7$F$$$J$$$h$&$G$9!#(B $B$3$N(B FAQ $B$G=q$+$l$F$$$k(B MS Office $B$,$J$$>l9g$NNc$O(B Windows XP $BI8=`$N!V(BSAPI5$B!WFI$_>e$2%(%s%8%sMQ$G$O$J$/!V(BSAPI4$B!WFI$_>e$2%(%s%8%sMQ$G$9!#(B $B$3$N$?$a%$%s%9%H!<%k$7$F$b%3%s%H%m!<%k%Q%M%k$N!V2;@e5-$N(B FAQ $B$NDL$j$KF~$l$F$_$F$/$@$5$$!#(B $B;d$N>l9g$O!"(Badobe reader $B$+$iF|K\8l$NFI$_>e$2%(%s%8%s$rA*Br$G$-$k$h$&$K$J$C$?$N$G$9$,!"2;NL$,$H$F$b>.$5$$$G$9!#(B MS Office 2003/XP $B$,MxMQ$G$-$k$N$,0lHV$J$N$G$9$,!"$3$N$?$a$KF~$l$k$N$b$J$s$H$b!#(B $B$@$l$G$bMxMQ$G$-$k2A3J$NFI$_>e$2%(%s%8%s$,$"$k$H$$$$$G$9$M!#(B

$B"#(B $B%=!<%9%3!<%I(B

Web $B%V%i%&%6$G$NI=<(>e$O(B Ruby $B$N%9%/%j%W%H$G$9$,!"(BHTML $B$NFC

$B8=:_(B Ruby $B%9%/%j%W%H$OFbIt4A;z%3!<%I$O(B EUC $B$rA[Dj$7$F5-=R$7$F$$$^$9!#(B $Bl9g$K$O%9%/%j%W%HFb$N!V(BString#e2s$B!W$H5/F0%*%W%7%g%s!V(B-Ks$B!W$rD4@0$/$@$5$$!#(B

PDF $B%i%$%V%i%j$H$7$F(B Haru Free PDF Library II $B$,I,MW$G$9!#(B Ruby $BMQ$N3HD%%i%$%V%i%j$b4^$^$l$F$$$^$9!#(B $B9b66%a%=%C%IMQ$KBg$-$J%U%)%s%H$r07$($k$h$&$K$9$k$?$a$N%Q%C%A$H(B Ruby $BMQ$N%3!<%I$X$N%Q%C%A$NFs$D$N%Q%C%A$r

$B%U%!%$%kL>$O(B t5pdf.rb $B$H$J$C$F$$$^$9$,(B t2pdf.rb $B$G$b9%$-$K$7$F$/$@$5$$!#(B $B$=$N$&$A(B t2pdf.rb $B$N(B 2.0 $B7O$K$J$kM=Dj$G$9!#(B

#! /usr/local/bin/ruby -Ke
# /home/tetsu/src/ruby/pdf/t5pdf.rb
# created: April 15,2007 Sunday 23:26:24
# author: tetsu(WATANABE Tetsuya)
RCS_ID = %q$Id: t5pdf.rb,v 1.21 2008/01/19 19:43:37 tetsu Exp $
# usage: t5pdf.rb [-pSgn] [-f TrueTypeFont] [-l logo(jpg,png) TAKAHASHI-Method.txt

# $B4A;z%3!<%I$K$D$$$F(B
# $BFbIt%3!<%I$O(B EUC $B$r;H$C$F$$$^$9!#(B
# PDF $B%i%$%V%i%j$X$O(B SJIS $B$rEO$7$F$$$^$9!#(B($B!{$K!V(B1$B!W(B)$B$r%5%]!<%H$9$k$?$a$K(B SJIS $BEO$7$K$7$^$7$?!#(B

# //f TrueTypeFont.ttf
# //l logo.jpg(png)
# //h $B%X%C%@J8;zNs(B
# //i image.jpg(png)
# //$B?t;z(B%
# L:$B:84s$;(B
# R:$B1&4s$;(B
#  $BH>3Q%9%Z!<%9$rF~$l$k$H%=!<%9%3!<%I$J$IMQ(B
# //c r,g,b($BJ8;z(B) r,g,b($BGX7J?'(B) r,g,b($B%X%C%@J8;z?'(B)

require 'hpdf'
require 'nkf'

# Ruby 1.9 $B7O$J$iITMW$G$9$,!"J8;z2=$1$r2sHr$9$k$?$a$KF~NO$b8GDj(B
class String
  def e2s
    NKF.nkf('-Es', self)
  end
  def s2e
    NKF.nkf('-Se', self)
  end
end

class HPDFDoc
  def info_create_date
    t = Time.now
    self.set_info_date_attr(HPDFDoc::HPDF_INFO_CREATION_DATE, t.year, t.mon, t.mday, t.hour, t.min, t.sec, '+', 9, 0)
  end
  def info_author(author)
    self.set_info_attr(HPDFDoc::HPDF_INFO_AUTHOR, author)
  end
  def info_creator(creator)
    self.set_info_attr(HPDFDoc::HPDF_INFO_CREATOR, creator)
  end
  def info_title(title)
    self.set_info_attr(HPDFDoc::HPDF_INFO_TITLE, title)
  end
  def info_keyword(keyword)
    self.set_info_attr(HPDFDoc::HPDF_INFO_KEYWORDS, keyword)
  end
  def info_subject(subject)
    self.set_info_attr(HPDFDoc::HPDF_INFO_SUBJECT, subject)
  end
  def file_to_image(filename)
    case filename = File.expand_path(filename)
    when /\.jpe?g$/i
      self.load_jpeg_image_from_file(filename)
    when /\.png$/i
      self.load_png_image_from_file(filename)
    end
  end
  def ttf_font_load(filename, encode)
    # $B%U%)%s%H$N%m!<%I%(%i!<$,$G$k$H!"(Brescue $B$7$F$b0J8e$N=hM}$O$&$^$/$$$+$J$$$h$&$G$9(B
    begin
      tt_font_name = self.load_ttfont_from_file(File.expand_path(filename), HPDFDoc::HPDF_TRUE)
#      STDERR.puts "#{tt_font_name} #{filename}"
    rescue HPDFError
      STDERR.puts "TrueType font load error: #{filename}"
      raise
    end
    self.get_font(tt_font_name, encode)
  end
end

class HPDFPage
  def grid(font = nil)
    w = self.get_width
    h = self.get_height

    self.set_gray_fill(0.5)
    self.set_gray_stroke(0.8)

    y = 0
    while y < h
      if y % 10 == 0
        self.set_line_width(0.5)
      elsif self.get_line_width != 0.25
        self.set_line_width(0.25)
      end

      self.move_to(0, y); self.line_to(w, y)
      self.stroke

      if y % 10 == 0 && y > 0
        self.set_gray_stroke(0.5)
        self.move_to(0, y); self.line_to(5, y)
        self.stroke
        self.set_gray_stroke(0.8)
      end
      y += 5
    end

    x = 0
    while x < w
      if x % 10 == 0
        self.set_line_width(0.5)
      elsif self.get_line_width != 0.25
        self.set_line_width(0.25)
      end

      self.move_to(x, 0); self.line_to(x, h)
      self.stroke

      if x % 50 == 0 && x > 0
        self.set_gray_stroke(0.5)
        self.move_to(x, 0); self.line_to(x, 5)
        self.move_to(x, h); self.line_to(x, h - 5)
        self.stroke
        self.set_gray_stroke(0.8)
      end
      x += 5
    end

    if font
      self.set_font_and_size(font, 5)
      self.begin_text
      y = 0
      while y < h
        if y % 10 == 0 && y > 0
          self.text_out(5, y - 2, y.to_s)
        end
        y += 5
      end
      x = 0
      while x < w
        if x % 50 == 0 && x > 0
          self.text_out(x, 5, x.to_s)
          self.text_out(x, h - 10, x.to_s)
        end
        x += 5
      end
      self.end_text
    end

    self.set_gray_fill(0)
    self.set_gray_stroke(0)
  end

  def text_out_href(x, y, text, uri)
    self.text_out(x, y, text)
    w = self.text_width(text)
    h = self.get_current_font_size
    self.create_uri_link_annot(x, y, x + w, y + h, uri).set_border_style(0, 0, 0)
  end
end

# $B%9%/%j%W%H>e$O(B EUC $B$G(B libharu(PDF) $B$X$O(B SJIS
class T2PDFv2
  def initialize(file = 't.pdf')
    @file = file
    @pdf = HPDFDoc.new
    @pdf.info_title("TAKAHASHI Method #{@file}")
    @pdf.info_creator("Ruby, libhpdf: #{RCS_ID}")
    @pdf.info_create_date
    @pdf.set_compression_mode(HPDFDoc::HPDF_COMP_ALL)
    @pdf.use_jp_fonts
    @pdf.use_jp_encodings
    @pdf.set_page_mode(HPDFDoc::HPDF_PAGE_MODE_USE_OUTLINE)
    @font_h = Hash.new
    @title_font = @pdf.get_font('Helvetica', nil)
    @font_h['Helvetica'] = @title_font
    @encode = '90ms-RKSJ-H'
    @jp_font = @pdf.get_font('MS-PGothic', @encode)
    @font_h['MS-PGothic'] = @jp_font
    @encoder = @pdf.get_encoder(@encode)
    @root = @pdf.create_outline(nil, '$BL\$,0c$C$F$b!V%U%)%s%HL>!W$,F1$8>l9g$K%(%i!<$K$J$k$3$H$,$"$k$h$&$G$9(B
    if @font_h.key? filename
      @font_h[filename]
    else
      @font_h[filename] = @pdf.ttf_font_load(filename, @encode)
    end
  end

  def ttf_font(arr)
    arr.each_index do |i|
      if arr[i] =~ /^\/\/f (\S+)/
        @jp_font = ttf_font_load($1)
      end
    end
  end

  # $B?'$,2u$l$A$c$$$^$9(B
  def draw_betsuyaku(page, pos, st, en)
    m = [w = page.get_width, h = page.get_height].min
    r = (m - 100.0) / 2
    x = w / 2
    y = h / 2
    page.set_rgb_fill(rand, rand, rand)
    page.move_to(x, y)
    if st == 0
      page.line_to(x, y + r)
    else
      page.line_to(*pos)
    end
    en = 100.0 if st == en      # $B%5%$%I%(%U%'%/%H$N5$$,$9$k$G$9(B
    page.arc(x, y, r, 360.0 * st / 100.0, 360.0 * en / 100.0)
    pos = page.get_current_pos
    page.line_to(x, y)
    page.fill
    pos
  end

  def betsuyaku(page, arr)
    pos = []
    st = 0.0
    sum = 0
    arr.each_index do |i|
      if arr[i] =~ /^\/\/\%(\d+)? (.+)$/
        par = $1.to_i
        en = st + par.to_f
        msg = $2
        pos = draw_betsuyaku(page, pos, st, en)
        st = en
        par = 100 - sum if par == 0
        sum += par
        arr[i] = " %2d%% #{msg}" % [par]
      end
    end
  end

  def header(page, arr)
    w = page.get_width
    h = page.get_height
    size = @m
    page.set_font_and_size(@jp_font, size)
    y = h - size

    arr.each_index do |i|
      if arr[i] =~ /^\/\/h (.+)$/
        l = $1.e2s
        x = (w - page.text_width(l)) / 2
        page.set_rgb_fill(*color_make(@h_color))
        page.begin_text
        page.text_out(x, y, l)
        page.end_text
      end
    end
  end

  def anchoko(page, a)
    return if a == ''

    w = page.get_width
    h = page.get_height
    size = @m / 2
    page.set_font_and_size(@jp_font, size)
    y = 2

    l = a.e2s
    x = (w - page.text_width(l)) / 2
    page.set_rgb_fill(*color_make(@h_color))
    page.begin_text
    page.text_out(x, y, l)
    page.end_text
  end

  def takahashi(page, arr)
    arr.delete_if {|x| x =~ /^\/\//}
    return if arr.size == 0
    w = page.get_width
    h = page.get_height

    page.set_font_and_size(@jp_font, 100.0)
    len = 0.0
    arr.each do |l|
      if l =~ /^[LRC]:(.*)$/
        l = $1
      end
      if l =~ /^(.+):(http:\/\/\S+)$/
        l = $1
      end
      text_width = page.text_width(l.e2s)
      len = text_width if text_width > len
    end

    line = arr.size
    fontsize = [w * 100.0 / len, (h - @m / 2.0) / line].min
    # $B%G%U%)%k%H$@$H(B fontsize 300 $B$^$G(B
    # $B3Q%9%Z!<%9$N>l9g%=!<%9%3!<%IMQ(B
      x = if l[0, 1] == ' '
            l[0] = ''
            0
          else
            l_w = page.text_width(l)
            case lrc
            when 'l'
              0
            when 'r'
              w - l_w
            else
              (w - l_w) / 2.0
            end
          end

      d = fontsize / 72.0
      page.set_rgb_fill(1, 1, 1)  # $BGr(B
      page.text_out(x + d, y - d, l)
      page.set_rgb_fill(*color_make(@f_color))
      if url
        page.text_out_href(x, y, l, url)
      else
        page.text_out(x, y, l)
      end

      y -= fontsize
    end

    page.end_text
  end

  def page(arr, n)
    arr.delete_if {|x| x =~ /^\/\/ /}
    arr.delete_if {|x| x =~ /^\/\/[fli] /} if @opt_nonouter
    return if arr.size == 0

    @pagenumber += 1
    page = @pdf.add_page
    page.set_size(@page_size, @page_direction)
    color(page, arr)
    page.grid if @opt_grid
    draw_logoimage(page, arr)
    draw_images(page, arr)
    betsuyaku(page, arr)
    add_outline(page, arr)
    ttf_font(arr)
    header(page, arr)
    anchoko(page, n) if @opt_anchoko
    takahashi(page, arr)
    page_number(page) if @opt_pagenumber
  end
end

def n2a(n)
  arr = n.split("\n")
  arr.delete_if do |l|
    l =~ /^\/\//
  end
  arr.join(' ')
end

def parg(a1, argv)
  if a1 == nil
    if argv[0][0] == '-'
      usage
    else
      argv.shift
    end
  else
    a1
  end
end

def usage
  STDERR.puts "usage: #{$0} [-pSgna] [-f TrueTyepFont] [-l logo(jpeg,png)] TAKAHASHI-Method.txt..."
  STDERR.puts "  -p: print page number"
  STDERR.puts "  -S: SJIS Text"
  STDERR.puts "  -g: grid plot"
  STDERR.puts "  -n: non outer"
  STDERR.puts "  -a: anchoko"
  STDERR.puts "  -f TrueType_Font"
  STDERR.puts "  -l logo_image(jpeg or png)"
  exit 1
end

opt_pagenumber = false
opt_SJIS = false
opt_ttf = false
opt_logo = false
opt_grid = false
opt_nonouter = false
opt_anchoko = false

while ARGV[0] =~ /^-/
  $_ = ARGV.shift
  if ~/^-f(.+)?/ then opt_ttf  = parg($1, ARGV); next end
  if ~/^-l(.+)?/ then opt_logo = parg($1, ARGV); next end
  if ~/p/ then opt_pagenumber = true end
  if ~/S/ then opt_SJIS = true end
  if ~/g/ then opt_grid = true end
  if ~/n/ then opt_nonouter = true end
  if ~/a/ then opt_anchoko = true end
  if ~/[^pSgna-]/ then usage end
end

while filename = ARGV.shift
  pdfname = File.basename(filename, '.txt') + '.pdf'

  f = File.open(filename)
  t2pdf = T2PDFv2.new(pdfname)
  t2pdf.opt_pagenumber = opt_pagenumber
  t2pdf.opt_grid = opt_grid
  t2pdf.opt_nonouter = opt_nonouter
  t2pdf.opt_anchoko = opt_anchoko
  t2pdf.ttf_font_load(opt_ttf) if opt_ttf
  t2pdf.logo_load(opt_logo) if opt_logo
  b_arr = []

  while b = f.gets("\n\n")
    if opt_SJIS
      b = b.s2e
    end
    b_arr.push(b)
  end

  while b = b_arr.shift
    n = if b_arr[0] == nil then '' else b_arr[0] end
    t2pdf.page(b.split("\n"), n2a(n))
  end

  t2pdf.close
  f.close
end

$B

--- include/hpdf_consts.h.org   2006-11-23 12:34:40.000000000 +0900
+++ include/hpdf_consts.h       2007-04-16 03:06:43.000000000 +0900
@@ -139,10 +139,10 @@
 #define HPDF_MIN_HORIZONTALSCALING  10
 #define HPDF_MAX_HORIZONTALSCALING  300
 #define HPDF_MIN_WORDSPACE          -30
-#define HPDF_MAX_WORDSPACE          300
+#define HPDF_MAX_WORDSPACE          600        /* 300 */
 #define HPDF_MIN_CHARSPACE          -30
-#define HPDF_MAX_CHARSPACE          300
-#define HPDF_MAX_FONTSIZE           300
+#define HPDF_MAX_CHARSPACE          600        /* 300 */
+#define HPDF_MAX_FONTSIZE           600        /* 300 */
 #define HPDF_MAX_ZOOMSIZE           10
 #define HPDF_MAX_LEADING            300
 #define HPDF_MAX_LINEWIDTH          100

$B

--- if/ruby/hpdf.c.org  2006-11-23 13:19:32.000000000 +0900
+++ if/ruby/hpdf.c      2007-04-17 17:39:22.000000000 +0900
@@ -1388,7 +1388,7 @@
 
     Data_Get_Struct(obj, HPDF_Doc_Rec, pdf);
     s = STR2CSTR(ind);
-    if (HPDF_StrLen(s, -1) != 1 || s[0] != '+' || s[0] != '-' || s[0] != 'Z')
+    if (HPDF_StrLen(s, -1) != 1 || (s[0] != '+' && s[0] != '-' && s[0] != 'Z' && s[0] != ' '))
         rb_raise(rb_eHPDFError, "The eighth argument must be either of '+','-','Z',' '.");
 
     tp = NUM2INT(type);

1.9 $B7O$O!"

--- if/ruby/hpdf.c.org  2006-11-23 13:19:32.000000000 +0900
+++ if/ruby/hpdf.c      2007-04-17 17:39:22.000000000 +0900
@@ -2401,7 +2401,7 @@
     HPDF_PTRACE(("hpdf_page_set_dash page=%p\n", page));
 
     dash_phase = NUM2INT(phase);
-    num_ptn = RARRAY(ptn)->len;
+    num_ptn = RARRAY_LEN(ptn);
     if (!num_ptn) {
         ret = HPDF_Page_SetDash(page, NULL, 0, 0);
         return INT2NUM(ret);
@@ -2410,7 +2410,7 @@
     for (i = 0; i < 8; i++)
         dash_ptn[i] = 0;
 
-    pptn = RARRAY(ptn)->ptr;
+    pptn = RARRAY_PTR(ptn);
     for (i = 0; i < num_ptn; i++) {
         dash_ptn[i] = NUM2INT(*pptn);

$B"#(B $B2r@b(B

$BM%$l$?(B Haru Free PDF Library II $B$N$*$+$2$G!"$H$F$b3Z$K%$%s%W%j%a%s%H$G$-$^$7$?!#(B $BI=<($5$l$?$H$-$NJ8;zNs$ND9$5$J$I$N>pJs$r$A$c$s$H%9%/%j%W%HCf$GMxMQ$G$-$?$N$,Bg$-$$$G$9!#(B $B$H$F$b$H$F$b46

$B9b66$5$s$,0lHV:G=i$K9b66%a%=%C%I$G%W%l%<%s$r$7$?$H$-!"8e$m$N$[$&$K$$$^$7$?!#(B $BCB@8$N=V4V$KN)$A2q$($F!"$H$C$F$b%i%C%-!<(B!

$B"#(B $BMzNr(B

1.21 2007/1/19

$B%"%s%A%g%3%*%W%7%g%s$NDI2C!#(B

1.20 2007/6/22

$B%$%a!<%8$N%5%$%:D4@0!#(B

1.19 2007/5/15

bug fix $B$H:Y$+$JD4@0!#(B

1.18 2007/5/12

$BJ8;z$N1"$N%5%$%:$rJ8;z%5%$%:$K$"$o$;$F=$@5(B

1.17 2007/5/12

//c r,g,b r,g,b r,g,b $B$G?';XDj(B $B%F%9%HE*$J%$%s%W%j%a%s%H$G$9(B $B$H%m%4I=<($N(B bug fix

1.16 2007/5/12

L:$BJ8;zNs(B $B:84s$;!"(BR:$BJ8;zNs(B $B1&4s$;!"(BC:$BJ8;zNs(B $BCf1{(B($B%G%U%)%k%H(B) $B%F%9%HE*$J%$%s%W%j%a%s%H$G$9(B

1.14, 1.15 2007/5/12

$B%U%)%s%H$N%m!<%I%(%i!<$,$G$?>l9g$K%U%)%s%H%U%!%$%kL>$rI=<($9$k$h$&$K=$@5!#(B

1.13 2007/5/10

$B%U%)%s%H$r2?EY$b:FMxMQ$G$-$k$h$&$K!"%U%)%s%H$N%m!<%IItJ,$N=$@5!#(B

1.12 2007/4/30

$B!V(B//h $B%X%C%@!

1.11 2007/4/25

$B%*%W%7%g%s(B -n $B$N%5%]!<%H!#(B $BF~NO$N%F%-%9%H%U%!%$%kCf$K!"30It%U%!%$%k$rMxMQ$9$k(B //l, //i, //f $B$,$"$C$?>l9g$KL5;k$7$^$9!#(B $B30It%U%!%$%k$rMQ0U$G$-$J$$>l9g$K!"F~NO%F%-%9%H%U%!%$%k$r=$@5$7$J$/$F$bMxMQ2DG=$G$9!#(B

1.10 2007/4/25

$B%*%W%7%g%s$N2r

1.9 2007/4/24

$B2;@<=PNO(B($BFI$_>e$2(B)$BBP1~$N$?$a$K!"J8;z=PNO=g$rD4@0!#(B URL $BKd$a9~$_$KBP1~!#(B($BJ8;zNs(B:http://....)

1.8 2007/4/24

$B%9%/%j%W%H$N4A;z%3!<%I$r(B EUC $B$KLa$7!"=PNO$N$_(B SJIS $B$X(B

1.7 2007/4/21

fix $B%G%U%)%k%H4A;z%3!<%I$rJQ99$7$?$?$a!#(B

1.6 2007/4/21

-Ks $B$K$9$k$N$rK:$l$F$^$7$?!#(B

1.5 2007/4/21

$B-!(B ($B!{$K!V(B1$B!W(B)$B$r%5%]!<%H$7$^$7$?!#(B

1.4 2007/4/21

$B%0%j%C%I$N=PNO$r%*%W%7%g%s$K$7$^$7$?!#(B

1.3 2007/4/18

$B:G=i$N8x3+!#(B

$B"#(B $B;29M(B URL


$BEOJUE/Li(B(WATANABE Tetsuya): Tetsuya.WATANABE atmark nifty.com