summaryrefslogtreecommitdiffstats
path: root/vendor/plugins/rfpdf/lib/fpdf
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/plugins/rfpdf/lib/fpdf')
-rw-r--r--vendor/plugins/rfpdf/lib/fpdf/bookmark.rb99
-rw-r--r--vendor/plugins/rfpdf/lib/fpdf/chinese.rb473
-rw-r--r--vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb139
-rw-r--r--vendor/plugins/rfpdf/lib/fpdf/japanese.rb468
-rw-r--r--vendor/plugins/rfpdf/lib/fpdf/korean.rb436
-rw-r--r--vendor/plugins/rfpdf/lib/fpdf/makefont.rb1787
6 files changed, 3402 insertions, 0 deletions
diff --git a/vendor/plugins/rfpdf/lib/fpdf/bookmark.rb b/vendor/plugins/rfpdf/lib/fpdf/bookmark.rb
new file mode 100644
index 000000000..a04ccd18d
--- /dev/null
+++ b/vendor/plugins/rfpdf/lib/fpdf/bookmark.rb
@@ -0,0 +1,99 @@
+# Translation of the bookmark class from the PHP FPDF script from Olivier Plathey
+# Translated by Sylvain Lafleur and ?? with the help of Brian Ollenberger
+#
+# First added in 1.53b
+#
+# Usage is as follows:
+#
+# require 'fpdf'
+# require 'bookmark'
+# pdf = FPDF.new
+# pdf.extend(PDF_Bookmark)
+#
+# This allows it to be combined with other extensions, such as the Chinese
+# module.
+
+module PDF_Bookmark
+ def PDF_Bookmark.extend_object(o)
+ o.instance_eval('@outlines,@OutlineRoot=[],0')
+ super(o)
+ end
+
+ def Bookmark(txt,level=0,y=0)
+ y=self.GetY() if y==-1
+ @outlines.push({'t'=>txt,'l'=>level,'y'=>y,'p'=>self.PageNo()})
+ end
+
+ def putbookmarks
+ @nb=@outlines.size
+ return if @nb==0
+ lru=[]
+ level=0
+ @outlines.each_index do |i|
+ o=@outlines[i]
+ if o['l']>0
+ parent=lru[o['l']-1]
+ # Set parent and last pointers
+ @outlines[i]['parent']=parent
+ @outlines[parent]['last']=i
+ if o['l']>level
+ # Level increasing: set first pointer
+ @outlines[parent]['first']=i
+ end
+ else
+ @outlines[i]['parent']=@nb
+ end
+ if o['l']<=level and i>0
+ # Set prev and next pointers
+ prev=lru[o['l']]
+ @outlines[prev]['next']=i
+ @outlines[i]['prev']=prev
+ end
+ lru[o['l']]=i
+ level=o['l']
+ end
+ # Outline items
+ n=@n+1
+ @outlines.each_index do |i|
+ o=@outlines[i]
+ newobj
+ out('<</Title '+(textstring(o['t'])))
+ out('/Parent '+(n+o['parent']).to_s+' 0 R')
+ if o['prev']
+ out('/Prev '+(n+o['prev']).to_s+' 0 R')
+ end
+ if o['next']
+ out('/Next '+(n+o['next']).to_s+' 0 R')
+ end
+ if o['first']
+ out('/First '+(n+o['first']).to_s+' 0 R')
+ end
+ if o['last']
+ out('/Last '+(n+o['last']).to_s+' 0 R')
+ end
+ out(sprintf('/Dest [%d 0 R /XYZ 0 %.2f
+null]',1+2*o['p'],(@h-o['y'])*@k))
+ out('/Count 0>>')
+ out('endobj')
+ end
+ # Outline root
+ newobj
+ @OutlineRoot=@n
+ out('<</Type /Outlines /First '+n.to_s+' 0 R')
+ out('/Last '+(n+lru[0]).to_s+' 0 R>>')
+ out('endobj')
+ end
+
+ def putresources
+ super
+ putbookmarks
+ end
+
+ def putcatalog
+ super
+ if not @outlines.empty?
+ out('/Outlines '+@OutlineRoot.to_s+' 0 R')
+ out('/PageMode /UseOutlines')
+ end
+ end
+end
diff --git a/vendor/plugins/rfpdf/lib/fpdf/chinese.rb b/vendor/plugins/rfpdf/lib/fpdf/chinese.rb
new file mode 100644
index 000000000..731d582a2
--- /dev/null
+++ b/vendor/plugins/rfpdf/lib/fpdf/chinese.rb
@@ -0,0 +1,473 @@
+# Copyright (c) 2006 4ssoM LLC <www.4ssoM.com>
+# 1.12 contributed by Ed Moss.
+#
+# The MIT License
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# This is direct port of chinese.php
+#
+# Chinese PDF support.
+#
+# Usage is as follows:
+#
+# require 'fpdf'
+# require 'chinese'
+# pdf = FPDF.new
+# pdf.extend(PDF_Chinese)
+#
+# This allows it to be combined with other extensions, such as the bookmark
+# module.
+
+module PDF_Chinese
+
+ Big5_widths={' '=>250,'!'=>250,'"'=>408,'#'=>668,''=>490,'%'=>875,'&'=>698,'\''=>250,
+ '('=>240,')'=>240,'*'=>417,'+'=>667,','=>250,'-'=>313,'.'=>250,'/'=>520,'0'=>500,'1'=>500,
+ '2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>250,''=>250,
+ '<'=>667,'='=>667,'>'=>667,'?'=>396,'@'=>921,'A'=>677,'B'=>615,'C'=>719,'D'=>760,'E'=>625,
+ 'F'=>552,'G'=>771,'H'=>802,'I'=>354,'J'=>354,'K'=>781,'L'=>604,'M'=>927,'N'=>750,'O'=>823,
+ 'P'=>563,'Q'=>823,'R'=>729,'S'=>542,'T'=>698,'U'=>771,'V'=>729,'W'=>948,'X'=>771,'Y'=>677,
+ 'Z'=>635,'['=>344,'\\'=>520,']'=>344,'^'=>469,'_'=>500,'`'=>250,'a'=>469,'b'=>521,'c'=>427,
+ 'd'=>521,'e'=>438,'f'=>271,'g'=>469,'h'=>531,'i'=>250,'j'=>250,'k'=>458,'l'=>240,'m'=>802,
+ 'n'=>531,'o'=>500,'p'=>521,'q'=>521,'r'=>365,'s'=>333,'t'=>292,'u'=>521,'v'=>458,'w'=>677,
+ 'x'=>479,'y'=>458,'z'=>427,'{'=>480,'|'=>496,'end'=>480,'~'=>667}
+
+ GB_widths={' '=>207,'!'=>270,'"'=>342,'#'=>467,''=>462,'%'=>797,'&'=>710,'\''=>239,
+ '('=>374,')'=>374,'*'=>423,'+'=>605,','=>238,'-'=>375,'.'=>238,'/'=>334,'0'=>462,'1'=>462,
+ '2'=>462,'3'=>462,'4'=>462,'5'=>462,'6'=>462,'7'=>462,'8'=>462,'9'=>462,':'=>238,''=>238,
+ '<'=>605,'='=>605,'>'=>605,'?'=>344,'@'=>748,'A'=>684,'B'=>560,'C'=>695,'D'=>739,'E'=>563,
+ 'F'=>511,'G'=>729,'H'=>793,'I'=>318,'J'=>312,'K'=>666,'L'=>526,'M'=>896,'N'=>758,'O'=>772,
+ 'P'=>544,'Q'=>772,'R'=>628,'S'=>465,'T'=>607,'U'=>753,'V'=>711,'W'=>972,'X'=>647,'Y'=>620,
+ 'Z'=>607,'['=>374,'\\'=>333,']'=>374,'^'=>606,'_'=>500,'`'=>239,'a'=>417,'b'=>503,'c'=>427,
+ 'd'=>529,'e'=>415,'f'=>264,'g'=>444,'h'=>518,'i'=>241,'j'=>230,'k'=>495,'l'=>228,'m'=>793,
+ 'n'=>527,'o'=>524,'p'=>524,'q'=>504,'r'=>338,'s'=>336,'t'=>277,'u'=>517,'v'=>450,'w'=>652,
+ 'x'=>466,'y'=>452,'z'=>407,'{'=>370,'|'=>258,'end'=>370,'~'=>605}
+
+ def AddCIDFont(family,style,name,cw,cMap,registry)
+#ActionController::Base::logger.debug registry.to_a.join(":").to_s
+ fontkey=family.downcase+style.upcase
+ unless @fonts[fontkey].nil?
+ Error("Font already added: family style")
+ end
+ i=@fonts.length+1
+ name=name.gsub(' ','')
+ @fonts[fontkey]={'i'=>i,'type'=>'Type0','name'=>name,'up'=>-130,'ut'=>40,'cw'=>cw, 'CMap'=>cMap,'registry'=>registry}
+ end
+
+ def AddCIDFonts(family,name,cw,cMap,registry)
+ AddCIDFont(family,'',name,cw,cMap,registry)
+ AddCIDFont(family,'B',name+',Bold',cw,cMap,registry)
+ AddCIDFont(family,'I',name+',Italic',cw,cMap,registry)
+ AddCIDFont(family,'BI',name+',BoldItalic',cw,cMap,registry)
+ end
+
+ def AddBig5Font(family='Big5',name='MSungStd-Light-Acro')
+ #Add Big5 font with proportional Latin
+ cw=Big5_widths
+ cMap='ETenms-B5-H'
+ registry={'ordering'=>'CNS1','supplement'=>0}
+#ActionController::Base::logger.debug registry.to_a.join(":").to_s
+ AddCIDFonts(family,name,cw,cMap,registry)
+ end
+
+ def AddBig5hwFont(family='Big5-hw',name='MSungStd-Light-Acro')
+ #Add Big5 font with half-witdh Latin
+ cw = {}
+ 32.upto(126) do |i|
+ cw[i.chr]=500
+ end
+ cMap='ETen-B5-H'
+ registry={'ordering'=>'CNS1','supplement'=>0}
+ AddCIDFonts(family,name,cw,cMap,registry)
+ end
+
+ def AddGBFont(family='GB',name='STSongStd-Light-Acro')
+ #Add GB font with proportional Latin
+ cw=GB_widths
+ cMap='GBKp-EUC-H'
+ registry={'ordering'=>'GB1','supplement'=>2}
+ AddCIDFonts(family,name,cw,cMap,registry)
+ end
+
+ def AddGBhwFont(family='GB-hw',name='STSongStd-Light-Acro')
+ #Add GB font with half-width Latin
+ 32.upto(126) do |i|
+ cw[i.chr]=500
+ end
+ cMap='GBK-EUC-H'
+ registry={'ordering'=>'GB1','supplement'=>2}
+ AddCIDFonts(family,name,cw,cMap,registry)
+ end
+
+ def GetStringWidth(s)
+ if(@CurrentFont['type']=='Type0')
+ return GetMBStringWidth(s)
+ else
+ return super(s)
+ end
+ end
+
+ def GetMBStringWidth(s)
+ #Multi-byte version of GetStringWidth()
+ l=0
+ cw=@CurrentFont['cw']
+ nb=s.length
+ i=0
+ while(i<nb)
+ c=s[i]
+ if(c<128)
+ l+=cw[c.chr]
+ i+=1
+ else
+ l+=1000
+ i+=2
+ end
+ end
+ return l*@FontSize/1000
+ 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.index('L').nil?)
+ b2+='L'
+ end
+ if(border.index('R').nil?)
+ b2+='R'
+ end
+ b=border.index('T').nil? ? 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=="\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] : 1000
+ if(l>wmax)
+ #Automatic line break
+ if(sep==-1 or i==j)
+ if(i==j)
+ i+=ascii ? 1 : 2
+ 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 : 2
+ end
+ end
+ #Last chunk
+ if(border and not border.index('B').nil?)
+ b+='B'
+ end
+ Cell(w,h,s[j,i-j],b,2,align,fill)
+ @x=@lMargin
+ end
+
+ def Write(h,txt,link='')
+ if(@CurrentFont['type']=='Type0')
+ MBWrite(h,txt,link)
+ else
+ super(h,txt,link)
+ end
+ end
+
+ def MBWrite(h,txt,link)
+ #Multi-byte version of Write()
+ cw=@CurrentFont['cw']
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ s=txt.gsub("\r",'')
+ nb=s.length
+ 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=="\n")
+ #Explicit line break
+ Cell(w,h,s[j,i-j],0,2,'',0,link)
+ i+=1
+ sep=-1
+ j=i
+ l=0
+ if(nl==1)
+ @x=@lMargin
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ end
+ nl+=1
+ next
+ end
+ if(!ascii or c==' ')
+ sep=i
+ end
+ l+=ascii ? cw[c.chr] : 1000
+ if(l>wmax)
+ #Automatic line break
+ if(sep==-1 or i==j)
+ if(@x>@lMargin)
+ #Move to next line
+ @x=@lMargin
+ @y+=h
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ i+=1
+ nl+=1
+ next
+ end
+ if(i==j)
+ i+=ascii ? 1 : 2
+ end
+ Cell(w,h,s[j,i-j],0,2,'',0,link)
+ else
+ Cell(w,h,s[j,sep-j],0,2,'',0,link)
+ i=(s[sep]==' ') ? sep+1 : sep
+ end
+ sep=-1
+ j=i
+ l=0
+ if(nl==1)
+ @x=@lMargin
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ end
+ nl+=1
+ else
+ i+=ascii ? 1 : 2
+ end
+ end
+ #Last chunk
+ if(i!=j)
+ Cell(l/1000*@FontSize,h,s[j,i-j],0,0,'',0,link)
+ end
+ end
+
+private
+
+ def putfonts()
+ nf=@n
+ @diffs.each do |diff|
+ #Encodings
+ newobj()
+ out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['+diff+']>>')
+ out('endobj')
+ end
+ # mqr=get_magic_quotes_runtime()
+ # set_magic_quotes_runtime(0)
+ @FontFiles.each_pair do |file, info|
+ #Font file embedding
+ newobj()
+ @FontFiles[file]['n']=@n
+ if(defined('FPDF_FONTPATH'))
+ file=FPDF_FONTPATH+file
+ end
+ size=filesize(file)
+ if(!size)
+ Error('Font file not found')
+ end
+ out('<</Length '+size)
+ if(file[-2]=='.z')
+ out('/Filter /FlateDecode')
+ end
+ out('/Length1 '+info['length1'])
+ unless info['length2'].nil?
+ out('/Length2 '+info['length2']+' /Length3 0')
+ end
+ out('>>')
+ f=fopen(file,'rb')
+ putstream(fread(f,size))
+ fclose(f)
+ out('endobj')
+ end
+#
+ # set_magic_quotes_runtime(mqr)
+#
+ @fonts.each_pair do |k, font|
+ #Font objects
+ newobj()
+ @fonts[k]['n']=@n
+ out('<</Type /Font')
+ if(font['type']=='Type0')
+ putType0(font)
+ else
+ name=font['name']
+ out('/BaseFont /'+name)
+ if(font['type']=='core')
+ #Standard font
+ out('/Subtype /Type1')
+ if(name!='Symbol' and name!='ZapfDingbats')
+ out('/Encoding /WinAnsiEncoding')
+ end
+ else
+ #Additional font
+ out('/Subtype /'+font['type'])
+ out('/FirstChar 32')
+ out('/LastChar 255')
+ out('/Widths '+(@n+1)+' 0 R')
+ out('/FontDescriptor '+(@n+2)+' 0 R')
+ if(font['enc'])
+ if !font['diff'].nil?
+ out('/Encoding '+(nf+font['diff'])+' 0 R')
+ else
+ out('/Encoding /WinAnsiEncoding')
+ end
+ end
+ end
+ out('>>')
+ out('endobj')
+ if(font['type']!='core')
+ #Widths
+ newobj()
+ cw=font['cw']
+ s='['
+ 32.upto(255) do |i|
+ s+=cw[i.chr]+' '
+ end
+ out(s+']')
+ out('endobj')
+ #Descriptor
+ newobj()
+ s='<</Type /FontDescriptor /FontName /'+name
+ font['desc'].each_pair do |k, v|
+ s+=' /'+k+' '+v
+ end
+ file=font['file']
+ if(file)
+ s+=' /FontFile'+(font['type']=='Type1' ? '' : '2')+' '+@FontFiles[file]['n']+' 0 R'
+ end
+ out(s+'>>')
+ out('endobj')
+ end
+ end
+ end
+ end
+
+ def putType0(font)
+ #Type0
+ out('/Subtype /Type0')
+ out('/BaseFont /'+font['name']+'-'+font['CMap'])
+ out('/Encoding /'+font['CMap'])
+ out('/DescendantFonts ['+(@n+1).to_s+' 0 R]')
+ out('>>')
+ out('endobj')
+ #CIDFont
+ newobj()
+ out('<</Type /Font')
+ out('/Subtype /CIDFontType0')
+ out('/BaseFont /'+font['name'])
+ out('/CIDSystemInfo <</Registry '+textstring('Adobe')+' /Ordering '+textstring(font['registry']['ordering'])+' /Supplement '+font['registry']['supplement'].to_s+'>>')
+ out('/FontDescriptor '+(@n+1).to_s+' 0 R')
+ if(font['CMap']=='ETen-B5-H')
+ w='13648 13742 500'
+ elsif(font['CMap']=='GBK-EUC-H')
+ w='814 907 500 7716 [500]'
+ else
+ # ActionController::Base::logger.debug font['cw'].keys.sort.join(' ').to_s
+ # ActionController::Base::logger.debug font['cw'].values.join(' ').to_s
+ w='1 ['
+ font['cw'].keys.sort.each {|key|
+ w+=font['cw'][key].to_s + " "
+# ActionController::Base::logger.debug key.to_s
+# ActionController::Base::logger.debug font['cw'][key].to_s
+ }
+ w +=']'
+ end
+ out('/W ['+w+']>>')
+ out('endobj')
+ #Font descriptor
+ newobj()
+ out('<</Type /FontDescriptor')
+ out('/FontName /'+font['name'])
+ out('/Flags 6')
+ out('/FontBBox [0 -200 1000 900]')
+ out('/ItalicAngle 0')
+ out('/Ascent 800')
+ out('/Descent -200')
+ out('/CapHeight 800')
+ out('/StemV 50')
+ out('>>')
+ out('endobj')
+ end
+end
diff --git a/vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb b/vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb
new file mode 100644
index 000000000..c6a224310
--- /dev/null
+++ b/vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb
@@ -0,0 +1,139 @@
+# Information
+#
+# PDF_EPS class from Valentin Schmidt ported to ruby by Thiago Jackiw (tjackiw@gmail.com)
+# working for Mingle LLC (www.mingle.com)
+# Release Date: July 13th, 2006
+#
+# Description
+#
+# This script allows to embed vector-based Adobe Illustrator (AI) or AI-compatible EPS files.
+# Only vector drawing is supported, not text or bitmap. Although the script was successfully
+# tested with various AI format versions, best results are probably achieved with files that
+# were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2).
+#
+# ImageEps(string file, float x, float y [, float w [, float h [, string link [, boolean useBoundingBox]]]])
+#
+# Same parameters as for regular FPDF::Image() method, with an additional one:
+#
+# useBoundingBox: specifies whether to position the bounding box (true) or the complete canvas (false)
+# at location (x,y). Default value is true.
+#
+# First added to the Ruby FPDF distribution in 1.53c
+#
+# Usage is as follows:
+#
+# require 'fpdf'
+# require 'fpdf_eps'
+# pdf = FPDF.new
+# pdf.extend(PDF_EPS)
+# pdf.ImageEps(...)
+#
+# This allows it to be combined with other extensions, such as the bookmark
+# module.
+
+module PDF_EPS
+ def ImageEps(file, x, y, w=0, h=0, link='', use_bounding_box=true)
+ data = nil
+ if File.exists?(file)
+ File.open(file, 'rb') do |f|
+ data = f.read()
+ end
+ else
+ Error('EPS file not found: '+file)
+ end
+
+ # Find BoundingBox param
+ regs = data.scan(/%%BoundingBox: [^\r\n]*/m)
+ regs << regs[0].gsub(/%%BoundingBox: /, '')
+ if regs.size > 1
+ tmp = regs[1].to_s.split(' ')
+ @x1 = tmp[0].to_i
+ @y1 = tmp[1].to_i
+ @x2 = tmp[2].to_i
+ @y2 = tmp[3].to_i
+ else
+ Error('No BoundingBox found in EPS file: '+file)
+ end
+ f_start = data.index('%%EndSetup')
+ f_start = data.index('%%EndProlog') if f_start === false
+ f_start = data.index('%%BoundingBox') if f_start === false
+
+ data = data.slice(f_start, data.length)
+
+ f_end = data.index('%%PageTrailer')
+ f_end = data.index('showpage') if f_end === false
+ data = data.slice(0, f_end) if f_end
+
+ # save the current graphic state
+ out('q')
+
+ k = @k
+
+ # Translate
+ if use_bounding_box
+ dx = x*k-@x1
+ dy = @hPt-@y2-y*k
+ else
+ dx = x*k
+ dy = -y*k
+ end
+ tm = [1,0,0,1,dx,dy]
+ out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm',
+ tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]))
+
+ if w > 0
+ scale_x = w/((@x2-@x1)/k)
+ if h > 0
+ scale_y = h/((@y2-@y1)/k)
+ else
+ scale_y = scale_x
+ h = (@y2-@y1)/k * scale_y
+ end
+ else
+ if h > 0
+ scale_y = $h/((@y2-@y1)/$k)
+ scale_x = scale_y
+ w = (@x2-@x1)/k * scale_x
+ else
+ w = (@x2-@x1)/k
+ h = (@y2-@y1)/k
+ end
+ end
+
+ if !scale_x.nil?
+ # Scale
+ tm = [scale_x,0,0,scale_y,0,@hPt*(1-scale_y)]
+ out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm',
+ tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]))
+ end
+
+ data.split(/\r\n|[\r\n]/).each do |line|
+ next if line == '' || line[0,1] == '%'
+ len = line.length
+ # next if (len > 2 && line[len-2,len] != ' ')
+ cmd = line[len-2,len].strip
+ case cmd
+ when 'm', 'l', 'v', 'y', 'c', 'k', 'K', 'g', 'G', 's', 'S', 'J', 'j', 'w', 'M', 'd':
+ out(line)
+
+ when 'L':
+ line[len-1,len]='l'
+ out(line)
+
+ when 'C':
+ line[len-1,len]='c'
+ out(line)
+
+ when 'f', 'F':
+ out('f*')
+
+ when 'b', 'B':
+ out(cmd + '*')
+ end
+ end
+
+ # restore previous graphic state
+ out('Q')
+ Link(x,y,w,h,link) if link
+ end
+end
diff --git a/vendor/plugins/rfpdf/lib/fpdf/japanese.rb b/vendor/plugins/rfpdf/lib/fpdf/japanese.rb
new file mode 100644
index 000000000..7340936bb
--- /dev/null
+++ b/vendor/plugins/rfpdf/lib/fpdf/japanese.rb
@@ -0,0 +1,468 @@
+# Copyright (c) 2006 4ssoM LLC <www.4ssoM.com>
+# 1.12 contributed by Ed Moss.
+#
+# The MIT License
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# This is direct port of japanese.php
+#
+# Japanese PDF support.
+#
+# Usage is as follows:
+#
+# require 'fpdf'
+# require 'chinese'
+# pdf = FPDF.new
+# pdf.extend(PDF_Japanese)
+#
+# This allows it to be combined with other extensions, such as the bookmark
+# module.
+
+module PDF_Japanese
+
+ SJIS_widths={' ' => 278, '!' => 299, '"' => 353, '#' => 614, '$' => 614, '%' => 721, '&' => 735, '\'' => 216,
+ '(' => 323, ')' => 323, '*' => 449, '+' => 529, ',' => 219, '-' => 306, '.' => 219, '/' => 453, '0' => 614, '1' => 614,
+ '2' => 614, '3' => 614, '4' => 614, '5' => 614, '6' => 614, '7' => 614, '8' => 614, '9' => 614, ':' => 219, ';' => 219,
+ '<' => 529, '=' => 529, '>' => 529, '?' => 486, '@' => 744, 'A' => 646, 'B' => 604, 'C' => 617, 'D' => 681, 'E' => 567,
+ 'F' => 537, 'G' => 647, 'H' => 738, 'I' => 320, 'J' => 433, 'K' => 637, 'L' => 566, 'M' => 904, 'N' => 710, 'O' => 716,
+ 'P' => 605, 'Q' => 716, 'R' => 623, 'S' => 517, 'T' => 601, 'U' => 690, 'V' => 668, 'W' => 990, 'X' => 681, 'Y' => 634,
+ 'Z' => 578, '[' => 316, '\\' => 614, ']' => 316, '^' => 529, '_' => 500, '`' => 387, 'a' => 509, 'b' => 566, 'c' => 478,
+ 'd' => 565, 'e' => 503, 'f' => 337, 'g' => 549, 'h' => 580, 'i' => 275, 'j' => 266, 'k' => 544, 'l' => 276, 'm' => 854,
+ 'n' => 579, 'o' => 550, 'p' => 578, 'q' => 566, 'r' => 410, 's' => 444, 't' => 340, 'u' => 575, 'v' => 512, 'w' => 760,
+ 'x' => 503, 'y' => 529, 'z' => 453, '{' => 326, '|' => 380, '}' => 326, '~' => 387}
+
+ def AddCIDFont(family,style,name,cw,cMap,registry)
+ fontkey=family.downcase+style.upcase
+ unless @fonts[fontkey].nil?
+ Error("CID font already added: family style")
+ end
+ i=@fonts.length+1
+ @fonts[fontkey]={'i'=>i,'type'=>'Type0','name'=>name,'up'=>-120,'ut'=>40,'cw'=>cw,
+ 'CMap'=>cMap,'registry'=>registry}
+ end
+
+ def AddCIDFonts(family,name,cw,cMap,registry)
+ AddCIDFont(family,'',name,cw,cMap,registry)
+ AddCIDFont(family,'B',name+',Bold',cw,cMap,registry)
+ AddCIDFont(family,'I',name+',Italic',cw,cMap,registry)
+ AddCIDFont(family,'BI',name+',BoldItalic',cw,cMap,registry)
+ end
+
+ def AddSJISFont(family='SJIS')
+ #Add SJIS font with proportional Latin
+ name='KozMinPro-Regular-Acro'
+ cw=SJIS_widths
+ cMap='90msp-RKSJ-H'
+ registry={'ordering'=>'Japan1','supplement'=>2}
+ AddCIDFonts(family,name,cw,cMap,registry)
+ end
+
+ def AddSJIShwFont(family='SJIS-hw')
+ #Add SJIS font with half-width Latin
+ name='KozMinPro-Regular-Acro'
+ 32.upto(126) do |i|
+ cw[i.chr]=500
+ end
+ cMap='90ms-RKSJ-H'
+ registry={'ordering'=>'Japan1','supplement'=>2}
+ AddCIDFonts(family,name,cw,cMap,registry)
+ end
+
+ def GetStringWidth(s)
+ if(@CurrentFont['type']=='Type0')
+ return GetSJISStringWidth(s)
+ else
+ return super(s)
+ end
+ end
+
+ def GetSJISStringWidth(s)
+ #SJIS version of GetStringWidth()
+ l=0
+ cw=@CurrentFont['cw']
+ nb=s.length
+ i=0
+ while(i<nb)
+ o=s[i]
+ if(o<128)
+ #ASCII
+ l+=cw[o.chr]
+ i+=1
+ elsif(o>=161 and o<=223)
+ #Half-width katakana
+ l+=500
+ i+=1
+ else
+ #Full-width character
+ l+=1000
+ i+=2
+ end
+ end
+ return l*@FontSize/1000
+ end
+
+ def MultiCell(w,h,txt,border=0,align='L',fill=0)
+ if(@CurrentFont['type']=='Type0')
+ SJISMultiCell(w,h,txt,border,align,fill)
+ else
+ super(w,h,txt,border,align,fill)
+ end
+ end
+
+ def SJISMultiCell(w,h,txt,border=0,align='L',fill=0)
+ #Output text with automatic or explicit line breaks
+ 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.index('L').nil?)
+ b2+='L'
+ end
+ if(border.index('R').nil?)
+ b2+='R'
+ end
+ b=border.index('T').nil? ? b2+'T' : b2
+ end
+ end
+ sep=-1
+ i=0
+ j=0
+ l=0
+ nl=1
+ while(i<nb)
+ #Get next character
+ c=s[i]
+ o=ord(c)
+ if(o==10)
+ #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(o<128)
+ #ASCII
+ l+=cw[c.chr]
+ n=1
+ if(o==32)
+ sep=i
+ end
+ elsif(o>=161 and o<=223)
+ #Half-width katakana
+ l+=500
+ n=1
+ sep=i
+ else
+ #Full-width character
+ l+=1000
+ n=2
+ sep=i
+ end
+ if(l>wmax)
+ #Automatic line break
+ if(sep==-1 or i==j)
+ if(i==j)
+ i+=n
+ 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+=n
+ if(o>=128)
+ sep=i
+ end
+ end
+ end
+ #Last chunk
+ if(border and not border.index('B').nil?)
+ b+='B'
+ end
+ Cell(w,h,s[j,i-j],b,2,align,fill)
+ @x=@lMargin
+ end
+
+ def Write(h,txt,link='')
+ if(@CurrentFont['type']=='Type0')
+ SJISWrite(h,txt,link)
+ else
+ super(h,txt,link)
+ end
+ end
+
+ def SJISWrite(h,txt,link)
+ #SJIS version of Write()
+ cw=@CurrentFont['cw']
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ s=txt.gsub("\r",'')
+ nb=s.length
+ sep=-1
+ i=0
+ j=0
+ l=0
+ nl=1
+ while(i<nb)
+ #Get next character
+ c=s[i]
+ o=c
+ if(o==10)
+ #Explicit line break
+ Cell(w,h,s[j,i-j],0,2,'',0,link)
+ i+=1
+ sep=-1
+ j=i
+ l=0
+ if(nl==1)
+ #Go to left margin
+ @x=@lMargin
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ end
+ nl+=1
+ next
+ end
+ if(o<128)
+ #ASCII
+ l+=cw[c.chr]
+ n=1
+ if(o==32)
+ sep=i
+ end
+ elsif(o>=161 and o<=223)
+ #Half-width katakana
+ l+=500
+ n=1
+ sep=i
+ else
+ #Full-width character
+ l+=1000
+ n=2
+ sep=i
+ end
+ if(l>wmax)
+ #Automatic line break
+ if(sep==-1 or i==j)
+ if(@x>@lMargin)
+ #Move to next line
+ @x=@lMargin
+ @y+=h
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ i+=n
+ nl+=1
+ next
+ end
+ if(i==j)
+ i+=n
+ end
+ Cell(w,h,s[j,i-j],0,2,'',0,link)
+ else
+ Cell(w,h,s[j,sep-j],0,2,'',0,link)
+ i=(s[sep]==' ') ? sep+1 : sep
+ end
+ sep=-1
+ j=i
+ l=0
+ if(nl==1)
+ @x=@lMargin
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ end
+ nl+=1
+ else
+ i+=n
+ if(o>=128)
+ sep=i
+ end
+ end
+ end
+ #Last chunk
+ if(i!=j)
+ Cell(l/1000*@FontSize,h,s[j,i-j],0,0,'',0,link)
+ end
+ end
+
+private
+
+ def putfonts()
+ nf=@n
+ @diffs.each do |diff|
+ #Encodings
+ newobj()
+ out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['+diff+']>>')
+ out('endobj')
+ end
+ # mqr=get_magic_quotes_runtime()
+ # set_magic_quotes_runtime(0)
+ @FontFiles.each_pair do |file, info|
+ #Font file embedding
+ newobj()
+ @FontFiles[file]['n']=@n
+ if(defined('FPDF_FONTPATH'))
+ file=FPDF_FONTPATH+file
+ end
+ size=filesize(file)
+ if(!size)
+ Error('Font file not found')
+ end
+ out('<</Length '+size)
+ if(file[-2]=='.z')
+ out('/Filter /FlateDecode')
+ end
+ out('/Length1 '+info['length1'])
+ unless info['length2'].nil?
+ out('/Length2 '+info['length2']+' /Length3 0')
+ end
+ out('>>')
+ f=fopen(file,'rb')
+ putstream(fread(f,size))
+ fclose(f)
+ out('endobj')
+ end
+ # set_magic_quotes_runtime(mqr)
+ @fonts.each_pair do |k, font|
+ #Font objects
+ newobj()
+ @fonts[k]['n']=@n
+ out('<</Type /Font')
+ if(font['type']=='Type0')
+ putType0(font)
+ else
+ name=font['name']
+ out('/BaseFont /'+name)
+ if(font['type']=='core')
+ #Standard font
+ out('/Subtype /Type1')
+ if(name!='Symbol' and name!='ZapfDingbats')
+ out('/Encoding /WinAnsiEncoding')
+ end
+ else
+ #Additional font
+ out('/Subtype /'+font['type'])
+ out('/FirstChar 32')
+ out('/LastChar 255')
+ out('/Widths '+(@n+1)+' 0 R')
+ out('/FontDescriptor '+(@n+2)+' 0 R')
+ if(font['enc'])
+ if !font['diff'].nil?
+ out('/Encoding '+(nf+font['diff'])+' 0 R')
+ else
+ out('/Encoding /WinAnsiEncoding')
+ end
+ end
+ end
+ out('>>')
+ out('endobj')
+ if(font['type']!='core')
+ #Widths
+ newobj()
+ cw=font['cw']
+ s='['
+ 32.upto(255) do |i|
+ s+=cw[i.chr]+' '
+ end
+ out(s+']')
+ out('endobj')
+ #Descriptor
+ newobj()
+ s='<</Type /FontDescriptor /FontName /'+name
+ font['desc'].each_pair do |k, v|
+ s+=' /'+k+' '+v
+ end
+ file=font['file']
+ if(file)
+ s+=' /FontFile'+(font['type']=='Type1' ? '' : '2')+' '+@FontFiles[file]['n']+' 0 R'
+ end
+ out(s+'>>')
+ out('endobj')
+ end
+ end
+ end
+ end
+
+ def putType0(font)
+ #Type0
+ out('/Subtype /Type0')
+ out('/BaseFont /'+font['name']+'-'+font['CMap'])
+ out('/Encoding /'+font['CMap'])
+ out('/DescendantFonts ['+(@n+1).to_s+' 0 R]')
+ out('>>')
+ out('endobj')
+ #CIDFont
+ newobj()
+ out('<</Type /Font')
+ out('/Subtype /CIDFontType0')
+ out('/BaseFont /'+font['name'])
+ out('/CIDSystemInfo <</Registry (Adobe) /Ordering ('+font['registry']['ordering']+') /Supplement '+font['registry']['supplement'].to_s+'>>')
+ out('/FontDescriptor '+(@n+1).to_s+' 0 R')
+ w='/W [1 ['
+ font['cw'].keys.sort.each {|key|
+ w+=font['cw'][key].to_s + " "
+# ActionController::Base::logger.debug key.to_s
+# ActionController::Base::logger.debug font['cw'][key].to_s
+ }
+ out(w+'] 231 325 500 631 [500] 326 389 500]')
+ out('>>')
+ out('endobj')
+ #Font descriptor
+ newobj()
+ out('<</Type /FontDescriptor')
+ out('/FontName /'+font['name'])
+ out('/Flags 6')
+ out('/FontBBox [0 -200 1000 900]')
+ out('/ItalicAngle 0')
+ out('/Ascent 800')
+ out('/Descent -200')
+ out('/CapHeight 800')
+ out('/StemV 60')
+ out('>>')
+ out('endobj')
+ end
+end
diff --git a/vendor/plugins/rfpdf/lib/fpdf/korean.rb b/vendor/plugins/rfpdf/lib/fpdf/korean.rb
new file mode 100644
index 000000000..64131405e
--- /dev/null
+++ b/vendor/plugins/rfpdf/lib/fpdf/korean.rb
@@ -0,0 +1,436 @@
+# Copyright (c) 2006 4ssoM LLC <www.4ssoM.com>
+# 1.12 contributed by Ed Moss.
+#
+# The MIT License
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# This is direct port of korean.php
+#
+# Korean PDF support.
+#
+# Usage is as follows:
+#
+# require 'fpdf'
+# require 'chinese'
+# pdf = FPDF.new
+# pdf.extend(PDF_Korean)
+#
+# This allows it to be combined with other extensions, such as the bookmark
+# module.
+
+module PDF_Korean
+
+UHC_widths={' ' => 333, '!' => 416, '"' => 416, '#' => 833, '$' => 625, '%' => 916, '&' => 833, '\'' => 250,
+ '(' => 500, ')' => 500, '*' => 500, '+' => 833, ',' => 291, '-' => 833, '.' => 291, '/' => 375, '0' => 625, '1' => 625,
+ '2' => 625, '3' => 625, '4' => 625, '5' => 625, '6' => 625, '7' => 625, '8' => 625, '9' => 625, ':' => 333, ';' => 333,
+ '<' => 833, '=' => 833, '>' => 916, '?' => 500, '@' => 1000, 'A' => 791, 'B' => 708, 'C' => 708, 'D' => 750, 'E' => 708,
+ 'F' => 666, 'G' => 750, 'H' => 791, 'I' => 375, 'J' => 500, 'K' => 791, 'L' => 666, 'M' => 916, 'N' => 791, 'O' => 750,
+ 'P' => 666, 'Q' => 750, 'R' => 708, 'S' => 666, 'T' => 791, 'U' => 791, 'V' => 750, 'W' => 1000, 'X' => 708, 'Y' => 708,
+ 'Z' => 666, '[' => 500, '\\' => 375, ']' => 500, '^' => 500, '_' => 500, '`' => 333, 'a' => 541, 'b' => 583, 'c' => 541,
+ 'd' => 583, 'e' => 583, 'f' => 375, 'g' => 583, 'h' => 583, 'i' => 291, 'j' => 333, 'k' => 583, 'l' => 291, 'm' => 875,
+ 'n' => 583, 'o' => 583, 'p' => 583, 'q' => 583, 'r' => 458, 's' => 541, 't' => 375, 'u' => 583, 'v' => 583, 'w' => 833,
+ 'x' => 625, 'y' => 625, 'z' => 500, '{' => 583, '|' => 583, '}' => 583, '~' => 750}
+
+ def AddCIDFont(family,style,name,cw,cMap,registry)
+ fontkey=family.downcase+style.upcase
+ unless @fonts[fontkey].nil?
+ Error("Font already added: family style")
+ end
+ i=@fonts.length+1
+ name=name.gsub(' ','')
+ @fonts[fontkey]={'i'=>i,'type'=>'Type0','name'=>name,'up'=>-130,'ut'=>40,'cw'=>cw,
+ 'CMap'=>cMap,'registry'=>registry}
+ end
+
+ def AddCIDFonts(family,name,cw,cMap,registry)
+ AddCIDFont(family,'',name,cw,cMap,registry)
+ AddCIDFont(family,'B',name+',Bold',cw,cMap,registry)
+ AddCIDFont(family,'I',name+',Italic',cw,cMap,registry)
+ AddCIDFont(family,'BI',name+',BoldItalic',cw,cMap,registry)
+ end
+
+ def AddUHCFont(family='UHC',name='HYSMyeongJoStd-Medium-Acro')
+ #Add UHC font with proportional Latin
+ 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='HYSMyeongJoStd-Medium-Acro')
+ #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 GetStringWidth(s)
+ if(@CurrentFont['type']=='Type0')
+ return GetMBStringWidth(s)
+ else
+ return super(s)
+ end
+ end
+
+ def GetMBStringWidth(s)
+ #Multi-byte version of GetStringWidth()
+ l=0
+ cw=@CurrentFont['cw']
+ nb=s.length
+ i=0
+ while(i<nb)
+ c=s[i]
+ if(c<128)
+ l+=cw[c.chr]
+ i+=1
+ else
+ l+=1000
+ i+=2
+ end
+ end
+ return l*@FontSize/1000
+ 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.index('L').nil?)
+ b2+='L'
+ end
+ if(border.index('R').nil?)
+ b2+='R'
+ end
+ b=border.index('T').nil? ? 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=="\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] : 1000
+ if(l>wmax)
+ #Automatic line break
+ if(sep==-1 or i==j)
+ if(i==j)
+ i+=ascii ? 1 : 2
+ 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 : 2
+ end
+ end
+ #Last chunk
+ if(border and not border.index('B').nil?)
+ b+='B'
+ end
+ Cell(w,h,s[j,i-j],b,2,align,fill)
+ @x=@lMargin
+ end
+
+ def Write(h,txt,link='')
+ if(@CurrentFont['type']=='Type0')
+ MBWrite(h,txt,link)
+ else
+ super(h,txt,link)
+ end
+ end
+
+ def MBWrite(h,txt,link)
+ #Multi-byte version of Write()
+ cw=@CurrentFont['cw']
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ s=txt.gsub("\r",'')
+ nb=s.length
+ 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=="\n")
+ #Explicit line break
+ Cell(w,h,s[j,i-j],0,2,'',0,link)
+ i+=1
+ sep=-1
+ j=i
+ l=0
+ if(nl==1)
+ @x=@lMargin
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ end
+ nl+=1
+ next
+ end
+ if(!ascii or c==' ')
+ sep=i
+ end
+ l+=ascii ? cw[c.chr] : 1000
+ if(l>wmax)
+ #Automatic line break
+ if(sep==-1 or i==j)
+ if(@x>@lMargin)
+ #Move to next line
+ @x=@lMargin
+ @y+=h
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ i+=1
+ nl+=1
+ next
+ end
+ if(i==j)
+ i+=ascii ? 1 : 2
+ end
+ Cell(w,h,s[j,i-j],0,2,'',0,link)
+ else
+ Cell(w,h,s[j,sep-j],0,2,'',0,link)
+ i=(s[sep]==' ') ? sep+1 : sep
+ end
+ sep=-1
+ j=i
+ l=0
+ if(nl==1)
+ @x=@lMargin
+ w=@w-@rMargin-@x
+ wmax=(w-2*@cMargin)*1000/@FontSize
+ end
+ nl+=1
+ else
+ i+=ascii ? 1 : 2
+ end
+ end
+ #Last chunk
+ if(i!=j)
+ Cell(l/1000*@FontSize,h,s[j,i-j],0,0,'',0,link)
+ end
+ end
+
+private
+
+ def putfonts()
+ nf=@n
+ @diffs.each do |diff|
+ #Encodings
+ newobj()
+ out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['+diff+']>>')
+ out('endobj')
+ end
+ # mqr=get_magic_quotes_runtime()
+ # set_magic_quotes_runtime(0)
+ @FontFiles.each_pair do |file, info|
+ #Font file embedding
+ newobj()
+ @FontFiles[file]['n']=@n
+ if(defined('FPDF_FONTPATH'))
+ file=FPDF_FONTPATH+file
+ end
+ size=filesize(file)
+ if(!size)
+ Error('Font file not found')
+ end
+ out('<</Length '+size)
+ if(file[-2]=='.z')
+ out('/Filter /FlateDecode')
+ end
+ out('/Length1 '+info['length1'])
+ if(not info['length2'].nil?)
+ out('/Length2 '+info['length2']+' /Length3 0')
+ end
+ out('>>')
+ f=fopen(file,'rb')
+ putstream(fread(f,size))
+ fclose(f)
+ out('endobj')
+ end
+ # set_magic_quotes_runtime(mqr)
+ @fonts.each_pair do |k, font|
+ #Font objects
+ newobj()
+ @fonts[k]['n']=@n
+ out('<</Type /Font')
+ if(font['type']=='Type0')
+ putType0(font)
+ else
+ name=font['name']
+ out('/BaseFont /'+name)
+ if(font['type']=='core')
+ #Standard font
+ out('/Subtype /Type1')
+ if(name!='Symbol' and name!='ZapfDingbats')
+ out('/Encoding /WinAnsiEncoding')
+ end
+ else
+ #Additional font
+ out('/Subtype /'+font['type'])
+ out('/FirstChar 32')
+ out('/LastChar 255')
+ out('/Widths '+(@n+1)+' 0 R')
+ out('/FontDescriptor '+(@n+2)+' 0 R')
+ if(font['enc'])
+ if(not font['diff'].nil?)
+ out('/Encoding '+(nf+font['diff'])+' 0 R')
+ else
+ out('/Encoding /WinAnsiEncoding')
+ end
+ end
+ end
+ out('>>')
+ out('endobj')
+ if(font['type']!='core')
+ #Widths
+ newobj()
+ cw=font['cw']
+ s='['
+ 32.upto(255) do |i|
+ s+=cw[i.chr]+' '
+ end
+ out(s+']')
+ out('endobj')
+ #Descriptor
+ newobj()
+ s='<</Type /FontDescriptor /FontName /'+name
+ font['desc'].each_pair do |k, v|
+ s+=' /'+k+' '+v
+ end
+ file=font['file']
+ if(file)
+ s+=' /FontFile'+(font['type']=='Type1' ? '' : '2')+' '+@FontFiles[file]['n']+' 0 R'
+ end
+ out(s+'>>')
+ out('endobj')
+ end
+ end
+ end
+ end
+
+ def putType0(font)
+ #Type0
+ out('/Subtype /Type0')
+ out('/BaseFont /'+font['name']+'-'+font['CMap'])
+ out('/Encoding /'+font['CMap'])
+ out('/DescendantFonts ['+(@n+1).to_s+' 0 R]')
+ out('>>')
+ out('endobj')
+ #CIDFont
+ newobj()
+ out('<</Type /Font')
+ out('/Subtype /CIDFontType0')
+ out('/BaseFont /'+font['name'])
+ out('/CIDSystemInfo <</Registry (Adobe) /Ordering ('+font['registry']['ordering']+') /Supplement '+font['registry']['supplement'].to_s+'>>')
+ out('/FontDescriptor '+(@n+1).to_s+' 0 R')
+ if(font['CMap']=='KSCms-UHC-HW-H')
+ w='8094 8190 500'
+ else
+ w='1 ['
+ font['cw'].keys.sort.each {|key|
+ w+=font['cw'][key].to_s + " "
+ # ActionController::Base::logger.debug key.to_s
+ # ActionController::Base::logger.debug font['cw'][key].to_s
+ }
+ w +=']'
+ end
+ out('/W ['+w+']>>')
+ out('endobj')
+ #Font descriptor
+ newobj()
+ out('<</Type /FontDescriptor')
+ out('/FontName /'+font['name'])
+ out('/Flags 6')
+ out('/FontBBox [0 -200 1000 900]')
+ out('/ItalicAngle 0')
+ out('/Ascent 800')
+ out('/Descent -200')
+ out('/CapHeight 800')
+ out('/StemV 50')
+ out('>>')
+ out('endobj')
+ end
+end
diff --git a/vendor/plugins/rfpdf/lib/fpdf/makefont.rb b/vendor/plugins/rfpdf/lib/fpdf/makefont.rb
new file mode 100644
index 000000000..ffc98b48f
--- /dev/null
+++ b/vendor/plugins/rfpdf/lib/fpdf/makefont.rb
@@ -0,0 +1,1787 @@
+#!/usr/bin/env ruby
+#
+# Utility to generate font definition files
+# Version: 1.1
+# Date: 2006-07-19
+#
+# Changelog:
+# Version 1.1 - Brian Ollenberger
+# - Fixed a very small bug in MakeFont for generating FontDef.diff.
+
+Charencodings = {
+# Central Europe
+ 'cp1250' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', '.notdef',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ '.notdef', 'perthousand', 'Scaron', 'guilsinglleft',
+ 'Sacute', 'Tcaron', 'Zcaron', 'Zacute',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ '.notdef', 'trademark', 'scaron', 'guilsinglright',
+ 'sacute', 'tcaron', 'zcaron', 'zacute',
+ 'space', 'caron', 'breve', 'Lslash',
+ 'currency', 'Aogonek', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'Scedilla', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'Zdotaccent',
+ 'degree', 'plusminus', 'ogonek', 'lslash',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'aogonek', 'scedilla', 'guillemotright',
+ 'Lcaron', 'hungarumlaut', 'lcaron', 'zdotaccent',
+ 'Racute', 'Aacute', 'Acircumflex', 'Abreve',
+ 'Adieresis', 'Lacute', 'Cacute', 'Ccedilla',
+ 'Ccaron', 'Eacute', 'Eogonek', 'Edieresis',
+ 'Ecaron', 'Iacute', 'Icircumflex', 'Dcaron',
+ 'Dcroat', 'Nacute', 'Ncaron', 'Oacute',
+ 'Ocircumflex', 'Ohungarumlaut', 'Odieresis', 'multiply',
+ 'Rcaron', 'Uring', 'Uacute', 'Uhungarumlaut',
+ 'Udieresis', 'Yacute', 'Tcommaaccent', 'germandbls',
+ 'racute', 'aacute', 'acircumflex', 'abreve',
+ 'adieresis', 'lacute', 'cacute', 'ccedilla',
+ 'ccaron', 'eacute', 'eogonek', 'edieresis',
+ 'ecaron', 'iacute', 'icircumflex', 'dcaron',
+ 'dcroat', 'nacute', 'ncaron', 'oacute',
+ 'ocircumflex', 'ohungarumlaut', 'odieresis', 'divide',
+ 'rcaron', 'uring', 'uacute', 'uhungarumlaut',
+ 'udieresis', 'yacute', 'tcommaaccent', 'dotaccent'
+ ],
+# Cyrillic
+ 'cp1251' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'afii10051', 'afii10052', 'quotesinglbase', 'afii10100',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ 'Euro', 'perthousand', 'afii10058', 'guilsinglleft',
+ 'afii10059', 'afii10061', 'afii10060', 'afii10145',
+ 'afii10099', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ '.notdef', 'trademark', 'afii10106', 'guilsinglright',
+ 'afii10107', 'afii10109', 'afii10108', 'afii10193',
+ 'space', 'afii10062', 'afii10110', 'afii10057',
+ 'currency', 'afii10050', 'brokenbar', 'section',
+ 'afii10023', 'copyright', 'afii10053', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'afii10056',
+ 'degree', 'plusminus', 'afii10055', 'afii10103',
+ 'afii10098', 'mu', 'paragraph', 'periodcentered',
+ 'afii10071', 'afii61352', 'afii10101', 'guillemotright',
+ 'afii10105', 'afii10054', 'afii10102', 'afii10104',
+ 'afii10017', 'afii10018', 'afii10019', 'afii10020',
+ 'afii10021', 'afii10022', 'afii10024', 'afii10025',
+ 'afii10026', 'afii10027', 'afii10028', 'afii10029',
+ 'afii10030', 'afii10031', 'afii10032', 'afii10033',
+ 'afii10034', 'afii10035', 'afii10036', 'afii10037',
+ 'afii10038', 'afii10039', 'afii10040', 'afii10041',
+ 'afii10042', 'afii10043', 'afii10044', 'afii10045',
+ 'afii10046', 'afii10047', 'afii10048', 'afii10049',
+ 'afii10065', 'afii10066', 'afii10067', 'afii10068',
+ 'afii10069', 'afii10070', 'afii10072', 'afii10073',
+ 'afii10074', 'afii10075', 'afii10076', 'afii10077',
+ 'afii10078', 'afii10079', 'afii10080', 'afii10081',
+ 'afii10082', 'afii10083', 'afii10084', 'afii10085',
+ 'afii10086', 'afii10087', 'afii10088', 'afii10089',
+ 'afii10090', 'afii10091', 'afii10092', 'afii10093',
+ 'afii10094', 'afii10095', 'afii10096', 'afii10097'
+ ],
+# Western Europe
+ 'cp1252' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft',
+ 'OE', '.notdef', 'Zcaron', '.notdef',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ 'tilde', 'trademark', 'scaron', 'guilsinglright',
+ 'oe', '.notdef', 'zcaron', 'Ydieresis',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'questiondown',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Atilde',
+ 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Eth', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
+ 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde',
+ 'adieresis', 'aring', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis',
+ 'eth', 'ntilde', 'ograve', 'oacute',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'yacute', 'thorn', 'ydieresis'
+ ],
+# Greek
+ 'cp1253' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ '.notdef', 'perthousand', '.notdef', 'guilsinglleft',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ '.notdef', 'trademark', '.notdef', 'guilsinglright',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'dieresistonos', 'Alphatonos', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', '.notdef', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'afii00208',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'tonos', 'mu', 'paragraph', 'periodcentered',
+ 'Epsilontonos', 'Etatonos', 'Iotatonos', 'guillemotright',
+ 'Omicrontonos', 'onehalf', 'Upsilontonos', 'Omegatonos',
+ 'iotadieresistonos','Alpha', 'Beta', 'Gamma',
+ 'Delta', 'Epsilon', 'Zeta', 'Eta',
+ 'Theta', 'Iota', 'Kappa', 'Lambda',
+ 'Mu', 'Nu', 'Xi', 'Omicron',
+ 'Pi', 'Rho', '.notdef', 'Sigma',
+ 'Tau', 'Upsilon', 'Phi', 'Chi',
+ 'Psi', 'Omega', 'Iotadieresis', 'Upsilondieresis',
+ 'alphatonos', 'epsilontonos', 'etatonos', 'iotatonos',
+ 'upsilondieresistonos','alpha', 'beta', 'gamma',
+ 'delta', 'epsilon', 'zeta', 'eta',
+ 'theta', 'iota', 'kappa', 'lambda',
+ 'mu', 'nu', 'xi', 'omicron',
+ 'pi', 'rho', 'sigma1', 'sigma',
+ 'tau', 'upsilon', 'phi', 'chi',
+ 'psi', 'omega', 'iotadieresis', 'upsilondieresis',
+ 'omicrontonos', 'upsilontonos', 'omegatonos', '.notdef'
+ ],
+# Turkish
+ 'cp1254' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft',
+ 'OE', '.notdef', '.notdef', '.notdef',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ 'tilde', 'trademark', 'scaron', 'guilsinglright',
+ 'oe', '.notdef', '.notdef', 'Ydieresis',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'questiondown',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Atilde',
+ 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Gbreve', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
+ 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Idotaccent', 'Scedilla', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde',
+ 'adieresis', 'aring', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis',
+ 'gbreve', 'ntilde', 'ograve', 'oacute',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'dotlessi', 'scedilla', 'ydieresis'
+ ],
+# Hebrew
+ 'cp1255' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ 'circumflex', 'perthousand', '.notdef', 'guilsinglleft',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ 'tilde', 'trademark', '.notdef', 'guilsinglright',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'afii57636', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'multiply', 'guillemotleft',
+ 'logicalnot', 'sfthyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'middot',
+ 'cedilla', 'onesuperior', 'divide', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'questiondown',
+ 'afii57799', 'afii57801', 'afii57800', 'afii57802',
+ 'afii57793', 'afii57794', 'afii57795', 'afii57798',
+ 'afii57797', 'afii57806', '.notdef', 'afii57796',
+ 'afii57807', 'afii57839', 'afii57645', 'afii57841',
+ 'afii57842', 'afii57804', 'afii57803', 'afii57658',
+ 'afii57716', 'afii57717', 'afii57718', 'gereshhebrew',
+ 'gershayimhebrew','.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'afii57664', 'afii57665', 'afii57666', 'afii57667',
+ 'afii57668', 'afii57669', 'afii57670', 'afii57671',
+ 'afii57672', 'afii57673', 'afii57674', 'afii57675',
+ 'afii57676', 'afii57677', 'afii57678', 'afii57679',
+ 'afii57680', 'afii57681', 'afii57682', 'afii57683',
+ 'afii57684', 'afii57685', 'afii57686', 'afii57687',
+ 'afii57688', 'afii57689', 'afii57690', '.notdef',
+ '.notdef', 'afii299', 'afii300', '.notdef'
+ ],
+# Baltic
+ 'cp1257' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', '.notdef',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ '.notdef', 'perthousand', '.notdef', 'guilsinglleft',
+ '.notdef', 'dieresis', 'caron', 'cedilla',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ '.notdef', 'trademark', '.notdef', 'guilsinglright',
+ '.notdef', 'macron', 'ogonek', '.notdef',
+ 'space', '.notdef', 'cent', 'sterling',
+ 'currency', '.notdef', 'brokenbar', 'section',
+ 'Oslash', 'copyright', 'Rcommaaccent', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'AE',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'oslash', 'onesuperior', 'rcommaaccent', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'ae',
+ 'Aogonek', 'Iogonek', 'Amacron', 'Cacute',
+ 'Adieresis', 'Aring', 'Eogonek', 'Emacron',
+ 'Ccaron', 'Eacute', 'Zacute', 'Edotaccent',
+ 'Gcommaaccent', 'Kcommaaccent', 'Imacron', 'Lcommaaccent',
+ 'Scaron', 'Nacute', 'Ncommaaccent', 'Oacute',
+ 'Omacron', 'Otilde', 'Odieresis', 'multiply',
+ 'Uogonek', 'Lslash', 'Sacute', 'Umacron',
+ 'Udieresis', 'Zdotaccent', 'Zcaron', 'germandbls',
+ 'aogonek', 'iogonek', 'amacron', 'cacute',
+ 'adieresis', 'aring', 'eogonek', 'emacron',
+ 'ccaron', 'eacute', 'zacute', 'edotaccent',
+ 'gcommaaccent', 'kcommaaccent', 'imacron', 'lcommaaccent',
+ 'scaron', 'nacute', 'ncommaaccent', 'oacute',
+ 'omacron', 'otilde', 'odieresis', 'divide',
+ 'uogonek', 'lslash', 'sacute', 'umacron',
+ 'udieresis', 'zdotaccent', 'zcaron', 'dotaccent'
+ ],
+# Vietnamese
+ 'cp1258' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl',
+ 'circumflex', 'perthousand', '.notdef', 'guilsinglleft',
+ 'OE', '.notdef', '.notdef', '.notdef',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ 'tilde', 'trademark', '.notdef', 'guilsinglright',
+ 'oe', '.notdef', '.notdef', 'Ydieresis',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'questiondown',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Abreve',
+ 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'gravecomb', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Dcroat', 'Ntilde', 'hookabovecomb', 'Oacute',
+ 'Ocircumflex', 'Ohorn', 'Odieresis', 'multiply',
+ 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Uhorn', 'tildecomb', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'abreve',
+ 'adieresis', 'aring', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'acutecomb', 'iacute', 'icircumflex', 'idieresis',
+ 'dcroat', 'ntilde', 'dotbelowcomb', 'oacute',
+ 'ocircumflex', 'ohorn', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'uhorn', 'dong', 'ydieresis'
+ ],
+# Thai
+ 'cp874' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'Euro', '.notdef', '.notdef', '.notdef',
+ '.notdef', 'ellipsis', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'kokaithai', 'khokhaithai', 'khokhuatthai',
+ 'khokhwaithai', 'khokhonthai', 'khorakhangthai', 'ngonguthai',
+ 'chochanthai', 'chochingthai', 'chochangthai', 'sosothai',
+ 'chochoethai', 'yoyingthai', 'dochadathai', 'topatakthai',
+ 'thothanthai', 'thonangmonthothai', 'thophuthaothai', 'nonenthai',
+ 'dodekthai', 'totaothai', 'thothungthai', 'thothahanthai',
+ 'thothongthai', 'nonuthai', 'bobaimaithai', 'poplathai',
+ 'phophungthai', 'fofathai', 'phophanthai', 'fofanthai',
+ 'phosamphaothai', 'momathai', 'yoyakthai', 'roruathai',
+ 'ruthai', 'lolingthai', 'luthai', 'wowaenthai',
+ 'sosalathai', 'sorusithai', 'sosuathai', 'hohipthai',
+ 'lochulathai', 'oangthai', 'honokhukthai', 'paiyannoithai',
+ 'saraathai', 'maihanakatthai', 'saraaathai', 'saraamthai',
+ 'saraithai', 'saraiithai', 'sarauethai', 'saraueethai',
+ 'sarauthai', 'sarauuthai', 'phinthuthai', '.notdef',
+ '.notdef', '.notdef', '.notdef', 'bahtthai',
+ 'saraethai', 'saraaethai', 'saraothai', 'saraaimaimuanthai',
+ 'saraaimaimalaithai', 'lakkhangyaothai', 'maiyamokthai', 'maitaikhuthai',
+ 'maiekthai', 'maithothai', 'maitrithai', 'maichattawathai',
+ 'thanthakhatthai', 'nikhahitthai', 'yamakkanthai', 'fongmanthai',
+ 'zerothai', 'onethai', 'twothai', 'threethai',
+ 'fourthai', 'fivethai', 'sixthai', 'seventhai',
+ 'eightthai', 'ninethai', 'angkhankhuthai', 'khomutthai',
+ '.notdef', '.notdef', '.notdef', '.notdef'
+ ],
+# Western Europe
+ 'ISO-8859-1' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'questiondown',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Atilde',
+ 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Eth', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
+ 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde',
+ 'adieresis', 'aring', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis',
+ 'eth', 'ntilde', 'ograve', 'oacute',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'yacute', 'thorn', 'ydieresis'
+ ],
+# Central Europe
+ 'ISO-8859-2' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'Aogonek', 'breve', 'Lslash',
+ 'currency', 'Lcaron', 'Sacute', 'section',
+ 'dieresis', 'Scaron', 'Scedilla', 'Tcaron',
+ 'Zacute', 'hyphen', 'Zcaron', 'Zdotaccent',
+ 'degree', 'aogonek', 'ogonek', 'lslash',
+ 'acute', 'lcaron', 'sacute', 'caron',
+ 'cedilla', 'scaron', 'scedilla', 'tcaron',
+ 'zacute', 'hungarumlaut', 'zcaron', 'zdotaccent',
+ 'Racute', 'Aacute', 'Acircumflex', 'Abreve',
+ 'Adieresis', 'Lacute', 'Cacute', 'Ccedilla',
+ 'Ccaron', 'Eacute', 'Eogonek', 'Edieresis',
+ 'Ecaron', 'Iacute', 'Icircumflex', 'Dcaron',
+ 'Dcroat', 'Nacute', 'Ncaron', 'Oacute',
+ 'Ocircumflex', 'Ohungarumlaut', 'Odieresis', 'multiply',
+ 'Rcaron', 'Uring', 'Uacute', 'Uhungarumlaut',
+ 'Udieresis', 'Yacute', 'Tcommaaccent', 'germandbls',
+ 'racute', 'aacute', 'acircumflex', 'abreve',
+ 'adieresis', 'lacute', 'cacute', 'ccedilla',
+ 'ccaron', 'eacute', 'eogonek', 'edieresis',
+ 'ecaron', 'iacute', 'icircumflex', 'dcaron',
+ 'dcroat', 'nacute', 'ncaron', 'oacute',
+ 'ocircumflex', 'ohungarumlaut', 'odieresis', 'divide',
+ 'rcaron', 'uring', 'uacute', 'uhungarumlaut',
+ 'udieresis', 'yacute', 'tcommaaccent', 'dotaccent'
+ ],
+# Baltic
+ 'ISO-8859-4' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'Aogonek', 'kgreenlandic', 'Rcommaaccent',
+ 'currency', 'Itilde', 'Lcommaaccent', 'section',
+ 'dieresis', 'Scaron', 'Emacron', 'Gcommaaccent',
+ 'Tbar', 'hyphen', 'Zcaron', 'macron',
+ 'degree', 'aogonek', 'ogonek', 'rcommaaccent',
+ 'acute', 'itilde', 'lcommaaccent', 'caron',
+ 'cedilla', 'scaron', 'emacron', 'gcommaaccent',
+ 'tbar', 'Eng', 'zcaron', 'eng',
+ 'Amacron', 'Aacute', 'Acircumflex', 'Atilde',
+ 'Adieresis', 'Aring', 'AE', 'Iogonek',
+ 'Ccaron', 'Eacute', 'Eogonek', 'Edieresis',
+ 'Edotaccent', 'Iacute', 'Icircumflex', 'Imacron',
+ 'Dcroat', 'Ncommaaccent', 'Omacron', 'Kcommaaccent',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
+ 'Oslash', 'Uogonek', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Utilde', 'Umacron', 'germandbls',
+ 'amacron', 'aacute', 'acircumflex', 'atilde',
+ 'adieresis', 'aring', 'ae', 'iogonek',
+ 'ccaron', 'eacute', 'eogonek', 'edieresis',
+ 'edotaccent', 'iacute', 'icircumflex', 'imacron',
+ 'dcroat', 'ncommaaccent', 'omacron', 'kcommaaccent',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'uogonek', 'uacute', 'ucircumflex',
+ 'udieresis', 'utilde', 'umacron', 'dotaccent'
+ ],
+# Cyrillic
+ 'ISO-8859-5' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'afii10023', 'afii10051', 'afii10052',
+ 'afii10053', 'afii10054', 'afii10055', 'afii10056',
+ 'afii10057', 'afii10058', 'afii10059', 'afii10060',
+ 'afii10061', 'hyphen', 'afii10062', 'afii10145',
+ 'afii10017', 'afii10018', 'afii10019', 'afii10020',
+ 'afii10021', 'afii10022', 'afii10024', 'afii10025',
+ 'afii10026', 'afii10027', 'afii10028', 'afii10029',
+ 'afii10030', 'afii10031', 'afii10032', 'afii10033',
+ 'afii10034', 'afii10035', 'afii10036', 'afii10037',
+ 'afii10038', 'afii10039', 'afii10040', 'afii10041',
+ 'afii10042', 'afii10043', 'afii10044', 'afii10045',
+ 'afii10046', 'afii10047', 'afii10048', 'afii10049',
+ 'afii10065', 'afii10066', 'afii10067', 'afii10068',
+ 'afii10069', 'afii10070', 'afii10072', 'afii10073',
+ 'afii10074', 'afii10075', 'afii10076', 'afii10077',
+ 'afii10078', 'afii10079', 'afii10080', 'afii10081',
+ 'afii10082', 'afii10083', 'afii10084', 'afii10085',
+ 'afii10086', 'afii10087', 'afii10088', 'afii10089',
+ 'afii10090', 'afii10091', 'afii10092', 'afii10093',
+ 'afii10094', 'afii10095', 'afii10096', 'afii10097',
+ 'afii61352', 'afii10071', 'afii10099', 'afii10100',
+ 'afii10101', 'afii10102', 'afii10103', 'afii10104',
+ 'afii10105', 'afii10106', 'afii10107', 'afii10108',
+ 'afii10109', 'section', 'afii10110', 'afii10193'
+ ],
+# Greek
+ 'ISO-8859-7' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'quoteleft', 'quoteright', 'sterling',
+ '.notdef', '.notdef', 'brokenbar', 'section',
+ 'dieresis', 'copyright', '.notdef', 'guillemotleft',
+ 'logicalnot', 'hyphen', '.notdef', 'afii00208',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'tonos', 'dieresistonos', 'Alphatonos', 'periodcentered',
+ 'Epsilontonos', 'Etatonos', 'Iotatonos', 'guillemotright',
+ 'Omicrontonos', 'onehalf', 'Upsilontonos', 'Omegatonos',
+ 'iotadieresistonos','Alpha', 'Beta', 'Gamma',
+ 'Delta', 'Epsilon', 'Zeta', 'Eta',
+ 'Theta', 'Iota', 'Kappa', 'Lambda',
+ 'Mu', 'Nu', 'Xi', 'Omicron',
+ 'Pi', 'Rho', '.notdef', 'Sigma',
+ 'Tau', 'Upsilon', 'Phi', 'Chi',
+ 'Psi', 'Omega', 'Iotadieresis', 'Upsilondieresis',
+ 'alphatonos', 'epsilontonos', 'etatonos', 'iotatonos',
+ 'upsilondieresistonos','alpha', 'beta', 'gamma',
+ 'delta', 'epsilon', 'zeta', 'eta',
+ 'theta', 'iota', 'kappa', 'lambda',
+ 'mu', 'nu', 'xi', 'omicron',
+ 'pi', 'rho', 'sigma1', 'sigma',
+ 'tau', 'upsilon', 'phi', 'chi',
+ 'psi', 'omega', 'iotadieresis', 'upsilondieresis',
+ 'omicrontonos', 'upsilontonos', 'omegatonos', '.notdef'
+ ],
+# Turkish
+ 'ISO-8859-9' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section',
+ 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright',
+ 'onequarter', 'onehalf', 'threequarters', 'questiondown',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Atilde',
+ 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Gbreve', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
+ 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Idotaccent', 'Scedilla', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde',
+ 'adieresis', 'aring', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis',
+ 'gbreve', 'ntilde', 'ograve', 'oacute',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'dotlessi', 'scedilla', 'ydieresis'
+ ],
+# Thai
+ 'ISO-8859-11' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'kokaithai', 'khokhaithai', 'khokhuatthai',
+ 'khokhwaithai', 'khokhonthai', 'khorakhangthai', 'ngonguthai',
+ 'chochanthai', 'chochingthai', 'chochangthai', 'sosothai',
+ 'chochoethai', 'yoyingthai', 'dochadathai', 'topatakthai',
+ 'thothanthai', 'thonangmonthothai','thophuthaothai', 'nonenthai',
+ 'dodekthai', 'totaothai', 'thothungthai', 'thothahanthai',
+ 'thothongthai', 'nonuthai', 'bobaimaithai', 'poplathai',
+ 'phophungthai', 'fofathai', 'phophanthai', 'fofanthai',
+ 'phosamphaothai', 'momathai', 'yoyakthai', 'roruathai',
+ 'ruthai', 'lolingthai', 'luthai', 'wowaenthai',
+ 'sosalathai', 'sorusithai', 'sosuathai', 'hohipthai',
+ 'lochulathai', 'oangthai', 'honokhukthai', 'paiyannoithai',
+ 'saraathai', 'maihanakatthai', 'saraaathai', 'saraamthai',
+ 'saraithai', 'saraiithai', 'sarauethai', 'saraueethai',
+ 'sarauthai', 'sarauuthai', 'phinthuthai', '.notdef',
+ '.notdef', '.notdef', '.notdef', 'bahtthai',
+ 'saraethai', 'saraaethai', 'saraothai', 'saraaimaimuanthai',
+ 'saraaimaimalaithai','lakkhangyaothai','maiyamokthai', 'maitaikhuthai',
+ 'maiekthai', 'maithothai', 'maitrithai', 'maichattawathai',
+ 'thanthakhatthai','nikhahitthai', 'yamakkanthai', 'fongmanthai',
+ 'zerothai', 'onethai', 'twothai', 'threethai',
+ 'fourthai', 'fivethai', 'sixthai', 'seventhai',
+ 'eightthai', 'ninethai', 'angkhankhuthai', 'khomutthai',
+ '.notdef', '.notdef', '.notdef', '.notdef'
+ ],
+# Western Europe
+ 'ISO-8859-15' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclamdown', 'cent', 'sterling',
+ 'Euro', 'yen', 'Scaron', 'section',
+ 'scaron', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron',
+ 'degree', 'plusminus', 'twosuperior', 'threesuperior',
+ 'Zcaron', 'mu', 'paragraph', 'periodcentered',
+ 'zcaron', 'onesuperior', 'ordmasculine', 'guillemotright',
+ 'OE', 'oe', 'Ydieresis', 'questiondown',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Atilde',
+ 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Eth', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
+ 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde',
+ 'adieresis', 'aring', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis',
+ 'eth', 'ntilde', 'ograve', 'oacute',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide',
+ 'oslash', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'yacute', 'thorn', 'ydieresis'
+ ],
+# Central Europe
+ 'ISO-8859-16' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'Aogonek', 'aogonek', 'Lslash',
+ 'Euro', 'quotedblbase', 'Scaron', 'section',
+ 'scaron', 'copyright', 'Scommaaccent', 'guillemotleft',
+ 'Zacute', 'hyphen', 'zacute', 'Zdotaccent',
+ 'degree', 'plusminus', 'Ccaron', 'lslash',
+ 'Zcaron', 'quotedblright', 'paragraph', 'periodcentered',
+ 'zcaron', 'ccaron', 'scommaaccent', 'guillemotright',
+ 'OE', 'oe', 'Ydieresis', 'zdotaccent',
+ 'Agrave', 'Aacute', 'Acircumflex', 'Abreve',
+ 'Adieresis', 'Cacute', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis',
+ 'Dcroat', 'Nacute', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Ohungarumlaut', 'Odieresis', 'Sacute',
+ 'Uhungarumlaut', 'Ugrave', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Eogonek', 'Tcommaaccent', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'abreve',
+ 'adieresis', 'cacute', 'ae', 'ccedilla',
+ 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis',
+ 'dcroat', 'nacute', 'ograve', 'oacute',
+ 'ocircumflex', 'ohungarumlaut', 'odieresis', 'sacute',
+ 'uhungarumlaut', 'ugrave', 'uacute', 'ucircumflex',
+ 'udieresis', 'eogonek', 'tcommaaccent', 'ydieresis'
+ ],
+# Russian
+ 'KOI8-R' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'SF100000', 'SF110000', 'SF010000', 'SF030000',
+ 'SF020000', 'SF040000', 'SF080000', 'SF090000',
+ 'SF060000', 'SF070000', 'SF050000', 'upblock',
+ 'dnblock', 'block', 'lfblock', 'rtblock',
+ 'ltshade', 'shade', 'dkshade', 'integraltp',
+ 'filledbox', 'periodcentered', 'radical', 'approxequal',
+ 'lessequal', 'greaterequal', 'space', 'integralbt',
+ 'degree', 'twosuperior', 'periodcentered', 'divide',
+ 'SF430000', 'SF240000', 'SF510000', 'afii10071',
+ 'SF520000', 'SF390000', 'SF220000', 'SF210000',
+ 'SF250000', 'SF500000', 'SF490000', 'SF380000',
+ 'SF280000', 'SF270000', 'SF260000', 'SF360000',
+ 'SF370000', 'SF420000', 'SF190000', 'afii10023',
+ 'SF200000', 'SF230000', 'SF470000', 'SF480000',
+ 'SF410000', 'SF450000', 'SF460000', 'SF400000',
+ 'SF540000', 'SF530000', 'SF440000', 'copyright',
+ 'afii10096', 'afii10065', 'afii10066', 'afii10088',
+ 'afii10069', 'afii10070', 'afii10086', 'afii10068',
+ 'afii10087', 'afii10074', 'afii10075', 'afii10076',
+ 'afii10077', 'afii10078', 'afii10079', 'afii10080',
+ 'afii10081', 'afii10097', 'afii10082', 'afii10083',
+ 'afii10084', 'afii10085', 'afii10072', 'afii10067',
+ 'afii10094', 'afii10093', 'afii10073', 'afii10090',
+ 'afii10095', 'afii10091', 'afii10089', 'afii10092',
+ 'afii10048', 'afii10017', 'afii10018', 'afii10040',
+ 'afii10021', 'afii10022', 'afii10038', 'afii10020',
+ 'afii10039', 'afii10026', 'afii10027', 'afii10028',
+ 'afii10029', 'afii10030', 'afii10031', 'afii10032',
+ 'afii10033', 'afii10049', 'afii10034', 'afii10035',
+ 'afii10036', 'afii10037', 'afii10024', 'afii10019',
+ 'afii10046', 'afii10045', 'afii10025', 'afii10042',
+ 'afii10047', 'afii10043', 'afii10041', 'afii10044'
+ ],
+# Ukrainian
+ 'KOI8-U' => [
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ '.notdef', '.notdef', '.notdef', '.notdef',
+ 'space', 'exclam', 'quotedbl', 'numbersign',
+ 'dollar', 'percent', 'ampersand', 'quotesingle',
+ 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven',
+ 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C',
+ 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S',
+ 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'grave', 'a', 'b', 'c',
+ 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k',
+ 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's',
+ 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 'braceleft',
+ 'bar', 'braceright', 'asciitilde', '.notdef',
+ 'SF100000', 'SF110000', 'SF010000', 'SF030000',
+ 'SF020000', 'SF040000', 'SF080000', 'SF090000',
+ 'SF060000', 'SF070000', 'SF050000', 'upblock',
+ 'dnblock', 'block', 'lfblock', 'rtblock',
+ 'ltshade', 'shade', 'dkshade', 'integraltp',
+ 'filledbox', 'bullet', 'radical', 'approxequal',
+ 'lessequal', 'greaterequal', 'space', 'integralbt',
+ 'degree', 'twosuperior', 'periodcentered', 'divide',
+ 'SF430000', 'SF240000', 'SF510000', 'afii10071',
+ 'afii10101', 'SF390000', 'afii10103', 'afii10104',
+ 'SF250000', 'SF500000', 'SF490000', 'SF380000',
+ 'SF280000', 'afii10098', 'SF260000', 'SF360000',
+ 'SF370000', 'SF420000', 'SF190000', 'afii10023',
+ 'afii10053', 'SF230000', 'afii10055', 'afii10056',
+ 'SF410000', 'SF450000', 'SF460000', 'SF400000',
+ 'SF540000', 'afii10050', 'SF440000', 'copyright',
+ 'afii10096', 'afii10065', 'afii10066', 'afii10088',
+ 'afii10069', 'afii10070', 'afii10086', 'afii10068',
+ 'afii10087', 'afii10074', 'afii10075', 'afii10076',
+ 'afii10077', 'afii10078', 'afii10079', 'afii10080',
+ 'afii10081', 'afii10097', 'afii10082', 'afii10083',
+ 'afii10084', 'afii10085', 'afii10072', 'afii10067',
+ 'afii10094', 'afii10093', 'afii10073', 'afii10090',
+ 'afii10095', 'afii10091', 'afii10089', 'afii10092',
+ 'afii10048', 'afii10017', 'afii10018', 'afii10040',
+ 'afii10021', 'afii10022', 'afii10038', 'afii10020',
+ 'afii10039', 'afii10026', 'afii10027', 'afii10028',
+ 'afii10029', 'afii10030', 'afii10031', 'afii10032',
+ 'afii10033', 'afii10049', 'afii10034', 'afii10035',
+ 'afii10036', 'afii10037', 'afii10024', 'afii10019',
+ 'afii10046', 'afii10045', 'afii10025', 'afii10042',
+ 'afii10047', 'afii10043', 'afii10041', 'afii10044'
+ ]
+}
+
+def ReadAFM(file, map)
+
+ # Read a font metric file
+ a = IO.readlines(file)
+
+ raise "File no found: #{file}" if a.size == 0
+
+ widths = {}
+ fm = {}
+ fix = { 'Edot' => 'Edotaccent', 'edot' => 'edotaccent',
+ 'Idot' => 'Idotaccent',
+ 'Zdot' => 'Zdotaccent', 'zdot' => 'zdotaccent',
+ 'Odblacute' => 'Ohungarumlaut', 'odblacute' => 'ohungarumlaut',
+ 'Udblacute' => 'Uhungarumlaut', 'udblacute' => 'uhungarumlaut',
+ 'Gcedilla' => 'Gcommaaccent', 'gcedilla' => 'gcommaaccent',
+ 'Kcedilla' => 'Kcommaaccent', 'kcedilla' => 'kcommaaccent',
+ 'Lcedilla' => 'Lcommaaccent', 'lcedilla' => 'lcommaaccent',
+ 'Ncedilla' => 'Ncommaaccent', 'ncedilla' => 'ncommaaccent',
+ 'Rcedilla' => 'Rcommaaccent', 'rcedilla' => 'rcommaaccent',
+ 'Scedilla' => 'Scommaaccent',' scedilla' => 'scommaaccent',
+ 'Tcedilla' => 'Tcommaaccent',' tcedilla' => 'tcommaaccent',
+ 'Dslash' => 'Dcroat', 'dslash' => 'dcroat',
+ 'Dmacron' => 'Dcroat', 'dmacron' => 'dcroat',
+ 'combininggraveaccent' => 'gravecomb',
+ 'combininghookabove' => 'hookabovecomb',
+ 'combiningtildeaccent' => 'tildecomb',
+ 'combiningacuteaccent' => 'acutecomb',
+ 'combiningdotbelow' => 'dotbelowcomb',
+ 'dongsign' => 'dong'
+ }
+
+ a.each do |line|
+
+ e = line.rstrip.split(' ')
+ next if e.size < 2
+
+ code = e[0]
+ param = e[1]
+
+ if code == 'C' then
+
+ # Character metrics
+ cc = e[1].to_i
+ w = e[4]
+ gn = e[7]
+
+ gn = 'Euro' if gn[-4, 4] == '20AC'
+
+ if fix[gn] then
+
+ # Fix incorrect glyph name
+ 0.upto(map.size - 1) do |i|
+ if map[i] == fix[gn] then
+ map[i] = gn
+ end
+ end
+ end
+
+ if map.size == 0 then
+ # Symbolic font: use built-in encoding
+ widths[cc] = w
+ else
+ widths[gn] = w
+ fm['CapXHeight'] = e[13].to_i if gn == 'X'
+ end
+
+ fm['MissingWidth'] = w if gn == '.notdef'
+
+ elsif code == 'FontName' then
+ fm['FontName'] = param
+ elsif code == 'Weight' then
+ fm['Weight'] = param
+ elsif code == 'ItalicAngle' then
+ fm['ItalicAngle'] = param.to_f
+ elsif code == 'Ascender' then
+ fm['Ascender'] = param.to_i
+ elsif code == 'Descender' then
+ fm['Descender'] = param.to_i
+ elsif code == 'UnderlineThickness' then
+ fm['UnderlineThickness'] = param.to_i
+ elsif code == 'UnderlinePosition' then
+ fm['UnderlinePosition'] = param.to_i
+ elsif code == 'IsFixedPitch' then
+ fm['IsFixedPitch'] = (param == 'true')
+ elsif code == 'FontBBox' then
+ fm['FontBBox'] = "[#{e[1]},#{e[2]},#{e[3]},#{e[4]}]"
+ elsif code == 'CapHeight' then
+ fm['CapHeight'] = param.to_i
+ elsif code == 'StdVW' then
+ fm['StdVW'] = param.to_i
+ end
+ end
+
+ raise 'FontName not found' unless fm['FontName']
+
+ if map.size > 0 then
+ widths['.notdef'] = 600 unless widths['.notdef']
+
+ if (widths['Delta'] == nil) && widths['increment'] then
+ widths['Delta'] = widths['increment']
+ end
+
+ # Order widths according to map
+ 0.upto(255) do |i|
+ if widths[map[i]] == nil
+ puts "Warning: character #{map[i]} is missing"
+ widths[i] = widths['.notdef']
+ else
+ widths[i] = widths[map[i]]
+ end
+ end
+ end
+
+ fm['Widths'] = widths
+
+ return fm
+end
+
+def MakeFontDescriptor(fm, symbolic)
+
+ # Ascent
+ asc = fm['Ascender'] ? fm['Ascender'] : 1000
+ fd = "{\n 'Ascent' => '#{asc}'"
+
+ # Descent
+ desc = fm['Descender'] ? fm['Descender'] : -200
+ fd += ", 'Descent' => '#{desc}'"
+
+ # CapHeight
+ if fm['CapHeight'] then
+ ch = fm['CapHeight']
+ elsif fm['CapXHeight']
+ ch = fm['CapXHeight']
+ else
+ ch = asc
+ end
+ fd += ", 'CapHeight' => '#{ch}'"
+
+ # Flags
+ flags = 0
+
+ if fm['IsFixedPitch'] then
+ flags += 1 << 0
+ end
+
+ if symbolic then
+ flags += 1 << 2
+ else
+ flags += 1 << 5
+ end
+
+ if fm['ItalicAngle'] && (fm['ItalicAngle'] != 0) then
+ flags += 1 << 6
+ end
+
+ fd += ",\n 'Flags' => '#{flags}'"
+
+ # FontBBox
+ if fm['FontBBox'] then
+ fbb = fm['FontBBox'].gsub(/,/, ' ')
+ else
+ fbb = "[0 #{desc - 100} 1000 #{asc + 100}]"
+ end
+
+ fd += ", 'FontBBox' => '#{fbb}'"
+
+ # ItalicAngle
+ ia = fm['ItalicAngle'] ? fm['ItalicAngle'] : 0
+ fd += ",\n 'ItalicAngle' => '#{ia}'"
+
+ # StemV
+ if fm['StdVW'] then
+ stemv = fm['StdVW']
+ elsif fm['Weight'] && (/bold|black/i =~ fm['Weight'])
+ stemv = 120
+ else
+ stemv = 70
+ end
+
+ fd += ", 'StemV' => '#{stemv}'"
+
+ # MissingWidth
+ if fm['MissingWidth'] then
+ fd += ", 'MissingWidth' => '#{fm['MissingWidth']}'"
+ end
+
+ fd += "\n }"
+ return fd
+end
+
+def MakeWidthArray(fm)
+
+ # Make character width array
+ s = " [\n "
+
+ cw = fm['Widths']
+
+ 0.upto(255) do |i|
+ s += "%5d" % cw[i]
+ s += "," if i != 255
+ s += "\n " if (i % 8) == 7
+ end
+
+ s += ']'
+
+ return s
+end
+
+def MakeFontEncoding(map)
+
+ # Build differences from reference encoding
+ ref = Charencodings['cp1252']
+ s = ''
+ last = 0
+ 32.upto(255) do |i|
+ if map[i] != ref[i] then
+ if i != last + 1 then
+ s += i.to_s + ' '
+ end
+ last = i
+ s += '/' + map[i] + ' '
+ end
+ end
+ return s.rstrip
+end
+
+def ReadShort(f)
+ a = f.read(2).unpack('n')
+ return a[0]
+end
+
+def ReadLong(f)
+ a = f.read(4).unpack('N')
+ return a[0]
+end
+
+def CheckTTF(file)
+
+ rl = false
+ pp = false
+ e = false
+
+ # Check if font license allows embedding
+ File.open(file, 'rb') do |f|
+
+ # Extract number of tables
+ f.seek(4, IO::SEEK_CUR)
+ nb = ReadShort(f)
+ f.seek(6, IO::SEEK_CUR)
+
+ # Seek OS/2 table
+ found = false
+ 0.upto(nb - 1) do |i|
+ if f.read(4) == 'OS/2' then
+ found = true
+ break
+ end
+
+ f.seek(12, IO::SEEK_CUR)
+ end
+
+ if ! found then
+ return
+ end
+
+ f.seek(4, IO::SEEK_CUR)
+ offset = ReadLong(f)
+ f.seek(offset, IO::SEEK_SET)
+
+ # Extract fsType flags
+ f.seek(8, IO::SEEK_CUR)
+ fsType = ReadShort(f)
+
+ rl = (fsType & 0x02) != 0
+ pp = (fsType & 0x04) != 0
+ e = (fsType & 0x08) != 0
+ end
+
+ if rl && ( ! pp) && ( ! e) then
+ puts 'Warning: font license does not allow embedding'
+ end
+end
+
+#
+# fontfile: path to TTF file (or empty string if not to be embedded)
+# afmfile: path to AFM file
+# enc: font encoding (or empty string for symbolic fonts)
+# patch: optional patch for encoding
+# type : font type if $fontfile is empty
+#
+def MakeFont(fontfile, afmfile, enc = 'cp1252', patch = {}, type = 'TrueType')
+ # Generate a font definition file
+ if (enc != nil) && (enc != '') then
+ map = Charencodings[enc]
+ patch.each { |cc, gn| map[cc] = gn }
+ else
+ map = []
+ end
+
+ raise "Error: AFM file not found: #{afmfile}" unless File.exists?(afmfile)
+
+ fm = ReadAFM(afmfile, map)
+
+ if (enc != nil) && (enc != '') then
+ diff = MakeFontEncoding(map)
+ else
+ diff = ''
+ end
+
+ fd = MakeFontDescriptor(fm, (map.size == 0))
+
+ # Find font type
+ if fontfile then
+ ext = File.extname(fontfile).downcase.sub(/^\./, '')
+
+ if ext == 'ttf' then
+ type = 'TrueType'
+ elsif ext == 'pfb'
+ type = 'Type1'
+ else
+ raise "Error: unrecognized font file extension: #{ext}"
+ end
+ else
+ raise "Error: incorrect font type: #{type}" if (type != 'TrueType') && (type != 'Type1')
+ end
+ printf "type = #{type}\n"
+ # Start generation
+ s = "# #{fm['FontName']} font definition\n\n"
+ s += "module FontDef\n"
+ s += " def FontDef.type\n '#{type}'\n end\n"
+ s += " def FontDef.name\n '#{fm['FontName']}'\n end\n"
+ s += " def FontDef.desc\n #{fd}\n end\n"
+
+ if fm['UnderlinePosition'] == nil then
+ fm['UnderlinePosition'] = -100
+ end
+
+ if fm['UnderlineThickness'] == nil then
+ fm['UnderlineThickness'] = 50
+ end
+
+ s += " def FontDef.up\n #{fm['UnderlinePosition']}\n end\n"
+ s += " def FontDef.ut\n #{fm['UnderlineThickness']}\n end\n"
+
+ w = MakeWidthArray(fm)
+ s += " def FontDef.cw\n#{w}\n end\n"
+
+ s += " def FontDef.enc\n '#{enc}'\n end\n"
+ s += " def FontDef.diff\n #{(diff == nil) || (diff == '') ? 'nil' : '\'' + diff '\''}\n end\n"
+
+ basename = File.basename(afmfile, '.*')
+
+ if fontfile then
+ # Embedded font
+ if ! File.exist?(fontfile) then
+ raise "Error: font file not found: #{fontfile}"
+ end
+
+ if type == 'TrueType' then
+ CheckTTF(fontfile)
+ end
+
+ file = ''
+ File.open(fontfile, 'rb') do |f|
+ file = f.read()
+ end
+
+ if type == 'Type1' then
+ # Find first two sections and discard third one
+ header = file[0] == 128
+ file = file[6, file.length - 6] if header
+
+ pos = file.index('eexec')
+ raise 'Error: font file does not seem to be valid Type1' if pos == nil
+
+ size1 = pos + 6
+
+ file = file[0, size1] + file[size1 + 6, file.length - (size1 + 6)] if header && file[size1] == 128
+
+ pos = file.index('00000000')
+ raise 'Error: font file does not seem to be valid Type1' if pos == nil
+
+ size2 = pos - size1
+ file = file[0, size1 + size2]
+ end
+
+ if require 'zlib' then
+ File.open(basename + '.z', 'wb') { |f| f.write(Zlib::Deflate.deflate(file)) }
+ s += " def FontDef.file\n '#{basename}.z'\n end\n"
+ puts "Font file compressed ('#{basename}.z')"
+ else
+ s += " def FontDef.file\n '#{File.basename(fontfile)}'\n end\n"
+ puts 'Notice: font file could not be compressed (zlib not available)'
+ end
+
+ if type == 'Type1' then
+ s += " def FontDef.size1\n '#{size1}'\n end\n"
+ s += " def FontDef.size2\n '#{size2}'\n end\n"
+ else
+ s += " def FontDef.originalsize\n '#{File.size(fontfile)}'\n end\n"
+ end
+
+ else
+ # Not embedded font
+ s += " def FontDef.file\n ''\n end\n"
+ end
+
+ s += "end\n"
+ File.open(basename + '.rb', 'w') { |file| file.write(s)}
+ puts "Font definition file generated (#{basename}.rb)"
+end
+
+
+if $0 == __FILE__ then
+ if ARGV.length >= 3 then
+ enc = ARGV[2]
+ else
+ enc = 'cp1252'
+ end
+
+ if ARGV.length >= 4 then
+ patch = ARGV[3]
+ else
+ patch = {}
+ end
+
+ if ARGV.length >= 5 then
+ type = ARGV[4]
+ else
+ type = 'TrueType'
+ end
+
+ MakeFont(ARGV[0], ARGV[1], enc, patch, type)
+end