Redmine pdf export 시 한글 깨지는 문제
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 화일을 첨부합니다.
