Redmine pdf export 시 한글 깨지는 문제

분류없음 | 2009/01/08 15:21
Posted by 박인서


redmine 에서 Gantt Chart 에서 한글이 제대로 나오는 것을 확인 한 후, pdf 에서 한글이 나오지 않는 이유를 몰라 한참을 헤매다가 결국 방법을 알았습니다.

redmine/app/helpers 에 있는 ifpdf_helper.rb 에 language 가 한글로 되어 있을 때 pdf에 UHC Font 를 출력하는 routine 이 빠져 있었고, redmine\vendor/plugins/rfpdf/lib/rfpdf
에 있는 korean.rb 에 일부 오류가 있었습니다.

ifpdf_helper.rb 는 다음과 같이 고칩니다. (0.80 기준)
      when 'zh-tw'
        extend(PDF_Chinese)
        AddBig5Font()
        @font_for_content = 'Big5'
        @font_for_footer = 'Big5'
     
when 'ko'
        extend(PDF_Korean)
        AddUHCFont()
        @font_for_content = 'UHC'
        @font_for_footer = 'UHC'


그리고, korean.rb 는 다음과 같이 고칩니다.
  def AddUHCFont(family='UHC',name='HYGoThic-Medium')
   #Add UHC font with proportional
   cw=UHC_widths
 cMap='KSCms-UHC-H'
   registry={'ordering'=>'Korea1','supplement'=>1}
   AddCIDFonts(family,name,cw,cMap,registry)
  end

  def AddUHChwFont(family='UHC-hw',name='HYGoThic-Medium')
   #Add UHC font with half-witdh Latin
    32.upto(126) do |i|
    cw[i.chr]=500
    end
  cMap='KSCms-UHC-HW-H'
   registry={'ordering'=>'Korea1','supplement'=>1}
   AddCIDFonts(family,name,cw,cMap,registry)
  end

(사실상 고딕체가 출력되게 할 뿐이지, 윗부분이 잘못된 것은 아닙니다.)

문제 부분은 아래 부분입니다.
  def MultiCell(w,h,txt,border=0,align='L',fill=0)
   if(@CurrentFont['type']=='Type0')
    MBMultiCell(w,h,txt,border,align,fill)
   else
    super(w,h,txt,border,align,fill)
  end
  end

  def MBMultiCell(w,h,txt,border=0,align='L',fill=0)
   #Multi-byte version of MultiCell()
   cw=@CurrentFont['cw']
   if(w==0)
    w=@w-@rMargin-@x
  end
   wmax=(w-2*@cMargin)*1000/@FontSize
   s=txt.gsub("\r",'')
   nb=s.length
   if(nb>0 and s[nb-1]=="\n")
    nb-=1
  end
   b=0
   if(border)
    if(border==1)
     border='LTRB'
     b='LRT'
     b2='LR'
    else
     b2=''
     if(border.to_s.index('L'))
      b2+='L'
    end
     if(border.to_s.index('R'))
      b2+='R'
    end
     b=border.to_s.index('T') ? b2+'T' : b2
    end
   end
   sep=-1
   i=0
   j=0
   l=0
   nl=1
   while(i<nb)
    #Get next character
    c=s[i]
    #Check if ASCII or MB
    ascii=(c<128)
    if(c.chr=="\n")
     #Explicit line break
     Cell(w,h,s[j,i-j],b,2,align,fill)
     i+=1
     sep=-1
     j=i
     l=0
     nl+=1
     if(border and nl==2)
      b=b2
    end
     next
    end
    if(!ascii)
     sep=i
     ls=l
    elsif(c==' ')
     sep=i
     ls=l
    end
    l+=ascii ? (cw[c.chr] || 0) : 1100
    if(l>wmax)
     #Automatic line break
     if(sep==-1 or i==j)
      if(i==j)
       i+=ascii ? 1 : 3
     end
      Cell(w,h,s[j,i-j],b,2,align,fill)
     else
      Cell(w,h,s[j,sep-j],b,2,align,fill)
      i=(s[sep]==' ') ? sep+1 : sep
     end
     sep=-1
     j=i
     l=0
#     nl+=1
     if(border and nl==2)
      b=b2
     end
    else
     i+=ascii ? 1 : 3
    end
   end
   #Last chunk
   if(border and not border.to_s.index('B').nil?)
    b+='B'
  end
   Cell(w,h,s[j,i-j],b,2,align,fill)
   @x=@lMargin
  end

즉,   def MBMultiCell(w,h,txt,border=0,align='L',fill=0) 의 부분을 chinese.rb 화일의 것으로 교체했습니다.

아래 windows 용 rb 화일을 첨부합니다.

블로그 이미지

박인서

카테고리

분류 전체보기 (4)
Application (1)
OS (0)
Hardware (0)
(1)
food, dish, meal (0)