Erster Commit: nativer Linux-Port aus macOS-Bytecode

Läuft die Voice Acoustic VA-Remotecontrol (AllDSP AllControl) nativ unter Linux
auf echtem wxGTK 3.0 — ohne Wine und ohne dekompilierten App-Code. Ausgeführt wird
das unveränderte Python-2.7-Bytecode aus dem macOS-.app; C-Extensions (wxGTK/numpy/
scipy/PortAudio) kommen nativ aus Debian stretch.

Enthält: va/ (Original-.pyc + pure-Python-Libs + Assets + launch.py mit den drei
Linux-Fixes), Dockerfile/run.sh/entrypoint.sh, reference/ (dekompilierter Quellcode
zum Debuggen) und README/STATUS. img.cache (378 MB, regenerierbar) ist per
.gitignore ausgeschlossen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
maik
2026-08-20 19:57:01 +02:00
co-authored by Claude Opus 4.8
commit a7c93fa266
654 changed files with 478133 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+35
View File
@@ -0,0 +1,35 @@
*.py[cod]
# C extensions
*.so
# Packages
*.egg
*.egg-info
dist
build
eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
lib64
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
nosetests.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
+8
View File
@@ -0,0 +1,8 @@
86e2be4e99090fbd25b372d2f29a5b20d6b22001 unicode
5ce4e5d8c7d812a005c684925578e8b7a098987a gif
6d269f7474c65d7d2616472ea800fa356d645e95 png_alpha
0dc26e5ee0b0c147f9b885722cfab2ccc6198322 1.7
90c1a762ab26e208f54eb1483f00a8c407cf89f3 1.7.1
f99621069064f6126839a4831204ccd7be077b34 1.7.2
f99621069064f6126839a4831204ccd7be077b34 1.7.2
88fafdc91cc38b7dc3afcbcf36496beedf5499b8 1.7.2
+165
View File
@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
+52
View File
@@ -0,0 +1,52 @@
pyfpdf: FPDF for python
=======================
PyFPDF is a library for PDF document generation under Python, ported from PHP
(see [FPDF][1] "Free"-PDF, a well-known PDFlib-extension replacement with many
examples, scripts and derivatives).
Compared with other PDF libraries, PyFPDF is simple, small and versatile, with
advanced capabilities and easy to learn, extend and maintain.
[1]: http://www.fpdf.org/
Features:
---------
* Python 2.5 to 2.7 support (with experimental Python3 support)
* Unicode (UTF-8) TrueType font subset embedding
* Barcode I2of5 and code39, QR code coming soon ...
* PNG, GIF and JPG support (including transparency and alpha channel)
* Templates with a visual designer & basic html2pdf
* Exceptions support, other minor fixes, improvements and PEP8 code cleanups
Installation Instructions:
--------------------------
To get the latest development version you can download the source code running:
```
hg clone https://code.google.com/p/pyfpdf/
cd pyfpdf
python setup.py install
```
You can also install PyFPDF from PyPI, with easyinstall or from Windows
installers. For example, using pip:
```
pip install fpdf
```
**Note:** [Python Imaging Library](http://www.pythonware.com/products/pil/)
(PIL) is needed for GIF support. PNG and JPG support is built-in and don't
require any external dependency.
Documentation:
--------------
* Tutorial: https://code.google.com/p/pyfpdf/wiki/Tutorial
* Reference Manual: https://code.google.com/p/pyfpdf/wiki/ReferenceManual
(spanish translation available)
For further information, see the project site: https://code.google.com/p/pyfpdf/
or the GitHub mirror: https://github.com/reingart/pyfpdf
@@ -0,0 +1,73 @@
from FPDF import *
class Bookmark(FPDF):
def __init__(this,orientation='P',unit='mm',format='A4'):
FPDF.__init__(this,orientation,unit,format)
this.outlines=[]
this.OutlineRoot=None
def Bookmark(this,txt,level=0,y=0):
if(y==-1):
y=this.GetY()
this.outlines+=[{'t':txt,'l':level,'y':y,'p':this.PageNo()}]
def _putbookmarks(this):
nb=count(this.outlines)
if(nb==0):
return
lru={}
level=0
for i in range(len(this.outlines)):
o=this.outlines[i]
if(o['l']>0):
parent=lru[o['l']-1]
#Set parent and last pointers
this.outlines[i]['parent']=parent
this.outlines[parent]['last']=i
if(o['l']>level):
#Level increasing: set first pointer
this.outlines[parent]['first']=i
else:
this.outlines[i]['parent']=nb
if(o['l']<=level and i>0):
#Set prev and next pointers
prev=lru[o['l']]
this.outlines[prev]['next']=i
this.outlines[i]['prev']=prev
lru[o['l']]=i
level=o['l']
#Outline items
n=this.n+1
for i in range(len(this.outlines)):
o=this.outlines[i]
this._newobj()
this._out('<</Title '+this._textstring(o['t']))
this._out('/Parent '+str(n+o['parent'])+' 0 R')
if 'prev' in o:
this._out('/Prev '+str(n+o['prev'])+' 0 R')
if 'next' in o:
this._out('/Next '+str(n+o['next'])+' 0 R')
if 'first' in o:
this._out('/First '+str(n+o['first'])+' 0 R')
if 'last' in o:
this._out('/Last '+str(n+o['last'])+' 0 R')
this._out(sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]',1+2*o['p'],(this.h-o['y'])*this.k))
this._out('/Count 0>>')
this._out('endobj')
#Outline root
this._newobj()
this.OutlineRoot=this.n
this._out('<</Type /Outlines /First '+str(n)+' 0 R')
this._out('/Last '+str(n+lru[0])+' 0 R>>')
this._out('endobj')
def _putresources(this):
FPDF._putresources(this)
this._putbookmarks()
def _putcatalog(this):
FPDF._putcatalog(this)
if(count(this.outlines)>0):
this._out('/Outlines '+str(this.OutlineRoot)+' 0 R')
this._out('/PageMode /UseOutlines')
@@ -0,0 +1,142 @@
from FPDF import *
class Gradients(FPDF):
def __init__(this,orientation='P',unit='mm',format='A4'):
FPDF.__init__(this,orientation,unit,format)
this.gradients={}
def LinearGradient(this,x, y, w, h, col1=[], col2=[], coords=[0.0,0.0,1.0,0.0]):
this.Clip(x,y,w,h)
this.Gradient(2,col1,col2,coords)
def RadialGradient(this,x, y, w, h, col1=[], col2=[], coords=[0.5,0.5,0.5,0.5,1.0]):
this.Clip(x,y,w,h)
this.Gradient(3,col1,col2,coords)
def CoonsPatchMesh(this,x, y, w, h, col1=[], col2=[], col3=[], col4=[], coords=[0.00,0.0,0.33,0.00,0.67,0.00,1.00,0.00,1.00,0.33,1.00,0.67,1.00,1.00,0.67,1.00,0.33,1.00,0.00,1.00,0.00,0.67,0.00,0.33], coords_min=0.0, coords_max=1.0):
this.Clip(x,y,w,h)
n = count(this.gradients)+1
this.gradients[n]={}
this.gradients[n]['type']=6 #coons patch mesh
#check the coords array if it is the simple array or the multi patch array
if type(coords[0]) != type({}):
#simple array -> convert to multi patch array
for L in (col1,col2,col3,col4):
if len(L)==1:
L+=[L[0],L[0]]
patch_array=[{}]
patch_array[0]['f']=0
patch_array[0]['points']=coords
patch_array[0]['colors']=[{},{},{},{}]
patch_array[0]['colors'][0]['r']=col1[0]
patch_array[0]['colors'][0]['g']=col1[1]
patch_array[0]['colors'][0]['b']=col1[2]
patch_array[0]['colors'][1]['r']=col2[0]
patch_array[0]['colors'][1]['g']=col2[1]
patch_array[0]['colors'][1]['b']=col2[2]
patch_array[0]['colors'][2]['r']=col3[0]
patch_array[0]['colors'][2]['g']=col3[1]
patch_array[0]['colors'][2]['b']=col3[2]
patch_array[0]['colors'][3]['r']=col4[0]
patch_array[0]['colors'][3]['g']=col4[1]
patch_array[0]['colors'][3]['b']=col4[2]
else:
#multi patch array
patch_array=coords
bpcd=65535 #16 BitsPerCoordinate
#build the data stream
this.gradients[n]['stream']=''
for i in xrange(0,count(patch_array)):
this.gradients[n]['stream']+=chr(patch_array[i]['f']) #start with the edge flag as 8 bit
for j in xrange(0,count(patch_array[i]['points'])):
#each point as 16 bit
patch_array[i]['points'][j]=((patch_array[i]['points'][j]-coords_min)/(coords_max-coords_min))*bpcd
if(patch_array[i]['points'][j]<0): patch_array[i]['points'][j]=0
if(patch_array[i]['points'][j]>bpcd): patch_array[i]['points'][j]=bpcd
this.gradients[n]['stream']+=chr(floor(patch_array[i]['points'][j]/256.0))
this.gradients[n]['stream']+=chr(floor(patch_array[i]['points'][j]%256.0))
for j in xrange(0,count(patch_array[i]['colors'])):
#each color component as 8 bit
this.gradients[n]['stream']+=chr(patch_array[i]['colors'][j]['r'])
this.gradients[n]['stream']+=chr(patch_array[i]['colors'][j]['g'])
this.gradients[n]['stream']+=chr(patch_array[i]['colors'][j]['b'])
#paint the gradient
this._out('/Sh'+str(n)+' sh')
#restore previous Graphic State
this._out('Q')
def Clip(this,x,y,w,h):
#save current Graphic State
s='q'
#set clipping area
s+=sprintf(' %.2f %.2f %.2f %.2f re W n', x*this.k, (this.h-y)*this.k, w*this.k, -h*this.k)
#set up transformation matrix for gradient
s+=sprintf(' %.3f 0 0 %.3f %.3f %.3f cm', w*this.k, h*this.k, x*this.k, (this.h-(y+h))*this.k)
this._out(s)
def Gradient(this, type, col1, col2, coords):
n = count(this.gradients)+1
this.gradients[n]={}
this.gradients[n]['type']=type
if len(col1)==1:
col1+=[col1[0],col1[0]]
this.gradients[n]['col1']=sprintf('%.3f %.3f %.3f',(col1[0]/255.0),(col1[1]/255.0),(col1[2]/255.0))
if len(col2)==1:
col2+=[col2[0],col2[0]]
this.gradients[n]['col2']=sprintf('%.3f %.3f %.3f',(col2[0]/255.0),(col2[1]/255.0),(col2[2]/255.0))
this.gradients[n]['coords']=coords
#paint the gradient
this._out('/Sh'+str(n)+' sh')
#restore previous Graphic State
this._out('Q')
def _putshaders(this):
for id,grad in this.gradients.iteritems():
if(grad['type']==2 or grad['type']==3):
this._newobj()
this._out('<<')
this._out('/FunctionType 2')
this._out('/Domain [0.0 1.0]')
this._out('/C0 ['+grad['col1']+']')
this._out('/C1 ['+grad['col2']+']')
this._out('/N 1')
this._out('>>')
this._out('endobj')
f1=this.n
this._newobj()
this._out('<<')
this._out('/ShadingType '+str(grad['type']))
this._out('/ColorSpace /DeviceRGB')
if(grad['type']==2):
this._out(sprintf('/Coords [%.3f %.3f %.3f %.3f]',grad['coords'][0],grad['coords'][1],grad['coords'][2],grad['coords'][3]))
this._out('/Function '+str(f1)+' 0 R')
this._out('/Extend [true true] ')
this._out('>>')
elif(grad['type']==3):
#x0, y0, r0, x1, y1, r1
#at this this time radius of inner circle is 0
this._out(sprintf('/Coords [%.3f %.3f 0 %.3f %.3f %.3f]',grad['coords'][0],grad['coords'][1],grad['coords'][2],grad['coords'][3],grad['coords'][4]))
this._out('/Function '+str(f1)+' 0 R')
this._out('/Extend [true true] ')
this._out('>>')
elif(grad['type']==6):
this._out('/BitsPerCoordinate 16')
this._out('/BitsPerComponent 8')
this._out('/Decode[0 1 0 1 0 1 0 1 0 1]')
this._out('/BitsPerFlag 8')
this._out('/Length '+str(strlen(grad['stream'])))
this._out('>>')
this._putstream(grad['stream'])
this._out('endobj')
this.gradients[id]['id']=this.n
def _putresourcedict(this):
FPDF._putresourcedict(this)
this._out('/Shading <<')
for id,grad in this.gradients.iteritems():
this._out('/Sh'+str(id)+' '+str(grad['id'])+' 0 R')
this._out('>>')
def _putresources(this):
this._putshaders()
FPDF._putresources(this)
@@ -0,0 +1,58 @@
# -*- coding: iso-8859-1 -*-
"""
A few rough Python equivalents of PHP internal functions (=lazy port).
NOTE:
1) PHP "array" object is mostly similar to a Python "dictionary", but some
times a "list" (or "array": see Protection.py) may be required!
2) PHP "isset()" tests often wether an array has given key, or a variable
is defined in global/local space;
3) PHP string functions have often different return values from Python (see below);
4) "for (x; a <[=]b; y)" loops become "for i in range(a,b[+1]):" in Python;
5) PHP emits automatically floats quotients when needed, Python don't: so add a
".0" to divisors when PDF expects decimal numbers.
Actually, all FPDF tutorials (even from ported modules) work fine, but bugs
or incompatibilities might be hidden somewhere: so, USE IT AT YOUR OWN RISK!
"""
import sys, os
strlen = len
filesize=os.path.getsize
file_exists=os.path.exists
count=len
SEEK_CUR=1
SEEK_SET=0
def substr(s, start, length=-1):
if length < 0:
length=len(s)-start
return s[start:start+length]
def substr_count(haystack, needle, offset=0, length=None):
return haystack.count(needle,offset)
def die(s):
sys.stderr.write(s)
sys.exit(-1)
def basename(p):
return os.path.splitext(p)[0]
def is_bool(x): return type(x)==type(bool())
def empty(s): return len(s)==0
def is_string(s): return isinstance(s,basestring)
def strtolower(s): return s.lower()
def strtoupper(s): return s.upper()
def str_replace(sc, rp, s): return s.replace(sc,rp)
def sprintf(fmt, *args): return fmt % args
def strpos(s, c): return s.find(c) # Python returns -1 instead of FALSE!
def strrpos(s, c): return s.rfind(c) # Python returns -1 instead of FALSE!
def hexdec(x): return int(x,16)
def floor(x): return float(int(x))
def str_repeat(s,t): return s*int(t)
@@ -0,0 +1,187 @@
#/****************************************************************************
#* Software: FPDF_Protection *
#* Version: 1.02 *
#* Date: 2005/05/08 *
#* Author: Klemen VODOPIVEC *
#* License: Freeware *
#* *
#* You may use and modify this software as you wish as stated in original *
#* FPDF package. *
#* *
#* Thanks: Cpdf (http:#www.ros.co.nz/pdf) was my working sample of how to *
#* implement protection in pdf. *
#****************************************************************************/
from FPDF import *
import random, struct, md5, copy, array
class Protection(FPDF):
def __init__(this, orientation='P',unit='mm',format='A4'):
FPDF.__init__(this,orientation,unit,format)
this.encrypted=0 #whether document is protected
this.Uvalue='' #U entry in pdf document
this.Ovalue='' #O entry in pdf document
this.Pvalue='' #P entry in pdf document
this.enc_obj_id=0 #encryption object id
this.last_rc4_key='' #last RC4 key encrypted (cached for optimisation)
this.last_rc4_key_c='' #last RC4 computed key
this.encrypted=0
this.padding="\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"
#/**
#* Function to set permissions as well as user and owner passwords
#*
#* - permissions is an array with values taken from the following list:
#* copy, print, modify, annot-forms
#* If a value is present it means that the permission is granted
#* - If a user password is set, user will be prompted before document is opened
#* - If an owner password is set, document can be opened in privilege mode with no
#* restriction if that password is entered
#*/
def SetProtection(this,permissions=[],user_pass='',owner_pass=None):
options={'print':4, 'modify':8, 'copy':16, 'annot-forms':32}
protection = 192
for permission in permissions:
if permission not in options:
this.Error('Incorrect permission: '+permission)
protection += options[permission]
if (owner_pass == None):
owner_pass=''
for i in range(13):
owner_pass += chr(random.randint(0,255))
this.encrypted = 1
this._generateencryptionkey(user_pass, owner_pass, protection)
#/****************************************************************************
#* *
#* Private methods *
#* *
#****************************************************************************/
def _putstream(this,s):
if (this.encrypted):
s = this._RC4(this._objectkey(this.n), s)
FPDF._putstream(this,s)
def _textstring(this,s):
if (this.encrypted):
s = this._RC4(this._objectkey(this.n), s)
return FPDF._textstring(this,s)
#/**
#* Compute key depending on object number where the encrypted data is stored
#*/
def _objectkey(this,n):
return substr(this._md5_16(this.encryption_key+struct.pack('L',n)[:-1]+'\x00\x00'),0,10)
#/**
#* Escape special characters
#*/
def _escape(this,s):
s=str_replace('\\','\\\\',s)
s=str_replace(')','\\)',s)
s=str_replace('(','\\(',s)
s=str_replace("\r",'\\r',s)
return s
def _putresources(this):
FPDF._putresources(this)
if (this.encrypted):
this._newobj()
this.enc_obj_id = this.n
this._out('<<')
this._putencryption()
this._out('>>')
this._out('endobj')
def _putencryption(this):
this._out('/Filter /Standard')
this._out('/V 1')
this._out('/R 2')
this._out('/O ('+this._escape(this.Ovalue)+')')
this._out('/U ('+this._escape(this.Uvalue)+')')
this._out('/P '+str(this.Pvalue))
def _puttrailer(this):
FPDF._puttrailer(this)
if (this.encrypted):
this._out('/Encrypt '+str(this.enc_obj_id)+' 0 R')
this._out('/ID [()()]')
#/**
#* RC4 is the standard encryption algorithm used in PDF format
#*/
def _RC4(this, key, text):
if (this.last_rc4_key != key):
k = str_repeat(key, 256/strlen(key)+1)
rc4 = array.array('B',range(256))
j = 0
for i in range(256):
t = rc4[i]
j = (j + t + ord(k[i])) % 256
rc4[i] = rc4[j]
rc4[j] = t
this.last_rc4_key = key
this.last_rc4_key_c = copy.copy(rc4)
else:
rc4 = copy.copy(this.last_rc4_key_c)
len = strlen(text)
a = 0
b = 0
out = ''
for i in range(len):
a = (a+1)%256
t= rc4[a]
b = (b+t)%256
rc4[a] = rc4[b]
rc4[b] = t
k = rc4[(rc4[a]+rc4[b])%256]
out+=chr(ord(text[i]) ^ k)
return out
#/**
#* Get MD5 as binary string
#*/
def _md5_16(this,string):
return md5.new(string).digest()
#/**
#* Compute O value
#*/
def _Ovalue(this, user_pass, owner_pass):
tmp = this._md5_16(owner_pass)
owner_RC4_key = substr(tmp,0,5)
return this._RC4(owner_RC4_key, user_pass)
#/**
#* Compute U value
#*/
def _Uvalue(this):
return this._RC4(this.encryption_key, this.padding)
#/**
#* Compute encryption key
#*/
def _generateencryptionkey(this, user_pass, owner_pass, protection):
# Pad passwords
user_pass = substr(user_pass+this.padding,0,32)
owner_pass = substr(owner_pass+this.padding,0,32)
# Compute O value
this.Ovalue = this._Ovalue(user_pass,owner_pass)
# Compute encyption key
tmp = this._md5_16(user_pass+this.Ovalue+chr(protection)+"\xFF\xFF\xFF")
this.encryption_key = substr(tmp,0,5)
# Compute U value
this.Uvalue = this._Uvalue()
# Compute P value
this.Pvalue = -((protection^255)+1)
if __name__ == '__main__':
pdf=Protection()
pdf.SetProtection(['print'])
pdf.Open()
pdf.AddPage()
pdf.SetFont('Arial')
pdf.Write(10,'You can print me but not copy my text.')
pdf.Output('Protected.pdf','F')
+90
View File
@@ -0,0 +1,90 @@
from FPDF import *
class TOC(FPDF):
def __init__(this, orientation='P',unit='mm',format='A4'):
this._toc=[]
this._numbering=0
this._numberingFooter=0
this._numPageNum=1
FPDF.__init__(this,orientation,unit,format)
def AddPage(this,orientation=''):
FPDF.AddPage(this,orientation)
if(this._numbering):
this._numPageNum+=1
def startPageNums(this):
this._numbering=1
this._numberingFooter=1
def stopPageNums(this):
this._numbering=0
def numPageNo(this):
return this._numPageNum
def TOC_Entry(this,txt,level=0):
this._toc+=[{'t':txt,'l':level,'p':this.numPageNo()}]
def insertTOC(this,location=1,labelSize=20,entrySize=10,tocfont='Times',label='Table of Contents'):
#make toc at end
this.stopPageNums()
this.AddPage()
tocstart=this.page
this.SetFont(tocfont,'B',labelSize)
this.Cell(0,5,label,0,1,'C')
this.Ln(10)
for t in this._toc:
#Offset
level=t['l']
if(level>0):
this.Cell(level*8)
weight=''
if(level==0):
weight='B'
Str=t['t']
this.SetFont(tocfont,weight,entrySize)
strsize=this.GetStringWidth(Str)
this.Cell(strsize+2,this.FontSize+2,Str)
#Filling dots
this.SetFont(tocfont,'',entrySize)
PageCellSize=this.GetStringWidth(str(t['p']))+2
w=this.w-this.lMargin-this.rMargin-PageCellSize-(level*8)-(strsize+2)
nb=w/this.GetStringWidth('.')
dots=str_repeat('.',nb)
this.Cell(w,this.FontSize+2,dots,0,0,'R')
#Page number
this.Cell(PageCellSize,this.FontSize+2,str(t['p']),0,1,'R')
#grab it and move to selected location
n=this.page
n_toc = n - tocstart + 1
last = []
#store toc pages
for i in xrange(tocstart,n+1):
last+=[this.pages[i]]
#move pages
for i in xrange(tocstart-1,location-1,-1):
#~ for(i=tocstart - 1;i>=location-1;i--)
this.pages[i+n_toc]=this.pages[i]
#Put toc pages at insert point
for i in xrange(0,n_toc):
this.pages[location + i]=last[i]
def Footer(this):
if(this._numberingFooter==0):
return
#Go to 1.5 cm from bottom
this.SetY(-15)
#Select Arial italic 8
this.SetFont('Arial','I',8)
this.Cell(0,7,str(this.numPageNo()),0,0,'C');
if(this._numbering==0):
this._numberingFooter=0
@@ -0,0 +1,275 @@
StartFontMetrics 4.1
FontName Calligrapher-Regular
FullName Calligrapher Regular
Notice Generated by Fontographer 3.5
EncodingScheme FontSpecific
FamilyName Calligrapher
Weight Regular
Version (Altsys Fontographer 3.5 5/26/92)
Characters 215
ItalicAngle 0.0
Ascender 899
Descender -234
UnderlineThickness 20
UnderlinePosition -200
IsFixedPitch false
FontBBox -50 -234 1328 899
StartCharMetrics 256
C 0 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 1 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 2 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 3 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 4 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 5 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 6 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 7 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 8 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 9 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 10 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 11 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 12 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 13 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 14 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 15 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 16 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 17 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 18 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 19 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 20 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 21 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 22 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 23 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 24 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 25 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 26 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 27 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 28 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 29 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 30 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 31 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 32 ; WX 282 ; N space ; B 67 -16 251 718 ;
C 33 ; WX 324 ; N exclam ; B 67 -16 251 718 ;
C 34 ; WX 405 ; N quotedbl ; B 60 460 353 718 ;
C 35 ; WX 584 ; N numbersign ; B 35 0 549 701 ;
C 36 ; WX 632 ; N dollar ; B 32 -126 595 814 ;
C 37 ; WX 980 ; N percent ; B 35 -16 945 703 ;
C 38 ; WX 776 ; N ampersand ; B 41 -17 811 670 ;
C 39 ; WX 259 ; N quotesingle ; B 72 460 206 718 ;
C 40 ; WX 299 ; N parenleft ; B 57 -119 299 785 ;
C 41 ; WX 299 ; N parenright ; B 0 -119 242 785 ;
C 42 ; WX 377 ; N asterisk ; B 35 407 342 714 ;
C 43 ; WX 600 ; N plus ; B 47 0 553 506 ;
C 44 ; WX 259 ; N comma ; B 35 -67 224 162 ;
C 45 ; WX 432 ; N hyphen ; B 28 249 404 377 ;
C 46 ; WX 254 ; N period ; B 43 -16 227 162 ;
C 47 ; WX 597 ; N slash ; B 7 -14 591 714 ;
C 48 ; WX 529 ; N zero ; B 21 -18 508 583 ;
C 49 ; WX 298 ; N one ; B 8 -15 233 582 ;
C 50 ; WX 451 ; N two ; B 17 -8 430 588 ;
C 51 ; WX 359 ; N three ; B 11 -54 337 582 ;
C 52 ; WX 525 ; N four ; B 18 -20 519 602 ;
C 53 ; WX 423 ; N five ; B 10 -55 420 582 ;
C 54 ; WX 464 ; N six ; B 23 -14 447 589 ;
C 55 ; WX 417 ; N seven ; B 8 -18 415 589 ;
C 56 ; WX 457 ; N eight ; B 19 -16 432 583 ;
C 57 ; WX 479 ; N nine ; B 26 -16 450 588 ;
C 58 ; WX 275 ; N colon ; B 59 -16 242 491 ;
C 59 ; WX 282 ; N semicolon ; B 54 -67 245 491 ;
C 60 ; WX 600 ; N less ; B 47 -8 553 514 ;
C 61 ; WX 600 ; N equal ; B 47 98 553 408 ;
C 62 ; WX 600 ; N greater ; B 47 -8 553 514 ;
C 63 ; WX 501 ; N question ; B 21 -16 473 721 ;
C 64 ; WX 800 ; N at ; B 29 -12 771 730 ;
C 65 ; WX 743 ; N A ; B -23 -14 754 723 ;
C 66 ; WX 636 ; N B ; B -42 -7 608 706 ;
C 67 ; WX 598 ; N C ; B 27 -12 572 712 ;
C 68 ; WX 712 ; N D ; B -42 -11 684 705 ;
C 69 ; WX 608 ; N E ; B -21 0 608 708 ;
C 70 ; WX 562 ; N F ; B -21 -18 584 716 ;
C 71 ; WX 680 ; N G ; B 29 -8 668 714 ;
C 72 ; WX 756 ; N H ; B 70 -17 777 728 ;
C 73 ; WX 308 ; N I ; B 14 -15 238 718 ;
C 74 ; WX 314 ; N J ; B 7 -223 244 727 ;
C 75 ; WX 676 ; N K ; B 14 -16 683 725 ;
C 76 ; WX 552 ; N L ; B 14 -8 580 713 ;
C 77 ; WX 1041 ; N M ; B 42 -17 1017 739 ;
C 78 ; WX 817 ; N N ; B -42 -17 747 736 ;
C 79 ; WX 729 ; N O ; B 32 -16 698 709 ;
C 80 ; WX 569 ; N P ; B -35 -15 570 716 ;
C 81 ; WX 698 ; N Q ; B 27 -201 1328 715 ;
C 82 ; WX 674 ; N R ; B -35 -20 696 712 ;
C 83 ; WX 618 ; N S ; B 31 -16 589 709 ;
C 84 ; WX 673 ; N T ; B -21 -20 702 714 ;
C 85 ; WX 805 ; N U ; B 0 -19 804 722 ;
C 86 ; WX 753 ; N V ; B -28 -20 788 729 ;
C 87 ; WX 1238 ; N W ; B -28 -17 1273 736 ;
C 88 ; WX 716 ; N X ; B 7 -38 709 731 ;
C 89 ; WX 754 ; N Y ; B -35 -17 789 747 ;
C 90 ; WX 599 ; N Z ; B 30 -5 584 748 ;
C 91 ; WX 315 ; N bracketleft ; B 93 -124 322 718 ;
C 92 ; WX 463 ; N backslash ; B -21 -18 484 736 ;
C 93 ; WX 315 ; N bracketright ; B -7 -124 222 718 ;
C 94 ; WX 600 ; N asciicircum ; B 63 266 537 658 ;
C 95 ; WX 547 ; N underscore ; B -7 -198 554 -163 ;
C 96 ; WX 278 ; N grave ; B -1 541 214 693 ;
C 97 ; WX 581 ; N a ; B 21 -16 581 494 ;
C 98 ; WX 564 ; N b ; B -24 -17 543 793 ;
C 99 ; WX 440 ; N c ; B 21 -17 422 490 ;
C 100 ; WX 571 ; N d ; B 0 -15 550 659 ;
C 101 ; WX 450 ; N e ; B 28 -23 428 493 ;
C 102 ; WX 347 ; N f ; B -35 -14 474 785 ;
C 103 ; WX 628 ; N g ; B 19 -219 612 496 ;
C 104 ; WX 611 ; N h ; B -29 -18 569 785 ;
C 105 ; WX 283 ; N i ; B -14 -15 241 679 ;
C 106 ; WX 283 ; N j ; B -14 -234 241 679 ;
C 107 ; WX 560 ; N k ; B -24 -15 582 789 ;
C 108 ; WX 252 ; N l ; B -28 -15 210 789 ;
C 109 ; WX 976 ; N m ; B -21 -16 927 494 ;
C 110 ; WX 595 ; N n ; B -28 -15 574 493 ;
C 111 ; WX 508 ; N o ; B 27 -17 485 490 ;
C 112 ; WX 549 ; N p ; B -28 -216 526 496 ;
C 113 ; WX 540 ; N q ; B 28 -219 491 493 ;
C 114 ; WX 395 ; N r ; B -21 -19 430 492 ;
C 115 ; WX 441 ; N s ; B 34 -15 413 493 ;
C 116 ; WX 307 ; N t ; B -21 -16 378 621 ;
C 117 ; WX 614 ; N u ; B -14 -18 558 501 ;
C 118 ; WX 556 ; N v ; B -28 -20 569 483 ;
C 119 ; WX 915 ; N w ; B -28 -17 928 495 ;
C 120 ; WX 559 ; N x ; B 14 -17 546 500 ;
C 121 ; WX 597 ; N y ; B -21 -227 541 500 ;
C 122 ; WX 452 ; N z ; B 28 -5 442 515 ;
C 123 ; WX 315 ; N braceleft ; B 6 -118 309 718 ;
C 124 ; WX 222 ; N bar ; B 63 -18 159 730 ;
C 125 ; WX 315 ; N braceright ; B 6 -118 309 718 ;
C 126 ; WX 600 ; N asciitilde ; B 69 166 531 340 ;
C 127 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 128 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 129 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 130 ; WX 0 ; N quotesinglbase ; B -23 -14 754 877 ;
C 131 ; WX 0 ; N florin ; B 0 -19 804 854 ;
C 132 ; WX 0 ; N quotedblbase ; B -23 -14 754 877 ;
C 133 ; WX 780 ; N ellipsis ; B 43 -16 747 162 ;
C 134 ; WX 0 ; N dagger ; B 27 -122 437 592 ;
C 135 ; WX 0 ; N daggerdbl ; B 43 278 227 456 ;
C 136 ; WX 278 ; N circumflex ; B -14 557 292 677 ;
C 137 ; WX 0 ; N perthousand ; B -23 -14 754 877 ;
C 138 ; WX 0 ; N Scaron ; B 0 0 0 100 ;
C 139 ; WX 0 ; N guilsinglleft ; B 43 278 227 456 ;
C 140 ; WX 1064 ; N OE ; B 32 -16 1055 709 ;
C 141 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 142 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 143 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 144 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 145 ; WX 259 ; N quoteleft ; B 35 489 224 717 ;
C 146 ; WX 259 ; N quoteright ; B 35 489 224 717 ;
C 147 ; WX 470 ; N quotedblleft ; B 35 489 443 717 ;
C 148 ; WX 470 ; N quotedblright ; B 35 487 443 717 ;
C 149 ; WX 500 ; N bullet ; B 70 179 430 539 ;
C 150 ; WX 300 ; N endash ; B 0 245 300 350 ;
C 151 ; WX 600 ; N emdash ; B 0 245 600 350 ;
C 152 ; WX 278 ; N tilde ; B -44 563 326 689 ;
C 153 ; WX 990 ; N trademark ; B 62 306 928 718 ;
C 154 ; WX 0 ; N scaron ; B 0 0 0 100 ;
C 155 ; WX 0 ; N guilsinglright ; B 43 278 227 456 ;
C 156 ; WX 790 ; N oe ; B 27 -23 764 493 ;
C 157 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 158 ; WX 800 ; N .notdef ; B 50 0 750 800 ;
C 159 ; WX 754 ; N Ydieresis ; B -35 -17 789 882 ;
C 160 ; WX 282 ; N nbspace ; B -23 -14 754 893 ;
C 161 ; WX 324 ; N exclamdown ; B 69 -203 253 531 ;
C 162 ; WX 450 ; N cent ; B 27 -122 437 592 ;
C 163 ; WX 640 ; N sterling ; B 0 -9 619 716 ;
C 164 ; WX 518 ; N currency ; B 3 72 515 586 ;
C 165 ; WX 603 ; N yen ; B -28 -65 631 747 ;
C 166 ; WX 0 ; N brokenbar ; B 0 0 0 100 ;
C 167 ; WX 519 ; N section ; B -50 -216 524 762 ;
C 168 ; WX 254 ; N dieresis ; B -20 554 308 682 ;
C 169 ; WX 800 ; N copyright ; B 29 -12 771 730 ;
C 170 ; WX 349 ; N ordfeminine ; B 13 385 349 717 ;
C 171 ; WX 0 ; N guillemotleft ; B 43 -16 747 162 ;
C 172 ; WX 0 ; N logicalnot ; B 30 0 730 700 ;
C 173 ; WX 432 ; N hyphen ; B 28 249 404 377 ;
C 174 ; WX 800 ; N registered ; B 29 -12 771 730 ;
C 175 ; WX 278 ; N macron ; B -47 584 325 665 ;
C 176 ; WX 0 ; N degree ; B 27 -122 437 592 ;
C 177 ; WX 0 ; N plusminus ; B 29 -8 668 877 ;
C 178 ; WX 0 ; N twosuperior ; B 0 0 0 100 ;
C 179 ; WX 0 ; N threesuperior ; B 0 0 0 100 ;
C 180 ; WX 278 ; N acute ; B 49 536 279 693 ;
C 181 ; WX 614 ; N mu ; B -14 -231 558 501 ;
C 182 ; WX 0 ; N paragraph ; B -35 -15 668 785 ;
C 183 ; WX 254 ; N periodcentered ; B 43 278 227 456 ;
C 184 ; WX 278 ; N cedilla ; B -8 -216 231 6 ;
C 185 ; WX 0 ; N onesuperior ; B 0 0 0 100 ;
C 186 ; WX 305 ; N ordmasculine ; B 16 373 291 702 ;
C 187 ; WX 0 ; N guillemotright ; B 43 -16 747 162 ;
C 188 ; WX 0 ; N onequarter ; B 0 0 0 100 ;
C 189 ; WX 0 ; N onehalf ; B 0 0 0 100 ;
C 190 ; WX 0 ; N threequarters ; B 0 0 0 100 ;
C 191 ; WX 501 ; N questiondown ; B 15 -196 467 541 ;
C 192 ; WX 743 ; N Agrave ; B -23 -14 754 893 ;
C 193 ; WX 743 ; N Aacute ; B -23 -14 754 893 ;
C 194 ; WX 743 ; N Acircumflex ; B -23 -14 754 877 ;
C 195 ; WX 743 ; N Atilde ; B -23 -14 754 889 ;
C 196 ; WX 743 ; N Adieresis ; B -23 -14 754 882 ;
C 197 ; WX 743 ; N Aring ; B -23 -14 754 899 ;
C 198 ; WX 1060 ; N AE ; B -29 -14 1053 708 ;
C 199 ; WX 598 ; N Ccedilla ; B 27 -183 572 712 ;
C 200 ; WX 608 ; N Egrave ; B -21 0 608 893 ;
C 201 ; WX 608 ; N Eacute ; B -21 0 608 893 ;
C 202 ; WX 608 ; N Ecircumflex ; B -21 0 608 877 ;
C 203 ; WX 608 ; N Edieresis ; B -21 0 608 882 ;
C 204 ; WX 308 ; N Igrave ; B 14 -15 264 893 ;
C 205 ; WX 308 ; N Iacute ; B 14 -15 274 893 ;
C 206 ; WX 308 ; N Icircumflex ; B 1 -15 307 877 ;
C 207 ; WX 308 ; N Idieresis ; B -15 -15 313 882 ;
C 208 ; WX 0 ; N Eth ; B 0 0 0 100 ;
C 209 ; WX 817 ; N Ntilde ; B -42 -17 747 889 ;
C 210 ; WX 729 ; N Ograve ; B 32 -16 698 893 ;
C 211 ; WX 729 ; N Oacute ; B 32 -16 698 893 ;
C 212 ; WX 729 ; N Ocircumflex ; B 32 -16 698 877 ;
C 213 ; WX 729 ; N Otilde ; B 32 -16 698 889 ;
C 214 ; WX 729 ; N Odieresis ; B 32 -16 698 882 ;
C 215 ; WX 0 ; N multiply ; B 0 0 0 100 ;
C 216 ; WX 729 ; N Oslash ; B 14 -24 724 709 ;
C 217 ; WX 805 ; N Ugrave ; B 0 -19 804 893 ;
C 218 ; WX 805 ; N Uacute ; B 0 -19 804 893 ;
C 219 ; WX 805 ; N Ucircumflex ; B 0 -19 804 877 ;
C 220 ; WX 805 ; N Udieresis ; B 0 -19 804 882 ;
C 221 ; WX 0 ; N _235 ; B 0 0 0 100 ;
C 222 ; WX 0 ; N Thorn ; B 0 0 0 100 ;
C 223 ; WX 688 ; N germandbls ; B -35 -15 668 785 ;
C 224 ; WX 581 ; N agrave ; B 21 -16 581 693 ;
C 225 ; WX 581 ; N aacute ; B 21 -16 581 693 ;
C 226 ; WX 581 ; N acircumflex ; B 21 -16 581 677 ;
C 227 ; WX 581 ; N atilde ; B 21 -16 581 689 ;
C 228 ; WX 581 ; N adieresis ; B 21 -16 581 682 ;
C 229 ; WX 581 ; N aring ; B 21 -16 581 734 ;
C 230 ; WX 792 ; N ae ; B 21 -23 773 494 ;
C 231 ; WX 440 ; N ccedilla ; B 21 -183 422 490 ;
C 232 ; WX 450 ; N egrave ; B 28 -23 428 693 ;
C 233 ; WX 450 ; N eacute ; B 28 -23 428 693 ;
C 234 ; WX 450 ; N ecircumflex ; B 28 -23 432 677 ;
C 235 ; WX 450 ; N edieresis ; B 28 -23 428 682 ;
C 236 ; WX 283 ; N igrave ; B -14 -15 244 693 ;
C 237 ; WX 283 ; N iacute ; B -14 -15 269 693 ;
C 238 ; WX 283 ; N icircumflex ; B -14 -15 297 677 ;
C 239 ; WX 283 ; N idieresis ; B -25 -15 303 682 ;
C 240 ; WX 0 ; N Yacute ; B 0 0 0 100 ;
C 241 ; WX 595 ; N ntilde ; B -28 -15 574 689 ;
C 242 ; WX 508 ; N ograve ; B 27 -17 485 693 ;
C 243 ; WX 508 ; N oacute ; B 27 -17 485 693 ;
C 244 ; WX 508 ; N ocircumflex ; B 27 -17 485 677 ;
C 245 ; WX 508 ; N otilde ; B 27 -17 485 689 ;
C 246 ; WX 508 ; N odieresis ; B 27 -17 485 682 ;
C 247 ; WX 0 ; N divide ; B 35 0 760 727 ;
C 248 ; WX 508 ; N oslash ; B -8 -54 496 589 ;
C 249 ; WX 614 ; N ugrave ; B -14 -18 558 693 ;
C 250 ; WX 614 ; N uacute ; B -14 -18 558 693 ;
C 251 ; WX 614 ; N ucircumflex ; B -14 -18 558 677 ;
C 252 ; WX 614 ; N udieresis ; B -14 -18 558 682 ;
C 253 ; WX 0 ; N yacute ; B 0 0 0 100 ;
C 254 ; WX 0 ; N thorn ; B 0 0 0 100 ;
C 255 ; WX 597 ; N ydieresis ; B -21 -227 541 682 ;
EndCharMetrics
EndFontMetrics
@@ -0,0 +1,24 @@
type='TrueType'
name='Calligrapher-Regular'
desc={'Ascent':899,'Descent':-234,'CapHeight':731,'Flags':32,'FontBBox':'[-50 -234 1328 899]','ItalicAngle':0,'StemV':70,'MissingWidth':800}
up=-200
ut=20
cw={
'\x00':800,'\x01':800,'\x02':800,'\x03':800,'\x04':800,'\x05':800,'\x06':800,'\x07':800,'\x08':800,'\t':800,'\n':800,'\x0b':800,'\x0c':800,'\r':800,'\x0e':800,'\x0f':800,'\x10':800,'\x11':800,'\x12':800,'\x13':800,'\x14':800,'\x15':800,
'\x16':800,'\x17':800,'\x18':800,'\x19':800,'\x1a':800,'\x1b':800,'\x1c':800,'\x1d':800,'\x1e':800,'\x1f':800,' ':282,'!':324,'"':405,'#':584,'$':632,'%':980,'&':776,'\'':259,'(':299,')':299,'*':377,'+':600,
',':259,'-':432,'.':254,'/':597,'0':529,'1':298,'2':451,'3':359,'4':525,'5':423,'6':464,'7':417,'8':457,'9':479,':':275,';':282,'<':600,'=':600,'>':600,'?':501,'@':800,'A':743,
'B':636,'C':598,'D':712,'E':608,'F':562,'G':680,'H':756,'I':308,'J':314,'K':676,'L':552,'M':1041,'N':817,'O':729,'P':569,'Q':698,'R':674,'S':618,'T':673,'U':805,'V':753,'W':1238,
'X':716,'Y':754,'Z':599,'[':315,'\\':463,']':315,'^':600,'_':547,'`':278,'a':581,'b':564,'c':440,'d':571,'e':450,'f':347,'g':628,'h':611,'i':283,'j':283,'k':560,'l':252,'m':976,
'n':595,'o':508,'p':549,'q':540,'r':395,'s':441,'t':307,'u':614,'v':556,'w':915,'x':559,'y':597,'z':452,'{':315,'|':222,'}':315,'~':600,'\x7f':800,'\x80':800,'\x81':800,'\x82':0,'\x83':0,
'\x84':0,'\x85':780,'\x86':0,'\x87':0,'\x88':278,'\x89':0,'\x8a':0,'\x8b':0,'\x8c':1064,'\x8d':800,'\x8e':800,'\x8f':800,'\x90':800,'\x91':259,'\x92':259,'\x93':470,'\x94':470,'\x95':500,'\x96':300,'\x97':600,'\x98':278,'\x99':990,
'\x9a':0,'\x9b':0,'\x9c':790,'\x9d':800,'\x9e':800,'\x9f':754,'\xa0':282,'\xa1':324,'\xa2':450,'\xa3':640,'\xa4':518,'\xa5':603,'\xa6':0,'\xa7':519,'\xa8':254,'\xa9':800,'\xaa':349,'\xab':0,'\xac':0,'\xad':432,'\xae':800,'\xaf':278,
'\xb0':0,'\xb1':0,'\xb2':0,'\xb3':0,'\xb4':278,'\xb5':614,'\xb6':0,'\xb7':254,'\xb8':278,'\xb9':0,'\xba':305,'\xbb':0,'\xbc':0,'\xbd':0,'\xbe':0,'\xbf':501,'\xc0':743,'\xc1':743,'\xc2':743,'\xc3':743,'\xc4':743,'\xc5':743,
'\xc6':1060,'\xc7':598,'\xc8':608,'\xc9':608,'\xca':608,'\xcb':608,'\xcc':308,'\xcd':308,'\xce':308,'\xcf':308,'\xd0':0,'\xd1':817,'\xd2':729,'\xd3':729,'\xd4':729,'\xd5':729,'\xd6':729,'\xd7':0,'\xd8':729,'\xd9':805,'\xda':805,'\xdb':805,
'\xdc':805,'\xdd':0,'\xde':0,'\xdf':688,'\xe0':581,'\xe1':581,'\xe2':581,'\xe3':581,'\xe4':581,'\xe5':581,'\xe6':792,'\xe7':440,'\xe8':450,'\xe9':450,'\xea':450,'\xeb':450,'\xec':283,'\xed':283,'\xee':283,'\xef':283,'\xf0':800,'\xf1':595,
'\xf2':508,'\xf3':508,'\xf4':508,'\xf5':508,'\xf6':508,'\xf7':0,'\xf8':508,'\xf9':614,'\xfa':614,'\xfb':614,'\xfc':614,'\xfd':0,'\xfe':0,'\xff':597}
enc='cp1252'
diff=''
filename='calligra.z'
originalsize=40120
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
fpdf_charwidths['courier']={}
for i in xrange(0,256):
fpdf_charwidths['courier'][chr(i)]=600
fpdf_charwidths['courierB']=fpdf_charwidths['courier']
fpdf_charwidths['courierI']=fpdf_charwidths['courier']
fpdf_charwidths['courierBI']=fpdf_charwidths['courier']
@@ -0,0 +1,251 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!89 U+2030 perthousand
!8A U+0160 Scaron
!8B U+2039 guilsinglleft
!8C U+015A Sacute
!8D U+0164 Tcaron
!8E U+017D Zcaron
!8F U+0179 Zacute
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!99 U+2122 trademark
!9A U+0161 scaron
!9B U+203A guilsinglright
!9C U+015B sacute
!9D U+0165 tcaron
!9E U+017E zcaron
!9F U+017A zacute
!A0 U+00A0 space
!A1 U+02C7 caron
!A2 U+02D8 breve
!A3 U+0141 Lslash
!A4 U+00A4 currency
!A5 U+0104 Aogonek
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+015E Scedilla
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+017B Zdotaccent
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+02DB ogonek
!B3 U+0142 lslash
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00B8 cedilla
!B9 U+0105 aogonek
!BA U+015F scedilla
!BB U+00BB guillemotright
!BC U+013D Lcaron
!BD U+02DD hungarumlaut
!BE U+013E lcaron
!BF U+017C zdotaccent
!C0 U+0154 Racute
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+0102 Abreve
!C4 U+00C4 Adieresis
!C5 U+0139 Lacute
!C6 U+0106 Cacute
!C7 U+00C7 Ccedilla
!C8 U+010C Ccaron
!C9 U+00C9 Eacute
!CA U+0118 Eogonek
!CB U+00CB Edieresis
!CC U+011A Ecaron
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+010E Dcaron
!D0 U+0110 Dcroat
!D1 U+0143 Nacute
!D2 U+0147 Ncaron
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+0150 Ohungarumlaut
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+0158 Rcaron
!D9 U+016E Uring
!DA U+00DA Uacute
!DB U+0170 Uhungarumlaut
!DC U+00DC Udieresis
!DD U+00DD Yacute
!DE U+0162 Tcommaaccent
!DF U+00DF germandbls
!E0 U+0155 racute
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+0103 abreve
!E4 U+00E4 adieresis
!E5 U+013A lacute
!E6 U+0107 cacute
!E7 U+00E7 ccedilla
!E8 U+010D ccaron
!E9 U+00E9 eacute
!EA U+0119 eogonek
!EB U+00EB edieresis
!EC U+011B ecaron
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+010F dcaron
!F0 U+0111 dcroat
!F1 U+0144 nacute
!F2 U+0148 ncaron
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+0151 ohungarumlaut
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+0159 rcaron
!F9 U+016F uring
!FA U+00FA uacute
!FB U+0171 uhungarumlaut
!FC U+00FC udieresis
!FD U+00FD yacute
!FE U+0163 tcommaaccent
!FF U+02D9 dotaccent
@@ -0,0 +1,255 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0402 afii10051
!81 U+0403 afii10052
!82 U+201A quotesinglbase
!83 U+0453 afii10100
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!88 U+20AC Euro
!89 U+2030 perthousand
!8A U+0409 afii10058
!8B U+2039 guilsinglleft
!8C U+040A afii10059
!8D U+040C afii10061
!8E U+040B afii10060
!8F U+040F afii10145
!90 U+0452 afii10099
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!99 U+2122 trademark
!9A U+0459 afii10106
!9B U+203A guilsinglright
!9C U+045A afii10107
!9D U+045C afii10109
!9E U+045B afii10108
!9F U+045F afii10193
!A0 U+00A0 space
!A1 U+040E afii10062
!A2 U+045E afii10110
!A3 U+0408 afii10057
!A4 U+00A4 currency
!A5 U+0490 afii10050
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+0401 afii10023
!A9 U+00A9 copyright
!AA U+0404 afii10053
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+0407 afii10056
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+0406 afii10055
!B3 U+0456 afii10103
!B4 U+0491 afii10098
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+0451 afii10071
!B9 U+2116 afii61352
!BA U+0454 afii10101
!BB U+00BB guillemotright
!BC U+0458 afii10105
!BD U+0405 afii10054
!BE U+0455 afii10102
!BF U+0457 afii10104
!C0 U+0410 afii10017
!C1 U+0411 afii10018
!C2 U+0412 afii10019
!C3 U+0413 afii10020
!C4 U+0414 afii10021
!C5 U+0415 afii10022
!C6 U+0416 afii10024
!C7 U+0417 afii10025
!C8 U+0418 afii10026
!C9 U+0419 afii10027
!CA U+041A afii10028
!CB U+041B afii10029
!CC U+041C afii10030
!CD U+041D afii10031
!CE U+041E afii10032
!CF U+041F afii10033
!D0 U+0420 afii10034
!D1 U+0421 afii10035
!D2 U+0422 afii10036
!D3 U+0423 afii10037
!D4 U+0424 afii10038
!D5 U+0425 afii10039
!D6 U+0426 afii10040
!D7 U+0427 afii10041
!D8 U+0428 afii10042
!D9 U+0429 afii10043
!DA U+042A afii10044
!DB U+042B afii10045
!DC U+042C afii10046
!DD U+042D afii10047
!DE U+042E afii10048
!DF U+042F afii10049
!E0 U+0430 afii10065
!E1 U+0431 afii10066
!E2 U+0432 afii10067
!E3 U+0433 afii10068
!E4 U+0434 afii10069
!E5 U+0435 afii10070
!E6 U+0436 afii10072
!E7 U+0437 afii10073
!E8 U+0438 afii10074
!E9 U+0439 afii10075
!EA U+043A afii10076
!EB U+043B afii10077
!EC U+043C afii10078
!ED U+043D afii10079
!EE U+043E afii10080
!EF U+043F afii10081
!F0 U+0440 afii10082
!F1 U+0441 afii10083
!F2 U+0442 afii10084
!F3 U+0443 afii10085
!F4 U+0444 afii10086
!F5 U+0445 afii10087
!F6 U+0446 afii10088
!F7 U+0447 afii10089
!F8 U+0448 afii10090
!F9 U+0449 afii10091
!FA U+044A afii10092
!FB U+044B afii10093
!FC U+044C afii10094
!FD U+044D afii10095
!FE U+044E afii10096
!FF U+044F afii10097
@@ -0,0 +1,251 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!83 U+0192 florin
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!88 U+02C6 circumflex
!89 U+2030 perthousand
!8A U+0160 Scaron
!8B U+2039 guilsinglleft
!8C U+0152 OE
!8E U+017D Zcaron
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!98 U+02DC tilde
!99 U+2122 trademark
!9A U+0161 scaron
!9B U+203A guilsinglright
!9C U+0153 oe
!9E U+017E zcaron
!9F U+0178 Ydieresis
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+00AA ordfeminine
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00B8 cedilla
!B9 U+00B9 onesuperior
!BA U+00BA ordmasculine
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00BF questiondown
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+00C3 Atilde
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+00CC Igrave
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+00D0 Eth
!D1 U+00D1 Ntilde
!D2 U+00D2 Ograve
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+00DD Yacute
!DE U+00DE Thorn
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+00E3 atilde
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+00EC igrave
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+00F0 eth
!F1 U+00F1 ntilde
!F2 U+00F2 ograve
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+00FD yacute
!FE U+00FE thorn
!FF U+00FF ydieresis
@@ -0,0 +1,239 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!83 U+0192 florin
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!89 U+2030 perthousand
!8B U+2039 guilsinglleft
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!99 U+2122 trademark
!9B U+203A guilsinglright
!A0 U+00A0 space
!A1 U+0385 dieresistonos
!A2 U+0386 Alphatonos
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+2015 afii00208
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+0384 tonos
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+0388 Epsilontonos
!B9 U+0389 Etatonos
!BA U+038A Iotatonos
!BB U+00BB guillemotright
!BC U+038C Omicrontonos
!BD U+00BD onehalf
!BE U+038E Upsilontonos
!BF U+038F Omegatonos
!C0 U+0390 iotadieresistonos
!C1 U+0391 Alpha
!C2 U+0392 Beta
!C3 U+0393 Gamma
!C4 U+0394 Delta
!C5 U+0395 Epsilon
!C6 U+0396 Zeta
!C7 U+0397 Eta
!C8 U+0398 Theta
!C9 U+0399 Iota
!CA U+039A Kappa
!CB U+039B Lambda
!CC U+039C Mu
!CD U+039D Nu
!CE U+039E Xi
!CF U+039F Omicron
!D0 U+03A0 Pi
!D1 U+03A1 Rho
!D3 U+03A3 Sigma
!D4 U+03A4 Tau
!D5 U+03A5 Upsilon
!D6 U+03A6 Phi
!D7 U+03A7 Chi
!D8 U+03A8 Psi
!D9 U+03A9 Omega
!DA U+03AA Iotadieresis
!DB U+03AB Upsilondieresis
!DC U+03AC alphatonos
!DD U+03AD epsilontonos
!DE U+03AE etatonos
!DF U+03AF iotatonos
!E0 U+03B0 upsilondieresistonos
!E1 U+03B1 alpha
!E2 U+03B2 beta
!E3 U+03B3 gamma
!E4 U+03B4 delta
!E5 U+03B5 epsilon
!E6 U+03B6 zeta
!E7 U+03B7 eta
!E8 U+03B8 theta
!E9 U+03B9 iota
!EA U+03BA kappa
!EB U+03BB lambda
!EC U+03BC mu
!ED U+03BD nu
!EE U+03BE xi
!EF U+03BF omicron
!F0 U+03C0 pi
!F1 U+03C1 rho
!F2 U+03C2 sigma1
!F3 U+03C3 sigma
!F4 U+03C4 tau
!F5 U+03C5 upsilon
!F6 U+03C6 phi
!F7 U+03C7 chi
!F8 U+03C8 psi
!F9 U+03C9 omega
!FA U+03CA iotadieresis
!FB U+03CB upsilondieresis
!FC U+03CC omicrontonos
!FD U+03CD upsilontonos
!FE U+03CE omegatonos
@@ -0,0 +1,249 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!83 U+0192 florin
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!88 U+02C6 circumflex
!89 U+2030 perthousand
!8A U+0160 Scaron
!8B U+2039 guilsinglleft
!8C U+0152 OE
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!98 U+02DC tilde
!99 U+2122 trademark
!9A U+0161 scaron
!9B U+203A guilsinglright
!9C U+0153 oe
!9F U+0178 Ydieresis
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+00AA ordfeminine
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00B8 cedilla
!B9 U+00B9 onesuperior
!BA U+00BA ordmasculine
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00BF questiondown
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+00C3 Atilde
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+00CC Igrave
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+011E Gbreve
!D1 U+00D1 Ntilde
!D2 U+00D2 Ograve
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+0130 Idotaccent
!DE U+015E Scedilla
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+00E3 atilde
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+00EC igrave
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+011F gbreve
!F1 U+00F1 ntilde
!F2 U+00F2 ograve
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+0131 dotlessi
!FE U+015F scedilla
!FF U+00FF ydieresis
@@ -0,0 +1,233 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!83 U+0192 florin
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!88 U+02C6 circumflex
!89 U+2030 perthousand
!8B U+2039 guilsinglleft
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!98 U+02DC tilde
!99 U+2122 trademark
!9B U+203A guilsinglright
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+20AA afii57636
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+00D7 multiply
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD sfthyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 middot
!B8 U+00B8 cedilla
!B9 U+00B9 onesuperior
!BA U+00F7 divide
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00BF questiondown
!C0 U+05B0 afii57799
!C1 U+05B1 afii57801
!C2 U+05B2 afii57800
!C3 U+05B3 afii57802
!C4 U+05B4 afii57793
!C5 U+05B5 afii57794
!C6 U+05B6 afii57795
!C7 U+05B7 afii57798
!C8 U+05B8 afii57797
!C9 U+05B9 afii57806
!CB U+05BB afii57796
!CC U+05BC afii57807
!CD U+05BD afii57839
!CE U+05BE afii57645
!CF U+05BF afii57841
!D0 U+05C0 afii57842
!D1 U+05C1 afii57804
!D2 U+05C2 afii57803
!D3 U+05C3 afii57658
!D4 U+05F0 afii57716
!D5 U+05F1 afii57717
!D6 U+05F2 afii57718
!D7 U+05F3 gereshhebrew
!D8 U+05F4 gershayimhebrew
!E0 U+05D0 afii57664
!E1 U+05D1 afii57665
!E2 U+05D2 afii57666
!E3 U+05D3 afii57667
!E4 U+05D4 afii57668
!E5 U+05D5 afii57669
!E6 U+05D6 afii57670
!E7 U+05D7 afii57671
!E8 U+05D8 afii57672
!E9 U+05D9 afii57673
!EA U+05DA afii57674
!EB U+05DB afii57675
!EC U+05DC afii57676
!ED U+05DD afii57677
!EE U+05DE afii57678
!EF U+05DF afii57679
!F0 U+05E0 afii57680
!F1 U+05E1 afii57681
!F2 U+05E2 afii57682
!F3 U+05E3 afii57683
!F4 U+05E4 afii57684
!F5 U+05E5 afii57685
!F6 U+05E6 afii57686
!F7 U+05E7 afii57687
!F8 U+05E8 afii57688
!F9 U+05E9 afii57689
!FA U+05EA afii57690
!FD U+200E afii299
!FE U+200F afii300
@@ -0,0 +1,244 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!89 U+2030 perthousand
!8B U+2039 guilsinglleft
!8D U+00A8 dieresis
!8E U+02C7 caron
!8F U+00B8 cedilla
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!99 U+2122 trademark
!9B U+203A guilsinglright
!9D U+00AF macron
!9E U+02DB ogonek
!A0 U+00A0 space
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00D8 Oslash
!A9 U+00A9 copyright
!AA U+0156 Rcommaaccent
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00C6 AE
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00F8 oslash
!B9 U+00B9 onesuperior
!BA U+0157 rcommaaccent
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00E6 ae
!C0 U+0104 Aogonek
!C1 U+012E Iogonek
!C2 U+0100 Amacron
!C3 U+0106 Cacute
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+0118 Eogonek
!C7 U+0112 Emacron
!C8 U+010C Ccaron
!C9 U+00C9 Eacute
!CA U+0179 Zacute
!CB U+0116 Edotaccent
!CC U+0122 Gcommaaccent
!CD U+0136 Kcommaaccent
!CE U+012A Imacron
!CF U+013B Lcommaaccent
!D0 U+0160 Scaron
!D1 U+0143 Nacute
!D2 U+0145 Ncommaaccent
!D3 U+00D3 Oacute
!D4 U+014C Omacron
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+0172 Uogonek
!D9 U+0141 Lslash
!DA U+015A Sacute
!DB U+016A Umacron
!DC U+00DC Udieresis
!DD U+017B Zdotaccent
!DE U+017D Zcaron
!DF U+00DF germandbls
!E0 U+0105 aogonek
!E1 U+012F iogonek
!E2 U+0101 amacron
!E3 U+0107 cacute
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+0119 eogonek
!E7 U+0113 emacron
!E8 U+010D ccaron
!E9 U+00E9 eacute
!EA U+017A zacute
!EB U+0117 edotaccent
!EC U+0123 gcommaaccent
!ED U+0137 kcommaaccent
!EE U+012B imacron
!EF U+013C lcommaaccent
!F0 U+0161 scaron
!F1 U+0144 nacute
!F2 U+0146 ncommaaccent
!F3 U+00F3 oacute
!F4 U+014D omacron
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+0173 uogonek
!F9 U+0142 lslash
!FA U+015B sacute
!FB U+016B umacron
!FC U+00FC udieresis
!FD U+017C zdotaccent
!FE U+017E zcaron
!FF U+02D9 dotaccent
@@ -0,0 +1,247 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!82 U+201A quotesinglbase
!83 U+0192 florin
!84 U+201E quotedblbase
!85 U+2026 ellipsis
!86 U+2020 dagger
!87 U+2021 daggerdbl
!88 U+02C6 circumflex
!89 U+2030 perthousand
!8B U+2039 guilsinglleft
!8C U+0152 OE
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!98 U+02DC tilde
!99 U+2122 trademark
!9B U+203A guilsinglright
!9C U+0153 oe
!9F U+0178 Ydieresis
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+00AA ordfeminine
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00B8 cedilla
!B9 U+00B9 onesuperior
!BA U+00BA ordmasculine
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00BF questiondown
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+0102 Abreve
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+0300 gravecomb
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+0110 Dcroat
!D1 U+00D1 Ntilde
!D2 U+0309 hookabovecomb
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+01A0 Ohorn
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+01AF Uhorn
!DE U+0303 tildecomb
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+0103 abreve
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+0301 acutecomb
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+0111 dcroat
!F1 U+00F1 ntilde
!F2 U+0323 dotbelowcomb
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+01A1 ohorn
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+01B0 uhorn
!FE U+20AB dong
!FF U+00FF ydieresis
@@ -0,0 +1,225 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+20AC Euro
!85 U+2026 ellipsis
!91 U+2018 quoteleft
!92 U+2019 quoteright
!93 U+201C quotedblleft
!94 U+201D quotedblright
!95 U+2022 bullet
!96 U+2013 endash
!97 U+2014 emdash
!A0 U+00A0 space
!A1 U+0E01 kokaithai
!A2 U+0E02 khokhaithai
!A3 U+0E03 khokhuatthai
!A4 U+0E04 khokhwaithai
!A5 U+0E05 khokhonthai
!A6 U+0E06 khorakhangthai
!A7 U+0E07 ngonguthai
!A8 U+0E08 chochanthai
!A9 U+0E09 chochingthai
!AA U+0E0A chochangthai
!AB U+0E0B sosothai
!AC U+0E0C chochoethai
!AD U+0E0D yoyingthai
!AE U+0E0E dochadathai
!AF U+0E0F topatakthai
!B0 U+0E10 thothanthai
!B1 U+0E11 thonangmonthothai
!B2 U+0E12 thophuthaothai
!B3 U+0E13 nonenthai
!B4 U+0E14 dodekthai
!B5 U+0E15 totaothai
!B6 U+0E16 thothungthai
!B7 U+0E17 thothahanthai
!B8 U+0E18 thothongthai
!B9 U+0E19 nonuthai
!BA U+0E1A bobaimaithai
!BB U+0E1B poplathai
!BC U+0E1C phophungthai
!BD U+0E1D fofathai
!BE U+0E1E phophanthai
!BF U+0E1F fofanthai
!C0 U+0E20 phosamphaothai
!C1 U+0E21 momathai
!C2 U+0E22 yoyakthai
!C3 U+0E23 roruathai
!C4 U+0E24 ruthai
!C5 U+0E25 lolingthai
!C6 U+0E26 luthai
!C7 U+0E27 wowaenthai
!C8 U+0E28 sosalathai
!C9 U+0E29 sorusithai
!CA U+0E2A sosuathai
!CB U+0E2B hohipthai
!CC U+0E2C lochulathai
!CD U+0E2D oangthai
!CE U+0E2E honokhukthai
!CF U+0E2F paiyannoithai
!D0 U+0E30 saraathai
!D1 U+0E31 maihanakatthai
!D2 U+0E32 saraaathai
!D3 U+0E33 saraamthai
!D4 U+0E34 saraithai
!D5 U+0E35 saraiithai
!D6 U+0E36 sarauethai
!D7 U+0E37 saraueethai
!D8 U+0E38 sarauthai
!D9 U+0E39 sarauuthai
!DA U+0E3A phinthuthai
!DF U+0E3F bahtthai
!E0 U+0E40 saraethai
!E1 U+0E41 saraaethai
!E2 U+0E42 saraothai
!E3 U+0E43 saraaimaimuanthai
!E4 U+0E44 saraaimaimalaithai
!E5 U+0E45 lakkhangyaothai
!E6 U+0E46 maiyamokthai
!E7 U+0E47 maitaikhuthai
!E8 U+0E48 maiekthai
!E9 U+0E49 maithothai
!EA U+0E4A maitrithai
!EB U+0E4B maichattawathai
!EC U+0E4C thanthakhatthai
!ED U+0E4D nikhahitthai
!EE U+0E4E yamakkanthai
!EF U+0E4F fongmanthai
!F0 U+0E50 zerothai
!F1 U+0E51 onethai
!F2 U+0E52 twothai
!F3 U+0E53 threethai
!F4 U+0E54 fourthai
!F5 U+0E55 fivethai
!F6 U+0E56 sixthai
!F7 U+0E57 seventhai
!F8 U+0E58 eightthai
!F9 U+0E59 ninethai
!FA U+0E5A angkhankhuthai
!FB U+0E5B khomutthai
@@ -0,0 +1,13 @@
fpdf_charwidths['helvetica']={
'\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278,
'\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':278,'"':355,'#':556,'$':556,'%':889,'&':667,'\'':191,'(':333,')':333,'*':389,'+':584,
',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':278,';':278,'<':584,'=':584,'>':584,'?':556,'@':1015,'A':667,
'B':667,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':500,'K':667,'L':556,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944,
'X':667,'Y':667,'Z':611,'[':278,'\\':278,']':278,'^':469,'_':556,'`':333,'a':556,'b':556,'c':500,'d':556,'e':556,'f':278,'g':556,'h':556,'i':222,'j':222,'k':500,'l':222,'m':833,
'n':556,'o':556,'p':556,'q':556,'r':333,'s':500,'t':278,'u':556,'v':500,'w':722,'x':500,'y':500,'z':500,'{':334,'|':260,'}':334,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':222,'\x83':556,
'\x84':333,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':222,'\x92':222,'\x93':333,'\x94':333,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000,
'\x9a':500,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':260,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333,
'\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':556,'\xb6':537,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':667,'\xc1':667,'\xc2':667,'\xc3':667,'\xc4':667,'\xc5':667,
'\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':500,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':556,'\xf1':556,
'\xf2':556,'\xf3':556,'\xf4':556,'\xf5':556,'\xf6':556,'\xf7':584,'\xf8':611,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':500,'\xfe':556,'\xff':500}
@@ -0,0 +1,14 @@
fpdf_charwidths['helveticaB']={
'\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278,
'\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':333,'"':474,'#':556,'$':556,'%':889,'&':722,'\'':238,'(':333,')':333,'*':389,'+':584,
',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':333,';':333,'<':584,'=':584,'>':584,'?':611,'@':975,'A':722,
'B':722,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':556,'K':722,'L':611,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944,
'X':667,'Y':667,'Z':611,'[':333,'\\':278,']':333,'^':584,'_':556,'`':333,'a':556,'b':611,'c':556,'d':611,'e':556,'f':333,'g':611,'h':611,'i':278,'j':278,'k':556,'l':278,'m':889,
'n':611,'o':611,'p':611,'q':611,'r':389,'s':556,'t':333,'u':611,'v':556,'w':778,'x':556,'y':556,'z':500,'{':389,'|':280,'}':389,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':278,'\x83':556,
'\x84':500,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':278,'\x92':278,'\x93':500,'\x94':500,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000,
'\x9a':556,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':280,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333,
'\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':611,'\xb6':556,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722,
'\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':556,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':611,'\xf1':611,
'\xf2':611,'\xf3':611,'\xf4':611,'\xf5':611,'\xf6':611,'\xf7':584,'\xf8':611,'\xf9':611,'\xfa':611,'\xfb':611,'\xfc':611,'\xfd':556,'\xfe':611,'\xff':556
}
@@ -0,0 +1,13 @@
fpdf_charwidths['helveticaBI']={
'\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278,
'\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':333,'"':474,'#':556,'$':556,'%':889,'&':722,'\'':238,'(':333,')':333,'*':389,'+':584,
',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':333,';':333,'<':584,'=':584,'>':584,'?':611,'@':975,'A':722,
'B':722,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':556,'K':722,'L':611,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944,
'X':667,'Y':667,'Z':611,'[':333,'\\':278,']':333,'^':584,'_':556,'`':333,'a':556,'b':611,'c':556,'d':611,'e':556,'f':333,'g':611,'h':611,'i':278,'j':278,'k':556,'l':278,'m':889,
'n':611,'o':611,'p':611,'q':611,'r':389,'s':556,'t':333,'u':611,'v':556,'w':778,'x':556,'y':556,'z':500,'{':389,'|':280,'}':389,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':278,'\x83':556,
'\x84':500,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':278,'\x92':278,'\x93':500,'\x94':500,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000,
'\x9a':556,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':280,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333,
'\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':611,'\xb6':556,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722,
'\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':556,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':611,'\xf1':611,
'\xf2':611,'\xf3':611,'\xf4':611,'\xf5':611,'\xf6':611,'\xf7':584,'\xf8':611,'\xf9':611,'\xfa':611,'\xfb':611,'\xfc':611,'\xfd':556,'\xfe':611,'\xff':556}
@@ -0,0 +1,13 @@
fpdf_charwidths['helveticaI']={
'\x00':278,'\x01':278,'\x02':278,'\x03':278,'\x04':278,'\x05':278,'\x06':278,'\x07':278,'\x08':278,'\t':278,'\n':278,'\x0b':278,'\x0c':278,'\r':278,'\x0e':278,'\x0f':278,'\x10':278,'\x11':278,'\x12':278,'\x13':278,'\x14':278,'\x15':278,
'\x16':278,'\x17':278,'\x18':278,'\x19':278,'\x1a':278,'\x1b':278,'\x1c':278,'\x1d':278,'\x1e':278,'\x1f':278,' ':278,'!':278,'"':355,'#':556,'$':556,'%':889,'&':667,'\'':191,'(':333,')':333,'*':389,'+':584,
',':278,'-':333,'.':278,'/':278,'0':556,'1':556,'2':556,'3':556,'4':556,'5':556,'6':556,'7':556,'8':556,'9':556,':':278,';':278,'<':584,'=':584,'>':584,'?':556,'@':1015,'A':667,
'B':667,'C':722,'D':722,'E':667,'F':611,'G':778,'H':722,'I':278,'J':500,'K':667,'L':556,'M':833,'N':722,'O':778,'P':667,'Q':778,'R':722,'S':667,'T':611,'U':722,'V':667,'W':944,
'X':667,'Y':667,'Z':611,'[':278,'\\':278,']':278,'^':469,'_':556,'`':333,'a':556,'b':556,'c':500,'d':556,'e':556,'f':278,'g':556,'h':556,'i':222,'j':222,'k':500,'l':222,'m':833,
'n':556,'o':556,'p':556,'q':556,'r':333,'s':500,'t':278,'u':556,'v':500,'w':722,'x':500,'y':500,'z':500,'{':334,'|':260,'}':334,'~':584,'\x7f':350,'\x80':556,'\x81':350,'\x82':222,'\x83':556,
'\x84':333,'\x85':1000,'\x86':556,'\x87':556,'\x88':333,'\x89':1000,'\x8a':667,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':222,'\x92':222,'\x93':333,'\x94':333,'\x95':350,'\x96':556,'\x97':1000,'\x98':333,'\x99':1000,
'\x9a':500,'\x9b':333,'\x9c':944,'\x9d':350,'\x9e':500,'\x9f':667,'\xa0':278,'\xa1':333,'\xa2':556,'\xa3':556,'\xa4':556,'\xa5':556,'\xa6':260,'\xa7':556,'\xa8':333,'\xa9':737,'\xaa':370,'\xab':556,'\xac':584,'\xad':333,'\xae':737,'\xaf':333,
'\xb0':400,'\xb1':584,'\xb2':333,'\xb3':333,'\xb4':333,'\xb5':556,'\xb6':537,'\xb7':278,'\xb8':333,'\xb9':333,'\xba':365,'\xbb':556,'\xbc':834,'\xbd':834,'\xbe':834,'\xbf':611,'\xc0':667,'\xc1':667,'\xc2':667,'\xc3':667,'\xc4':667,'\xc5':667,
'\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':278,'\xcd':278,'\xce':278,'\xcf':278,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':584,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':667,'\xde':667,'\xdf':611,'\xe0':556,'\xe1':556,'\xe2':556,'\xe3':556,'\xe4':556,'\xe5':556,'\xe6':889,'\xe7':500,'\xe8':556,'\xe9':556,'\xea':556,'\xeb':556,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':556,'\xf1':556,
'\xf2':556,'\xf3':556,'\xf4':556,'\xf5':556,'\xf6':556,'\xf7':584,'\xf8':611,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':500,'\xfe':556,'\xff':500}
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+00AA ordfeminine
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00B8 cedilla
!B9 U+00B9 onesuperior
!BA U+00BA ordmasculine
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00BF questiondown
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+00C3 Atilde
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+00CC Igrave
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+00D0 Eth
!D1 U+00D1 Ntilde
!D2 U+00D2 Ograve
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+00DD Yacute
!DE U+00DE Thorn
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+00E3 atilde
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+00EC igrave
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+00F0 eth
!F1 U+00F1 ntilde
!F2 U+00F2 ograve
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+00FD yacute
!FE U+00FE thorn
!FF U+00FF ydieresis
@@ -0,0 +1,248 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+0E01 kokaithai
!A2 U+0E02 khokhaithai
!A3 U+0E03 khokhuatthai
!A4 U+0E04 khokhwaithai
!A5 U+0E05 khokhonthai
!A6 U+0E06 khorakhangthai
!A7 U+0E07 ngonguthai
!A8 U+0E08 chochanthai
!A9 U+0E09 chochingthai
!AA U+0E0A chochangthai
!AB U+0E0B sosothai
!AC U+0E0C chochoethai
!AD U+0E0D yoyingthai
!AE U+0E0E dochadathai
!AF U+0E0F topatakthai
!B0 U+0E10 thothanthai
!B1 U+0E11 thonangmonthothai
!B2 U+0E12 thophuthaothai
!B3 U+0E13 nonenthai
!B4 U+0E14 dodekthai
!B5 U+0E15 totaothai
!B6 U+0E16 thothungthai
!B7 U+0E17 thothahanthai
!B8 U+0E18 thothongthai
!B9 U+0E19 nonuthai
!BA U+0E1A bobaimaithai
!BB U+0E1B poplathai
!BC U+0E1C phophungthai
!BD U+0E1D fofathai
!BE U+0E1E phophanthai
!BF U+0E1F fofanthai
!C0 U+0E20 phosamphaothai
!C1 U+0E21 momathai
!C2 U+0E22 yoyakthai
!C3 U+0E23 roruathai
!C4 U+0E24 ruthai
!C5 U+0E25 lolingthai
!C6 U+0E26 luthai
!C7 U+0E27 wowaenthai
!C8 U+0E28 sosalathai
!C9 U+0E29 sorusithai
!CA U+0E2A sosuathai
!CB U+0E2B hohipthai
!CC U+0E2C lochulathai
!CD U+0E2D oangthai
!CE U+0E2E honokhukthai
!CF U+0E2F paiyannoithai
!D0 U+0E30 saraathai
!D1 U+0E31 maihanakatthai
!D2 U+0E32 saraaathai
!D3 U+0E33 saraamthai
!D4 U+0E34 saraithai
!D5 U+0E35 saraiithai
!D6 U+0E36 sarauethai
!D7 U+0E37 saraueethai
!D8 U+0E38 sarauthai
!D9 U+0E39 sarauuthai
!DA U+0E3A phinthuthai
!DF U+0E3F bahtthai
!E0 U+0E40 saraethai
!E1 U+0E41 saraaethai
!E2 U+0E42 saraothai
!E3 U+0E43 saraaimaimuanthai
!E4 U+0E44 saraaimaimalaithai
!E5 U+0E45 lakkhangyaothai
!E6 U+0E46 maiyamokthai
!E7 U+0E47 maitaikhuthai
!E8 U+0E48 maiekthai
!E9 U+0E49 maithothai
!EA U+0E4A maitrithai
!EB U+0E4B maichattawathai
!EC U+0E4C thanthakhatthai
!ED U+0E4D nikhahitthai
!EE U+0E4E yamakkanthai
!EF U+0E4F fongmanthai
!F0 U+0E50 zerothai
!F1 U+0E51 onethai
!F2 U+0E52 twothai
!F3 U+0E53 threethai
!F4 U+0E54 fourthai
!F5 U+0E55 fivethai
!F6 U+0E56 sixthai
!F7 U+0E57 seventhai
!F8 U+0E58 eightthai
!F9 U+0E59 ninethai
!FA U+0E5A angkhankhuthai
!FB U+0E5B khomutthai
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+20AC Euro
!A5 U+00A5 yen
!A6 U+0160 Scaron
!A7 U+00A7 section
!A8 U+0161 scaron
!A9 U+00A9 copyright
!AA U+00AA ordfeminine
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+017D Zcaron
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+017E zcaron
!B9 U+00B9 onesuperior
!BA U+00BA ordmasculine
!BB U+00BB guillemotright
!BC U+0152 OE
!BD U+0153 oe
!BE U+0178 Ydieresis
!BF U+00BF questiondown
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+00C3 Atilde
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+00CC Igrave
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+00D0 Eth
!D1 U+00D1 Ntilde
!D2 U+00D2 Ograve
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+00DD Yacute
!DE U+00DE Thorn
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+00E3 atilde
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+00EC igrave
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+00F0 eth
!F1 U+00F1 ntilde
!F2 U+00F2 ograve
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+00FD yacute
!FE U+00FE thorn
!FF U+00FF ydieresis
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+0104 Aogonek
!A2 U+0105 aogonek
!A3 U+0141 Lslash
!A4 U+20AC Euro
!A5 U+201E quotedblbase
!A6 U+0160 Scaron
!A7 U+00A7 section
!A8 U+0161 scaron
!A9 U+00A9 copyright
!AA U+0218 Scommaaccent
!AB U+00AB guillemotleft
!AC U+0179 Zacute
!AD U+00AD hyphen
!AE U+017A zacute
!AF U+017B Zdotaccent
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+010C Ccaron
!B3 U+0142 lslash
!B4 U+017D Zcaron
!B5 U+201D quotedblright
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+017E zcaron
!B9 U+010D ccaron
!BA U+0219 scommaaccent
!BB U+00BB guillemotright
!BC U+0152 OE
!BD U+0153 oe
!BE U+0178 Ydieresis
!BF U+017C zdotaccent
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+0102 Abreve
!C4 U+00C4 Adieresis
!C5 U+0106 Cacute
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+00CC Igrave
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+0110 Dcroat
!D1 U+0143 Nacute
!D2 U+00D2 Ograve
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+0150 Ohungarumlaut
!D6 U+00D6 Odieresis
!D7 U+015A Sacute
!D8 U+0170 Uhungarumlaut
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+0118 Eogonek
!DE U+021A Tcommaaccent
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+0103 abreve
!E4 U+00E4 adieresis
!E5 U+0107 cacute
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+00EC igrave
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+0111 dcroat
!F1 U+0144 nacute
!F2 U+00F2 ograve
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+0151 ohungarumlaut
!F6 U+00F6 odieresis
!F7 U+015B sacute
!F8 U+0171 uhungarumlaut
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+0119 eogonek
!FE U+021B tcommaaccent
!FF U+00FF ydieresis
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+0104 Aogonek
!A2 U+02D8 breve
!A3 U+0141 Lslash
!A4 U+00A4 currency
!A5 U+013D Lcaron
!A6 U+015A Sacute
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+0160 Scaron
!AA U+015E Scedilla
!AB U+0164 Tcaron
!AC U+0179 Zacute
!AD U+00AD hyphen
!AE U+017D Zcaron
!AF U+017B Zdotaccent
!B0 U+00B0 degree
!B1 U+0105 aogonek
!B2 U+02DB ogonek
!B3 U+0142 lslash
!B4 U+00B4 acute
!B5 U+013E lcaron
!B6 U+015B sacute
!B7 U+02C7 caron
!B8 U+00B8 cedilla
!B9 U+0161 scaron
!BA U+015F scedilla
!BB U+0165 tcaron
!BC U+017A zacute
!BD U+02DD hungarumlaut
!BE U+017E zcaron
!BF U+017C zdotaccent
!C0 U+0154 Racute
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+0102 Abreve
!C4 U+00C4 Adieresis
!C5 U+0139 Lacute
!C6 U+0106 Cacute
!C7 U+00C7 Ccedilla
!C8 U+010C Ccaron
!C9 U+00C9 Eacute
!CA U+0118 Eogonek
!CB U+00CB Edieresis
!CC U+011A Ecaron
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+010E Dcaron
!D0 U+0110 Dcroat
!D1 U+0143 Nacute
!D2 U+0147 Ncaron
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+0150 Ohungarumlaut
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+0158 Rcaron
!D9 U+016E Uring
!DA U+00DA Uacute
!DB U+0170 Uhungarumlaut
!DC U+00DC Udieresis
!DD U+00DD Yacute
!DE U+0162 Tcommaaccent
!DF U+00DF germandbls
!E0 U+0155 racute
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+0103 abreve
!E4 U+00E4 adieresis
!E5 U+013A lacute
!E6 U+0107 cacute
!E7 U+00E7 ccedilla
!E8 U+010D ccaron
!E9 U+00E9 eacute
!EA U+0119 eogonek
!EB U+00EB edieresis
!EC U+011B ecaron
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+010F dcaron
!F0 U+0111 dcroat
!F1 U+0144 nacute
!F2 U+0148 ncaron
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+0151 ohungarumlaut
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+0159 rcaron
!F9 U+016F uring
!FA U+00FA uacute
!FB U+0171 uhungarumlaut
!FC U+00FC udieresis
!FD U+00FD yacute
!FE U+0163 tcommaaccent
!FF U+02D9 dotaccent
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+0104 Aogonek
!A2 U+0138 kgreenlandic
!A3 U+0156 Rcommaaccent
!A4 U+00A4 currency
!A5 U+0128 Itilde
!A6 U+013B Lcommaaccent
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+0160 Scaron
!AA U+0112 Emacron
!AB U+0122 Gcommaaccent
!AC U+0166 Tbar
!AD U+00AD hyphen
!AE U+017D Zcaron
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+0105 aogonek
!B2 U+02DB ogonek
!B3 U+0157 rcommaaccent
!B4 U+00B4 acute
!B5 U+0129 itilde
!B6 U+013C lcommaaccent
!B7 U+02C7 caron
!B8 U+00B8 cedilla
!B9 U+0161 scaron
!BA U+0113 emacron
!BB U+0123 gcommaaccent
!BC U+0167 tbar
!BD U+014A Eng
!BE U+017E zcaron
!BF U+014B eng
!C0 U+0100 Amacron
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+00C3 Atilde
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+012E Iogonek
!C8 U+010C Ccaron
!C9 U+00C9 Eacute
!CA U+0118 Eogonek
!CB U+00CB Edieresis
!CC U+0116 Edotaccent
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+012A Imacron
!D0 U+0110 Dcroat
!D1 U+0145 Ncommaaccent
!D2 U+014C Omacron
!D3 U+0136 Kcommaaccent
!D4 U+00D4 Ocircumflex
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+0172 Uogonek
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+0168 Utilde
!DE U+016A Umacron
!DF U+00DF germandbls
!E0 U+0101 amacron
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+00E3 atilde
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+012F iogonek
!E8 U+010D ccaron
!E9 U+00E9 eacute
!EA U+0119 eogonek
!EB U+00EB edieresis
!EC U+0117 edotaccent
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+012B imacron
!F0 U+0111 dcroat
!F1 U+0146 ncommaaccent
!F2 U+014D omacron
!F3 U+0137 kcommaaccent
!F4 U+00F4 ocircumflex
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+0173 uogonek
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+0169 utilde
!FE U+016B umacron
!FF U+02D9 dotaccent
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+0401 afii10023
!A2 U+0402 afii10051
!A3 U+0403 afii10052
!A4 U+0404 afii10053
!A5 U+0405 afii10054
!A6 U+0406 afii10055
!A7 U+0407 afii10056
!A8 U+0408 afii10057
!A9 U+0409 afii10058
!AA U+040A afii10059
!AB U+040B afii10060
!AC U+040C afii10061
!AD U+00AD hyphen
!AE U+040E afii10062
!AF U+040F afii10145
!B0 U+0410 afii10017
!B1 U+0411 afii10018
!B2 U+0412 afii10019
!B3 U+0413 afii10020
!B4 U+0414 afii10021
!B5 U+0415 afii10022
!B6 U+0416 afii10024
!B7 U+0417 afii10025
!B8 U+0418 afii10026
!B9 U+0419 afii10027
!BA U+041A afii10028
!BB U+041B afii10029
!BC U+041C afii10030
!BD U+041D afii10031
!BE U+041E afii10032
!BF U+041F afii10033
!C0 U+0420 afii10034
!C1 U+0421 afii10035
!C2 U+0422 afii10036
!C3 U+0423 afii10037
!C4 U+0424 afii10038
!C5 U+0425 afii10039
!C6 U+0426 afii10040
!C7 U+0427 afii10041
!C8 U+0428 afii10042
!C9 U+0429 afii10043
!CA U+042A afii10044
!CB U+042B afii10045
!CC U+042C afii10046
!CD U+042D afii10047
!CE U+042E afii10048
!CF U+042F afii10049
!D0 U+0430 afii10065
!D1 U+0431 afii10066
!D2 U+0432 afii10067
!D3 U+0433 afii10068
!D4 U+0434 afii10069
!D5 U+0435 afii10070
!D6 U+0436 afii10072
!D7 U+0437 afii10073
!D8 U+0438 afii10074
!D9 U+0439 afii10075
!DA U+043A afii10076
!DB U+043B afii10077
!DC U+043C afii10078
!DD U+043D afii10079
!DE U+043E afii10080
!DF U+043F afii10081
!E0 U+0440 afii10082
!E1 U+0441 afii10083
!E2 U+0442 afii10084
!E3 U+0443 afii10085
!E4 U+0444 afii10086
!E5 U+0445 afii10087
!E6 U+0446 afii10088
!E7 U+0447 afii10089
!E8 U+0448 afii10090
!E9 U+0449 afii10091
!EA U+044A afii10092
!EB U+044B afii10093
!EC U+044C afii10094
!ED U+044D afii10095
!EE U+044E afii10096
!EF U+044F afii10097
!F0 U+2116 afii61352
!F1 U+0451 afii10071
!F2 U+0452 afii10099
!F3 U+0453 afii10100
!F4 U+0454 afii10101
!F5 U+0455 afii10102
!F6 U+0456 afii10103
!F7 U+0457 afii10104
!F8 U+0458 afii10105
!F9 U+0459 afii10106
!FA U+045A afii10107
!FB U+045B afii10108
!FC U+045C afii10109
!FD U+00A7 section
!FE U+045E afii10110
!FF U+045F afii10193
@@ -0,0 +1,250 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+2018 quoteleft
!A2 U+2019 quoteright
!A3 U+00A3 sterling
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AF U+2015 afii00208
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+0384 tonos
!B5 U+0385 dieresistonos
!B6 U+0386 Alphatonos
!B7 U+00B7 periodcentered
!B8 U+0388 Epsilontonos
!B9 U+0389 Etatonos
!BA U+038A Iotatonos
!BB U+00BB guillemotright
!BC U+038C Omicrontonos
!BD U+00BD onehalf
!BE U+038E Upsilontonos
!BF U+038F Omegatonos
!C0 U+0390 iotadieresistonos
!C1 U+0391 Alpha
!C2 U+0392 Beta
!C3 U+0393 Gamma
!C4 U+0394 Delta
!C5 U+0395 Epsilon
!C6 U+0396 Zeta
!C7 U+0397 Eta
!C8 U+0398 Theta
!C9 U+0399 Iota
!CA U+039A Kappa
!CB U+039B Lambda
!CC U+039C Mu
!CD U+039D Nu
!CE U+039E Xi
!CF U+039F Omicron
!D0 U+03A0 Pi
!D1 U+03A1 Rho
!D3 U+03A3 Sigma
!D4 U+03A4 Tau
!D5 U+03A5 Upsilon
!D6 U+03A6 Phi
!D7 U+03A7 Chi
!D8 U+03A8 Psi
!D9 U+03A9 Omega
!DA U+03AA Iotadieresis
!DB U+03AB Upsilondieresis
!DC U+03AC alphatonos
!DD U+03AD epsilontonos
!DE U+03AE etatonos
!DF U+03AF iotatonos
!E0 U+03B0 upsilondieresistonos
!E1 U+03B1 alpha
!E2 U+03B2 beta
!E3 U+03B3 gamma
!E4 U+03B4 delta
!E5 U+03B5 epsilon
!E6 U+03B6 zeta
!E7 U+03B7 eta
!E8 U+03B8 theta
!E9 U+03B9 iota
!EA U+03BA kappa
!EB U+03BB lambda
!EC U+03BC mu
!ED U+03BD nu
!EE U+03BE xi
!EF U+03BF omicron
!F0 U+03C0 pi
!F1 U+03C1 rho
!F2 U+03C2 sigma1
!F3 U+03C3 sigma
!F4 U+03C4 tau
!F5 U+03C5 upsilon
!F6 U+03C6 phi
!F7 U+03C7 chi
!F8 U+03C8 psi
!F9 U+03C9 omega
!FA U+03CA iotadieresis
!FB U+03CB upsilondieresis
!FC U+03CC omicrontonos
!FD U+03CD upsilontonos
!FE U+03CE omegatonos
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+0080 .notdef
!81 U+0081 .notdef
!82 U+0082 .notdef
!83 U+0083 .notdef
!84 U+0084 .notdef
!85 U+0085 .notdef
!86 U+0086 .notdef
!87 U+0087 .notdef
!88 U+0088 .notdef
!89 U+0089 .notdef
!8A U+008A .notdef
!8B U+008B .notdef
!8C U+008C .notdef
!8D U+008D .notdef
!8E U+008E .notdef
!8F U+008F .notdef
!90 U+0090 .notdef
!91 U+0091 .notdef
!92 U+0092 .notdef
!93 U+0093 .notdef
!94 U+0094 .notdef
!95 U+0095 .notdef
!96 U+0096 .notdef
!97 U+0097 .notdef
!98 U+0098 .notdef
!99 U+0099 .notdef
!9A U+009A .notdef
!9B U+009B .notdef
!9C U+009C .notdef
!9D U+009D .notdef
!9E U+009E .notdef
!9F U+009F .notdef
!A0 U+00A0 space
!A1 U+00A1 exclamdown
!A2 U+00A2 cent
!A3 U+00A3 sterling
!A4 U+00A4 currency
!A5 U+00A5 yen
!A6 U+00A6 brokenbar
!A7 U+00A7 section
!A8 U+00A8 dieresis
!A9 U+00A9 copyright
!AA U+00AA ordfeminine
!AB U+00AB guillemotleft
!AC U+00AC logicalnot
!AD U+00AD hyphen
!AE U+00AE registered
!AF U+00AF macron
!B0 U+00B0 degree
!B1 U+00B1 plusminus
!B2 U+00B2 twosuperior
!B3 U+00B3 threesuperior
!B4 U+00B4 acute
!B5 U+00B5 mu
!B6 U+00B6 paragraph
!B7 U+00B7 periodcentered
!B8 U+00B8 cedilla
!B9 U+00B9 onesuperior
!BA U+00BA ordmasculine
!BB U+00BB guillemotright
!BC U+00BC onequarter
!BD U+00BD onehalf
!BE U+00BE threequarters
!BF U+00BF questiondown
!C0 U+00C0 Agrave
!C1 U+00C1 Aacute
!C2 U+00C2 Acircumflex
!C3 U+00C3 Atilde
!C4 U+00C4 Adieresis
!C5 U+00C5 Aring
!C6 U+00C6 AE
!C7 U+00C7 Ccedilla
!C8 U+00C8 Egrave
!C9 U+00C9 Eacute
!CA U+00CA Ecircumflex
!CB U+00CB Edieresis
!CC U+00CC Igrave
!CD U+00CD Iacute
!CE U+00CE Icircumflex
!CF U+00CF Idieresis
!D0 U+011E Gbreve
!D1 U+00D1 Ntilde
!D2 U+00D2 Ograve
!D3 U+00D3 Oacute
!D4 U+00D4 Ocircumflex
!D5 U+00D5 Otilde
!D6 U+00D6 Odieresis
!D7 U+00D7 multiply
!D8 U+00D8 Oslash
!D9 U+00D9 Ugrave
!DA U+00DA Uacute
!DB U+00DB Ucircumflex
!DC U+00DC Udieresis
!DD U+0130 Idotaccent
!DE U+015E Scedilla
!DF U+00DF germandbls
!E0 U+00E0 agrave
!E1 U+00E1 aacute
!E2 U+00E2 acircumflex
!E3 U+00E3 atilde
!E4 U+00E4 adieresis
!E5 U+00E5 aring
!E6 U+00E6 ae
!E7 U+00E7 ccedilla
!E8 U+00E8 egrave
!E9 U+00E9 eacute
!EA U+00EA ecircumflex
!EB U+00EB edieresis
!EC U+00EC igrave
!ED U+00ED iacute
!EE U+00EE icircumflex
!EF U+00EF idieresis
!F0 U+011F gbreve
!F1 U+00F1 ntilde
!F2 U+00F2 ograve
!F3 U+00F3 oacute
!F4 U+00F4 ocircumflex
!F5 U+00F5 otilde
!F6 U+00F6 odieresis
!F7 U+00F7 divide
!F8 U+00F8 oslash
!F9 U+00F9 ugrave
!FA U+00FA uacute
!FB U+00FB ucircumflex
!FC U+00FC udieresis
!FD U+0131 dotlessi
!FE U+015F scedilla
!FF U+00FF ydieresis
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+2500 SF100000
!81 U+2502 SF110000
!82 U+250C SF010000
!83 U+2510 SF030000
!84 U+2514 SF020000
!85 U+2518 SF040000
!86 U+251C SF080000
!87 U+2524 SF090000
!88 U+252C SF060000
!89 U+2534 SF070000
!8A U+253C SF050000
!8B U+2580 upblock
!8C U+2584 dnblock
!8D U+2588 block
!8E U+258C lfblock
!8F U+2590 rtblock
!90 U+2591 ltshade
!91 U+2592 shade
!92 U+2593 dkshade
!93 U+2320 integraltp
!94 U+25A0 filledbox
!95 U+2219 periodcentered
!96 U+221A radical
!97 U+2248 approxequal
!98 U+2264 lessequal
!99 U+2265 greaterequal
!9A U+00A0 space
!9B U+2321 integralbt
!9C U+00B0 degree
!9D U+00B2 twosuperior
!9E U+00B7 periodcentered
!9F U+00F7 divide
!A0 U+2550 SF430000
!A1 U+2551 SF240000
!A2 U+2552 SF510000
!A3 U+0451 afii10071
!A4 U+2553 SF520000
!A5 U+2554 SF390000
!A6 U+2555 SF220000
!A7 U+2556 SF210000
!A8 U+2557 SF250000
!A9 U+2558 SF500000
!AA U+2559 SF490000
!AB U+255A SF380000
!AC U+255B SF280000
!AD U+255C SF270000
!AE U+255D SF260000
!AF U+255E SF360000
!B0 U+255F SF370000
!B1 U+2560 SF420000
!B2 U+2561 SF190000
!B3 U+0401 afii10023
!B4 U+2562 SF200000
!B5 U+2563 SF230000
!B6 U+2564 SF470000
!B7 U+2565 SF480000
!B8 U+2566 SF410000
!B9 U+2567 SF450000
!BA U+2568 SF460000
!BB U+2569 SF400000
!BC U+256A SF540000
!BD U+256B SF530000
!BE U+256C SF440000
!BF U+00A9 copyright
!C0 U+044E afii10096
!C1 U+0430 afii10065
!C2 U+0431 afii10066
!C3 U+0446 afii10088
!C4 U+0434 afii10069
!C5 U+0435 afii10070
!C6 U+0444 afii10086
!C7 U+0433 afii10068
!C8 U+0445 afii10087
!C9 U+0438 afii10074
!CA U+0439 afii10075
!CB U+043A afii10076
!CC U+043B afii10077
!CD U+043C afii10078
!CE U+043D afii10079
!CF U+043E afii10080
!D0 U+043F afii10081
!D1 U+044F afii10097
!D2 U+0440 afii10082
!D3 U+0441 afii10083
!D4 U+0442 afii10084
!D5 U+0443 afii10085
!D6 U+0436 afii10072
!D7 U+0432 afii10067
!D8 U+044C afii10094
!D9 U+044B afii10093
!DA U+0437 afii10073
!DB U+0448 afii10090
!DC U+044D afii10095
!DD U+0449 afii10091
!DE U+0447 afii10089
!DF U+044A afii10092
!E0 U+042E afii10048
!E1 U+0410 afii10017
!E2 U+0411 afii10018
!E3 U+0426 afii10040
!E4 U+0414 afii10021
!E5 U+0415 afii10022
!E6 U+0424 afii10038
!E7 U+0413 afii10020
!E8 U+0425 afii10039
!E9 U+0418 afii10026
!EA U+0419 afii10027
!EB U+041A afii10028
!EC U+041B afii10029
!ED U+041C afii10030
!EE U+041D afii10031
!EF U+041E afii10032
!F0 U+041F afii10033
!F1 U+042F afii10049
!F2 U+0420 afii10034
!F3 U+0421 afii10035
!F4 U+0422 afii10036
!F5 U+0423 afii10037
!F6 U+0416 afii10024
!F7 U+0412 afii10019
!F8 U+042C afii10046
!F9 U+042B afii10045
!FA U+0417 afii10025
!FB U+0428 afii10042
!FC U+042D afii10047
!FD U+0429 afii10043
!FE U+0427 afii10041
!FF U+042A afii10044
@@ -0,0 +1,256 @@
!00 U+0000 .notdef
!01 U+0001 .notdef
!02 U+0002 .notdef
!03 U+0003 .notdef
!04 U+0004 .notdef
!05 U+0005 .notdef
!06 U+0006 .notdef
!07 U+0007 .notdef
!08 U+0008 .notdef
!09 U+0009 .notdef
!0A U+000A .notdef
!0B U+000B .notdef
!0C U+000C .notdef
!0D U+000D .notdef
!0E U+000E .notdef
!0F U+000F .notdef
!10 U+0010 .notdef
!11 U+0011 .notdef
!12 U+0012 .notdef
!13 U+0013 .notdef
!14 U+0014 .notdef
!15 U+0015 .notdef
!16 U+0016 .notdef
!17 U+0017 .notdef
!18 U+0018 .notdef
!19 U+0019 .notdef
!1A U+001A .notdef
!1B U+001B .notdef
!1C U+001C .notdef
!1D U+001D .notdef
!1E U+001E .notdef
!1F U+001F .notdef
!20 U+0020 space
!21 U+0021 exclam
!22 U+0022 quotedbl
!23 U+0023 numbersign
!24 U+0024 dollar
!25 U+0025 percent
!26 U+0026 ampersand
!27 U+0027 quotesingle
!28 U+0028 parenleft
!29 U+0029 parenright
!2A U+002A asterisk
!2B U+002B plus
!2C U+002C comma
!2D U+002D hyphen
!2E U+002E period
!2F U+002F slash
!30 U+0030 zero
!31 U+0031 one
!32 U+0032 two
!33 U+0033 three
!34 U+0034 four
!35 U+0035 five
!36 U+0036 six
!37 U+0037 seven
!38 U+0038 eight
!39 U+0039 nine
!3A U+003A colon
!3B U+003B semicolon
!3C U+003C less
!3D U+003D equal
!3E U+003E greater
!3F U+003F question
!40 U+0040 at
!41 U+0041 A
!42 U+0042 B
!43 U+0043 C
!44 U+0044 D
!45 U+0045 E
!46 U+0046 F
!47 U+0047 G
!48 U+0048 H
!49 U+0049 I
!4A U+004A J
!4B U+004B K
!4C U+004C L
!4D U+004D M
!4E U+004E N
!4F U+004F O
!50 U+0050 P
!51 U+0051 Q
!52 U+0052 R
!53 U+0053 S
!54 U+0054 T
!55 U+0055 U
!56 U+0056 V
!57 U+0057 W
!58 U+0058 X
!59 U+0059 Y
!5A U+005A Z
!5B U+005B bracketleft
!5C U+005C backslash
!5D U+005D bracketright
!5E U+005E asciicircum
!5F U+005F underscore
!60 U+0060 grave
!61 U+0061 a
!62 U+0062 b
!63 U+0063 c
!64 U+0064 d
!65 U+0065 e
!66 U+0066 f
!67 U+0067 g
!68 U+0068 h
!69 U+0069 i
!6A U+006A j
!6B U+006B k
!6C U+006C l
!6D U+006D m
!6E U+006E n
!6F U+006F o
!70 U+0070 p
!71 U+0071 q
!72 U+0072 r
!73 U+0073 s
!74 U+0074 t
!75 U+0075 u
!76 U+0076 v
!77 U+0077 w
!78 U+0078 x
!79 U+0079 y
!7A U+007A z
!7B U+007B braceleft
!7C U+007C bar
!7D U+007D braceright
!7E U+007E asciitilde
!7F U+007F .notdef
!80 U+2500 SF100000
!81 U+2502 SF110000
!82 U+250C SF010000
!83 U+2510 SF030000
!84 U+2514 SF020000
!85 U+2518 SF040000
!86 U+251C SF080000
!87 U+2524 SF090000
!88 U+252C SF060000
!89 U+2534 SF070000
!8A U+253C SF050000
!8B U+2580 upblock
!8C U+2584 dnblock
!8D U+2588 block
!8E U+258C lfblock
!8F U+2590 rtblock
!90 U+2591 ltshade
!91 U+2592 shade
!92 U+2593 dkshade
!93 U+2320 integraltp
!94 U+25A0 filledbox
!95 U+2022 bullet
!96 U+221A radical
!97 U+2248 approxequal
!98 U+2264 lessequal
!99 U+2265 greaterequal
!9A U+00A0 space
!9B U+2321 integralbt
!9C U+00B0 degree
!9D U+00B2 twosuperior
!9E U+00B7 periodcentered
!9F U+00F7 divide
!A0 U+2550 SF430000
!A1 U+2551 SF240000
!A2 U+2552 SF510000
!A3 U+0451 afii10071
!A4 U+0454 afii10101
!A5 U+2554 SF390000
!A6 U+0456 afii10103
!A7 U+0457 afii10104
!A8 U+2557 SF250000
!A9 U+2558 SF500000
!AA U+2559 SF490000
!AB U+255A SF380000
!AC U+255B SF280000
!AD U+0491 afii10098
!AE U+255D SF260000
!AF U+255E SF360000
!B0 U+255F SF370000
!B1 U+2560 SF420000
!B2 U+2561 SF190000
!B3 U+0401 afii10023
!B4 U+0404 afii10053
!B5 U+2563 SF230000
!B6 U+0406 afii10055
!B7 U+0407 afii10056
!B8 U+2566 SF410000
!B9 U+2567 SF450000
!BA U+2568 SF460000
!BB U+2569 SF400000
!BC U+256A SF540000
!BD U+0490 afii10050
!BE U+256C SF440000
!BF U+00A9 copyright
!C0 U+044E afii10096
!C1 U+0430 afii10065
!C2 U+0431 afii10066
!C3 U+0446 afii10088
!C4 U+0434 afii10069
!C5 U+0435 afii10070
!C6 U+0444 afii10086
!C7 U+0433 afii10068
!C8 U+0445 afii10087
!C9 U+0438 afii10074
!CA U+0439 afii10075
!CB U+043A afii10076
!CC U+043B afii10077
!CD U+043C afii10078
!CE U+043D afii10079
!CF U+043E afii10080
!D0 U+043F afii10081
!D1 U+044F afii10097
!D2 U+0440 afii10082
!D3 U+0441 afii10083
!D4 U+0442 afii10084
!D5 U+0443 afii10085
!D6 U+0436 afii10072
!D7 U+0432 afii10067
!D8 U+044C afii10094
!D9 U+044B afii10093
!DA U+0437 afii10073
!DB U+0448 afii10090
!DC U+044D afii10095
!DD U+0449 afii10091
!DE U+0447 afii10089
!DF U+044A afii10092
!E0 U+042E afii10048
!E1 U+0410 afii10017
!E2 U+0411 afii10018
!E3 U+0426 afii10040
!E4 U+0414 afii10021
!E5 U+0415 afii10022
!E6 U+0424 afii10038
!E7 U+0413 afii10020
!E8 U+0425 afii10039
!E9 U+0418 afii10026
!EA U+0419 afii10027
!EB U+041A afii10028
!EC U+041B afii10029
!ED U+041C afii10030
!EE U+041D afii10031
!EF U+041E afii10032
!F0 U+041F afii10033
!F1 U+042F afii10049
!F2 U+0420 afii10034
!F3 U+0421 afii10035
!F4 U+0422 afii10036
!F5 U+0423 afii10037
!F6 U+0416 afii10024
!F7 U+0412 afii10019
!F8 U+042C afii10046
!F9 U+042B afii10045
!FA U+0417 afii10025
!FB U+0428 afii10042
!FC U+042D afii10047
!FD U+0429 afii10043
!FE U+0427 afii10041
!FF U+042A afii10044
@@ -0,0 +1,13 @@
fpdf_charwidths['symbol']={
'\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250,
'\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':713,'#':500,'$':549,'%':833,'&':778,'\'':439,'(':333,')':333,'*':500,'+':549,
',':250,'-':549,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':278,';':278,'<':549,'=':549,'>':549,'?':444,'@':549,'A':722,
'B':667,'C':722,'D':612,'E':611,'F':763,'G':603,'H':722,'I':333,'J':631,'K':722,'L':686,'M':889,'N':722,'O':722,'P':768,'Q':741,'R':556,'S':592,'T':611,'U':690,'V':439,'W':768,
'X':645,'Y':795,'Z':611,'[':333,'\\':863,']':333,'^':658,'_':500,'`':500,'a':631,'b':549,'c':549,'d':494,'e':439,'f':521,'g':411,'h':603,'i':329,'j':603,'k':549,'l':549,'m':576,
'n':521,'o':549,'p':549,'q':521,'r':549,'s':603,'t':439,'u':576,'v':713,'w':686,'x':493,'y':686,'z':494,'{':480,'|':200,'}':480,'~':549,'\x7f':0,'\x80':0,'\x81':0,'\x82':0,'\x83':0,
'\x84':0,'\x85':0,'\x86':0,'\x87':0,'\x88':0,'\x89':0,'\x8a':0,'\x8b':0,'\x8c':0,'\x8d':0,'\x8e':0,'\x8f':0,'\x90':0,'\x91':0,'\x92':0,'\x93':0,'\x94':0,'\x95':0,'\x96':0,'\x97':0,'\x98':0,'\x99':0,
'\x9a':0,'\x9b':0,'\x9c':0,'\x9d':0,'\x9e':0,'\x9f':0,'\xa0':750,'\xa1':620,'\xa2':247,'\xa3':549,'\xa4':167,'\xa5':713,'\xa6':500,'\xa7':753,'\xa8':753,'\xa9':753,'\xaa':753,'\xab':1042,'\xac':987,'\xad':603,'\xae':987,'\xaf':603,
'\xb0':400,'\xb1':549,'\xb2':411,'\xb3':549,'\xb4':549,'\xb5':713,'\xb6':494,'\xb7':460,'\xb8':549,'\xb9':549,'\xba':549,'\xbb':549,'\xbc':1000,'\xbd':603,'\xbe':1000,'\xbf':658,'\xc0':823,'\xc1':686,'\xc2':795,'\xc3':987,'\xc4':768,'\xc5':768,
'\xc6':823,'\xc7':768,'\xc8':768,'\xc9':713,'\xca':713,'\xcb':713,'\xcc':713,'\xcd':713,'\xce':713,'\xcf':713,'\xd0':768,'\xd1':713,'\xd2':790,'\xd3':790,'\xd4':890,'\xd5':823,'\xd6':549,'\xd7':250,'\xd8':713,'\xd9':603,'\xda':603,'\xdb':1042,
'\xdc':987,'\xdd':603,'\xde':987,'\xdf':603,'\xe0':494,'\xe1':329,'\xe2':790,'\xe3':790,'\xe4':786,'\xe5':713,'\xe6':384,'\xe7':384,'\xe8':384,'\xe9':384,'\xea':384,'\xeb':384,'\xec':494,'\xed':494,'\xee':494,'\xef':494,'\xf0':0,'\xf1':329,
'\xf2':274,'\xf3':686,'\xf4':686,'\xf5':686,'\xf6':384,'\xf7':384,'\xf8':384,'\xf9':384,'\xfa':384,'\xfb':384,'\xfc':494,'\xfd':494,'\xfe':494,'\xff':0}
@@ -0,0 +1,13 @@
fpdf_charwidths['times']={
'\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250,
'\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':408,'#':500,'$':500,'%':833,'&':778,'\'':180,'(':333,')':333,'*':500,'+':564,
',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':278,';':278,'<':564,'=':564,'>':564,'?':444,'@':921,'A':722,
'B':667,'C':667,'D':722,'E':611,'F':556,'G':722,'H':722,'I':333,'J':389,'K':722,'L':611,'M':889,'N':722,'O':722,'P':556,'Q':722,'R':667,'S':556,'T':611,'U':722,'V':722,'W':944,
'X':722,'Y':722,'Z':611,'[':333,'\\':278,']':333,'^':469,'_':500,'`':333,'a':444,'b':500,'c':444,'d':500,'e':444,'f':333,'g':500,'h':500,'i':278,'j':278,'k':500,'l':278,'m':778,
'n':500,'o':500,'p':500,'q':500,'r':333,'s':389,'t':278,'u':500,'v':500,'w':722,'x':500,'y':500,'z':444,'{':480,'|':200,'}':480,'~':541,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500,
'\x84':444,'\x85':1000,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':556,'\x8b':333,'\x8c':889,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':444,'\x94':444,'\x95':350,'\x96':500,'\x97':1000,'\x98':333,'\x99':980,
'\x9a':389,'\x9b':333,'\x9c':722,'\x9d':350,'\x9e':444,'\x9f':722,'\xa0':250,'\xa1':333,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':200,'\xa7':500,'\xa8':333,'\xa9':760,'\xaa':276,'\xab':500,'\xac':564,'\xad':333,'\xae':760,'\xaf':333,
'\xb0':400,'\xb1':564,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':500,'\xb6':453,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':310,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':444,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722,
'\xc6':889,'\xc7':667,'\xc8':611,'\xc9':611,'\xca':611,'\xcb':611,'\xcc':333,'\xcd':333,'\xce':333,'\xcf':333,'\xd0':722,'\xd1':722,'\xd2':722,'\xd3':722,'\xd4':722,'\xd5':722,'\xd6':722,'\xd7':564,'\xd8':722,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':722,'\xde':556,'\xdf':500,'\xe0':444,'\xe1':444,'\xe2':444,'\xe3':444,'\xe4':444,'\xe5':444,'\xe6':667,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':500,
'\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':564,'\xf8':500,'\xf9':500,'\xfa':500,'\xfb':500,'\xfc':500,'\xfd':500,'\xfe':500,'\xff':500}
@@ -0,0 +1,13 @@
fpdf_charwidths['timesB']={
'\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250,
'\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':555,'#':500,'$':500,'%':1000,'&':833,'\'':278,'(':333,')':333,'*':500,'+':570,
',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':333,';':333,'<':570,'=':570,'>':570,'?':500,'@':930,'A':722,
'B':667,'C':722,'D':722,'E':667,'F':611,'G':778,'H':778,'I':389,'J':500,'K':778,'L':667,'M':944,'N':722,'O':778,'P':611,'Q':778,'R':722,'S':556,'T':667,'U':722,'V':722,'W':1000,
'X':722,'Y':722,'Z':667,'[':333,'\\':278,']':333,'^':581,'_':500,'`':333,'a':500,'b':556,'c':444,'d':556,'e':444,'f':333,'g':500,'h':556,'i':278,'j':333,'k':556,'l':278,'m':833,
'n':556,'o':500,'p':556,'q':556,'r':444,'s':389,'t':333,'u':556,'v':500,'w':722,'x':500,'y':500,'z':444,'{':394,'|':220,'}':394,'~':520,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500,
'\x84':500,'\x85':1000,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':556,'\x8b':333,'\x8c':1000,'\x8d':350,'\x8e':667,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':500,'\x94':500,'\x95':350,'\x96':500,'\x97':1000,'\x98':333,'\x99':1000,
'\x9a':389,'\x9b':333,'\x9c':722,'\x9d':350,'\x9e':444,'\x9f':722,'\xa0':250,'\xa1':333,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':220,'\xa7':500,'\xa8':333,'\xa9':747,'\xaa':300,'\xab':500,'\xac':570,'\xad':333,'\xae':747,'\xaf':333,
'\xb0':400,'\xb1':570,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':556,'\xb6':540,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':330,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':500,'\xc0':722,'\xc1':722,'\xc2':722,'\xc3':722,'\xc4':722,'\xc5':722,
'\xc6':1000,'\xc7':722,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':389,'\xcd':389,'\xce':389,'\xcf':389,'\xd0':722,'\xd1':722,'\xd2':778,'\xd3':778,'\xd4':778,'\xd5':778,'\xd6':778,'\xd7':570,'\xd8':778,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':722,'\xde':611,'\xdf':556,'\xe0':500,'\xe1':500,'\xe2':500,'\xe3':500,'\xe4':500,'\xe5':500,'\xe6':722,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':556,
'\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':570,'\xf8':500,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':500,'\xfe':556,'\xff':500}
@@ -0,0 +1,13 @@
fpdf_charwidths['timesBI']={
'\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250,
'\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':389,'"':555,'#':500,'$':500,'%':833,'&':778,'\'':278,'(':333,')':333,'*':500,'+':570,
',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':333,';':333,'<':570,'=':570,'>':570,'?':500,'@':832,'A':667,
'B':667,'C':667,'D':722,'E':667,'F':667,'G':722,'H':778,'I':389,'J':500,'K':667,'L':611,'M':889,'N':722,'O':722,'P':611,'Q':722,'R':667,'S':556,'T':611,'U':722,'V':667,'W':889,
'X':667,'Y':611,'Z':611,'[':333,'\\':278,']':333,'^':570,'_':500,'`':333,'a':500,'b':500,'c':444,'d':500,'e':444,'f':333,'g':500,'h':556,'i':278,'j':278,'k':500,'l':278,'m':778,
'n':556,'o':500,'p':500,'q':500,'r':389,'s':389,'t':278,'u':556,'v':444,'w':667,'x':500,'y':444,'z':389,'{':348,'|':220,'}':348,'~':570,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500,
'\x84':500,'\x85':1000,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':556,'\x8b':333,'\x8c':944,'\x8d':350,'\x8e':611,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':500,'\x94':500,'\x95':350,'\x96':500,'\x97':1000,'\x98':333,'\x99':1000,
'\x9a':389,'\x9b':333,'\x9c':722,'\x9d':350,'\x9e':389,'\x9f':611,'\xa0':250,'\xa1':389,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':220,'\xa7':500,'\xa8':333,'\xa9':747,'\xaa':266,'\xab':500,'\xac':606,'\xad':333,'\xae':747,'\xaf':333,
'\xb0':400,'\xb1':570,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':576,'\xb6':500,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':300,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':500,'\xc0':667,'\xc1':667,'\xc2':667,'\xc3':667,'\xc4':667,'\xc5':667,
'\xc6':944,'\xc7':667,'\xc8':667,'\xc9':667,'\xca':667,'\xcb':667,'\xcc':389,'\xcd':389,'\xce':389,'\xcf':389,'\xd0':722,'\xd1':722,'\xd2':722,'\xd3':722,'\xd4':722,'\xd5':722,'\xd6':722,'\xd7':570,'\xd8':722,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':611,'\xde':611,'\xdf':500,'\xe0':500,'\xe1':500,'\xe2':500,'\xe3':500,'\xe4':500,'\xe5':500,'\xe6':722,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':556,
'\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':570,'\xf8':500,'\xf9':556,'\xfa':556,'\xfb':556,'\xfc':556,'\xfd':444,'\xfe':500,'\xff':444}
@@ -0,0 +1,13 @@
fpdf_charwidths['timesI']={
'\x00':250,'\x01':250,'\x02':250,'\x03':250,'\x04':250,'\x05':250,'\x06':250,'\x07':250,'\x08':250,'\t':250,'\n':250,'\x0b':250,'\x0c':250,'\r':250,'\x0e':250,'\x0f':250,'\x10':250,'\x11':250,'\x12':250,'\x13':250,'\x14':250,'\x15':250,
'\x16':250,'\x17':250,'\x18':250,'\x19':250,'\x1a':250,'\x1b':250,'\x1c':250,'\x1d':250,'\x1e':250,'\x1f':250,' ':250,'!':333,'"':420,'#':500,'$':500,'%':833,'&':778,'\'':214,'(':333,')':333,'*':500,'+':675,
',':250,'-':333,'.':250,'/':278,'0':500,'1':500,'2':500,'3':500,'4':500,'5':500,'6':500,'7':500,'8':500,'9':500,':':333,';':333,'<':675,'=':675,'>':675,'?':500,'@':920,'A':611,
'B':611,'C':667,'D':722,'E':611,'F':611,'G':722,'H':722,'I':333,'J':444,'K':667,'L':556,'M':833,'N':667,'O':722,'P':611,'Q':722,'R':611,'S':500,'T':556,'U':722,'V':611,'W':833,
'X':611,'Y':556,'Z':556,'[':389,'\\':278,']':389,'^':422,'_':500,'`':333,'a':500,'b':500,'c':444,'d':500,'e':444,'f':278,'g':500,'h':500,'i':278,'j':278,'k':444,'l':278,'m':722,
'n':500,'o':500,'p':500,'q':500,'r':389,'s':389,'t':278,'u':500,'v':444,'w':667,'x':444,'y':444,'z':389,'{':400,'|':275,'}':400,'~':541,'\x7f':350,'\x80':500,'\x81':350,'\x82':333,'\x83':500,
'\x84':556,'\x85':889,'\x86':500,'\x87':500,'\x88':333,'\x89':1000,'\x8a':500,'\x8b':333,'\x8c':944,'\x8d':350,'\x8e':556,'\x8f':350,'\x90':350,'\x91':333,'\x92':333,'\x93':556,'\x94':556,'\x95':350,'\x96':500,'\x97':889,'\x98':333,'\x99':980,
'\x9a':389,'\x9b':333,'\x9c':667,'\x9d':350,'\x9e':389,'\x9f':556,'\xa0':250,'\xa1':389,'\xa2':500,'\xa3':500,'\xa4':500,'\xa5':500,'\xa6':275,'\xa7':500,'\xa8':333,'\xa9':760,'\xaa':276,'\xab':500,'\xac':675,'\xad':333,'\xae':760,'\xaf':333,
'\xb0':400,'\xb1':675,'\xb2':300,'\xb3':300,'\xb4':333,'\xb5':500,'\xb6':523,'\xb7':250,'\xb8':333,'\xb9':300,'\xba':310,'\xbb':500,'\xbc':750,'\xbd':750,'\xbe':750,'\xbf':500,'\xc0':611,'\xc1':611,'\xc2':611,'\xc3':611,'\xc4':611,'\xc5':611,
'\xc6':889,'\xc7':667,'\xc8':611,'\xc9':611,'\xca':611,'\xcb':611,'\xcc':333,'\xcd':333,'\xce':333,'\xcf':333,'\xd0':722,'\xd1':667,'\xd2':722,'\xd3':722,'\xd4':722,'\xd5':722,'\xd6':722,'\xd7':675,'\xd8':722,'\xd9':722,'\xda':722,'\xdb':722,
'\xdc':722,'\xdd':556,'\xde':611,'\xdf':500,'\xe0':500,'\xe1':500,'\xe2':500,'\xe3':500,'\xe4':500,'\xe5':500,'\xe6':667,'\xe7':444,'\xe8':444,'\xe9':444,'\xea':444,'\xeb':444,'\xec':278,'\xed':278,'\xee':278,'\xef':278,'\xf0':500,'\xf1':500,
'\xf2':500,'\xf3':500,'\xf4':500,'\xf5':500,'\xf6':500,'\xf7':675,'\xf8':500,'\xf9':500,'\xfa':500,'\xfb':500,'\xfc':500,'\xfd':444,'\xfe':500,'\xff':444}
@@ -0,0 +1,15 @@
<?php
$fpdf_charwidths['zapfdingbats']=array(
'\x00'=>0,'\x01'=>0,'\x02'=>0,'\x03'=>0,'\x04'=>0,'\x05'=>0,'\x06'=>0,'\x07'=>0,'\x08'=>0,'\t'=>0,'\n'=>0,'\x0b'=>0,'\x0c'=>0,'\r'=>0,'\x0e'=>0,'\x0f'=>0,'\x10'=>0,'\x11'=>0,'\x12'=>0,'\x13'=>0,'\x14'=>0,'\x15'=>0,
'\x16'=>0,'\x17'=>0,'\x18'=>0,'\x19'=>0,'\x1a'=>0,'\x1b'=>0,'\x1c'=>0,'\x1d'=>0,'\x1e'=>0,'\x1f'=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939,
','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692,
'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776,
'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873,
'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,'\x7f'=>0,'\x80'=>390,'\x81'=>390,'\x82'=>317,'\x83'=>317,
'\x84'=>276,'\x85'=>276,'\x86'=>509,'\x87'=>509,'\x88'=>410,'\x89'=>410,'\x8a'=>234,'\x8b'=>234,'\x8c'=>334,'\x8d'=>334,'\x8e'=>0,'\x8f'=>0,'\x90'=>0,'\x91'=>0,'\x92'=>0,'\x93'=>0,'\x94'=>0,'\x95'=>0,'\x96'=>0,'\x97'=>0,'\x98'=>0,'\x99'=>0,
'\x9a'=>0,'\x9b'=>0,'\x9c'=>0,'\x9d'=>0,'\x9e'=>0,'\x9f'=>0,'\xa0'=>0,'\xa1'=>732,'\xa2'=>544,'\xa3'=>544,'\xa4'=>910,'\xa5'=>667,'\xa6'=>760,'\xa7'=>760,'\xa8'=>776,'\xa9'=>595,'\xaa'=>694,'\xab'=>626,'\xac'=>788,'\xad'=>788,'\xae'=>788,'\xaf'=>788,
'\xb0'=>788,'\xb1'=>788,'\xb2'=>788,'\xb3'=>788,'\xb4'=>788,'\xb5'=>788,'\xb6'=>788,'\xb7'=>788,'\xb8'=>788,'\xb9'=>788,'\xba'=>788,'\xbb'=>788,'\xbc'=>788,'\xbd'=>788,'\xbe'=>788,'\xbf'=>788,'\xc0'=>788,'\xc1'=>788,'\xc2'=>788,'\xc3'=>788,'\xc4'=>788,'\xc5'=>788,
'\xc6'=>788,'\xc7'=>788,'\xc8'=>788,'\xc9'=>788,'\xca'=>788,'\xcb'=>788,'\xcc'=>788,'\xcd'=>788,'\xce'=>788,'\xcf'=>788,'\xd0'=>788,'\xd1'=>788,'\xd2'=>788,'\xd3'=>788,'\xd4'=>894,'\xd5'=>838,'\xd6'=>1016,'\xd7'=>458,'\xd8'=>748,'\xd9'=>924,'\xda'=>748,'\xdb'=>918,
'\xdc'=>927,'\xdd'=>928,'\xde'=>928,'\xdf'=>834,'\xe0'=>873,'\xe1'=>828,'\xe2'=>924,'\xe3'=>924,'\xe4'=>917,'\xe5'=>930,'\xe6'=>931,'\xe7'=>463,'\xe8'=>883,'\xe9'=>836,'\xea'=>836,'\xeb'=>867,'\xec'=>867,'\xed'=>696,'\xee'=>696,'\xef'=>874,'\xf0'=>0,'\xf1'=>874,
'\xf2'=>760,'\xf3'=>946,'\xf4'=>771,'\xf5'=>865,'\xf6'=>771,'\xf7'=>888,'\xf8'=>967,'\xf9'=>888,'\xfa'=>831,'\xfb'=>873,'\xfc'=>927,'\xfd'=>970,'\xfe'=>918,'\xff'=>0);
?>
+340
View File
@@ -0,0 +1,340 @@
# ******************************************************************************
# * Utility to generate font definition files *
# * Version: 1.13 *
# * Date: 2004-12-31 *
# *******************************************************************************/
from PHPutils import *
import os, re, struct, zlib
FPDF_FONT_DIR=os.path.join(os.path.dirname(__file__),'font')
def ReadMap(enc):
#Read a map file
filename=os.path.join(FPDF_FONT_DIR,strtolower(enc)+'.map')
cc2gn={}
for l in file(filename):
if(l[0]=='!'):
e=re.split('[ \\t]+',l.rstrip())
cc=hexdec(substr(e[0],1))
gn=e[2]
cc2gn[cc]=gn
for i in xrange(0,256):
if not i in cc2gn:
cc2gn[i]='.notdef'
return cc2gn
def ReadAFM(filename,map):
#Read a font metric file
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'}
for l in file(filename):
e=l.rstrip().split()
if(count(e)<2):
continue
code=e[0]
param=e[1]
if(code=='C'):
#Character metrics
cc=int(e[1])
w=e[4]
gn=e[7]
if(substr(gn,-4)=='20AC'):
gn='Euro'
if gn in fix:
#Fix incorrect glyph name
for c,n in map.iteritems():
if(n==fix[gn]):
map[c]=gn
if(empty(map)):
#Symbolic font: use built-in encoding
widths[cc]=w
else:
widths[gn]=w
if(gn=='X'):
fm['CapXHeight']=e[13]
if(gn=='.notdef'):
fm['MissingWidth']=w
elif(code=='FontName'):
fm['FontName']=param
elif(code=='Weight'):
fm['Weight']=param
elif(code=='ItalicAngle'):
fm['ItalicAngle']=float(param)
elif(code=='Ascender'):
fm['Ascender']=int(param)
elif(code=='Descender'):
fm['Descender']=int(param)
elif(code=='UnderlineThickness'):
fm['UnderlineThickness']=int(param)
elif(code=='UnderlinePosition'):
fm['UnderlinePosition']=int(param)
elif(code=='IsFixedPitch'):
fm['IsFixedPitch']=(param=='true')
elif(code=='FontBBox'):
fm['FontBBox']=(e[1],e[2],e[3],e[4])
elif(code=='CapHeight'):
fm['CapHeight']=int(param)
elif(code=='StdVW'):
fm['StdVW']=int(param)
if not 'FontName' in fm:
die('FontName not found')
if(not empty(map)):
if(not '.notdef' in widths):
widths['.notdef']=600
if not 'Delta' in widths and 'increment' in widths:
widths['Delta']=widths['increment']
#Order widths according to map
for i in xrange(0,256):
if(not map[i] in widths):
print 'Warning: character '+map[i]+' is missing'
widths[i]=widths['.notdef']
else:
widths[i]=widths[map[i]]
fm['Widths']=widths
return fm
def MakeFontDescriptor(fm,symbolic):
#Ascent
asc=1000
if 'Ascender' in fm:
asc=fm['Ascender']
fd="{'Ascent':"+str(asc)
#Descent
desc=-200
if 'Descender' in fm:
desc=fm['Descender']
fd+=",'Descent':"+str(desc)
#CapHeight
if 'CapHeight' in fm:
ch=fm['CapHeight']
elif 'CapXHeight'in fm:
ch=fm['CapXHeight']
else:
ch=asc
fd+=",'CapHeight':"+str(ch)
#Flags
flags=0
if 'IsFixedPitch' in fm and fm['IsFixedPitch']:
flags+=1<<0
if(symbolic):
flags+=1<<2
if(not symbolic):
flags+=1<<5
if 'ItalicAngle' in fm and fm['ItalicAngle']!=0:
flags+=1<<6
fd+=",'Flags':"+str(flags)
#FontBBox
if('FontBBox' in fm):
fbb=fm['FontBBox']
else:
fbb=(0,des-100,1000,asc+100)
fd+=",'FontBBox':'["+str(fbb[0])+' '+str(fbb[1])+' '+str(fbb[2])+' '+str(fbb[3])+"]'"
#ItalicAngle
ia=0
if 'ItalicAngle' in fm and fm['ItalicAngle']:
ia=1
fd+=",'ItalicAngle':"+str(ia)
#StemV
if 'StdVW' in fm:
stemv=fm['StdVW']
elif('Weight' in fm and re.match('(bold|black)',fm['Weight'])):
stemv=120
else:
stemv=70
fd+=",'StemV':"+str(stemv)
#MissingWidth
if('MissingWidth' in fm):
fd+=",'MissingWidth':"+fm['MissingWidth']
fd+='}'
return fd
def MakeWidthArray(fm):
#Make character width array
s="{\n\t"
cw=fm['Widths']
for i in xrange(0,256):
if(chr(i)=="'"):
s+="'\\''"
elif(chr(i)=="\\"):
s+="'\\\\'"
elif(i>=32 and i<=126):
s+="'"+chr(i)+"'"
else:
s+="chr(%d)"%i
s+=':'+fm['Widths'][i]
if(i<255):
s+=','
if((i+1)%22==0):
s+="\n\t"
s+='}'
return s
def MakeFontEncoding(map):
#Build differences from reference encoding
ref=ReadMap('cp1252')
s=''
last=0
for i in xrange(32,256):
if(map[i]!=ref[i]):
if(i!=last+1):
s+=str(i)+' '
last=i
s+='/'+map[i]+' '
return s.rstrip()
def SaveToFile(filename,s,mode='t'):
f=file(filename,'w'+mode)
if(not f):
die('Can\'t write to file '+filename)
f.write(s)
f.close()
def ReadShort(f):
return struct.unpack('>H',f.read(2))[0]
def ReadLong(f):
return struct.unpack('>L',f.read(4))[0]
def CheckTTF(filename):
#Check if font license allows embedding
f=file(filename,'rb')
if(not f):
die('Error: Can\'t open '+filename)
#Extract number of tables
f.seek(4,SEEK_CUR)
nb=ReadShort(f)
f.seek(6,SEEK_CUR)
#Seek OS/2 table
found=0
for i in xrange(0,nb):
if(f.read(4)=='OS/2'):
found=1
break
f.seek(12,SEEK_CUR)
if(not found):
f.close()
return
f.seek(4,SEEK_CUR)
offset=ReadLong(f)
f.seek(offset,SEEK_SET)
#Extract fsType flags
f.seek(8,SEEK_CUR)
fsType=ReadShort(f)
rl=(fsType & 0x02)!=0
pp=(fsType & 0x04)!=0
e=(fsType & 0x08)!=0
f.close()
if(rl and not pp and not e):
print 'Warning: font license does not allow embedding'
# ******************************************************************************
# * fontfile : chemin du fichier TTF (ou chaine vide si pas d'incorporation) *
# * afmfile : chemin du fichier AFM *
# * enc : encodage (ou chaine vide si la police est symbolique) *
# * patch : patch optionnel pour l'encodage *
# * type : type de la police si $fontfile est vide *
# *******************************************************************************/
def MakeFont(fontfile,afmfile,enc='cp1252',patch={},type='TrueType'):
#Generate a font definition file
if(enc):
map=ReadMap(enc)
for cc,gn in patch.iteritems():
map[cc]=gn
else:
map=[]
if(not file_exists(afmfile)):
die('Error: AFM file not found: '+afmfile)
fm=ReadAFM(afmfile,map)
if(enc):
diff=MakeFontEncoding(map)
else:
diff=''
fd=MakeFontDescriptor(fm,empty(map))
#Find font type
if(fontfile):
ext=strtolower(substr(fontfile,-3))
if(ext=='ttf'):
type='TrueType'
elif(ext=='pfb'):
type='Type1'
else:
die('Error: unrecognized font file extension: '+ext)
else:
if(type!='TrueType' and type!='Type1'):
die('Error: incorrect font type: '+type)
#Start generation
s=''+"\n"
s+='type=\''+type+"'\n"
s+='name=\''+fm['FontName']+"'\n"
s+='desc='+fd+"\n"
if not 'UnderlinePosition' in fm:
fm['UnderlinePosition']=-100
if not 'UnderlineThickness' in fm:
fm['UnderlineThickness']=50
s+='up='+str(fm['UnderlinePosition'])+"\n"
s+='ut='+str(fm['UnderlineThickness'])+"\n"
w=MakeWidthArray(fm)
s+='cw='+str(w)+"\n"
s+='enc=\''+enc+"'\n"
s+='diff=\''+diff+"'\n"
base=substr(basename(afmfile),0,-4)
if(fontfile):
#Embedded font
if(not file_exists(fontfile)):
die('Error: font file not found: '+fontfile)
if(type=='TrueType'):
CheckTTF(fontfile)
f=file(fontfile,'rb')
if(not f):
die('Error: Can\'t open '+fontfile)
filecnt=f.read()
f.close()
if(type=='Type1'):
#Find first two sections and discard third one
header=(ord(filecnt[0])==128)
if(header):
#Strip first binary header
filecnt=substr(filecnt,6)
pos=strpos(filecnt,'eexec')
if(not pos):
die('Error: font file does not seem to be valid Type1')
size1=pos+6
if(header and ord(filecnt[size1])==128):
#Strip second binary header
filecnt=substr(filecnt,0,size1)+substr(filecnt,size1+6)
pos=strpos(filecnt,'00000000')
if(not pos):
die('Error: font file does not seem to be valid Type1')
size2=pos-size1
filecnt=substr(filecnt,0,size1+size2)
if(1):
cmp=base+'.z'
SaveToFile(cmp,zlib.compress(filecnt),'b')
s+='filename=\''+cmp+"'\n"
print 'Font file compressed ('+cmp+')'
else:
s+='filename=\''+basename(fontfile)+"'\n"
print 'Notice: font file could not be compressed (zlib extension not available)'
if(type=='Type1'):
s+='size1='+str(size1)+"\n"
s+='size2='+str(size2)+"\n"
else:
s+='originalsize='+str(filesize(fontfile))+"\n"
else:
#Not embedded font
s+='file='+"''\n"
s+="\n"
SaveToFile(base+'.py',s)
print 'Font definition file generated ('+base+'.py'+')'
if __name__ == '__main__':
MakeFont('font/calligra.ttf','font/calligra.afm')
MakeFont('font/a010013l.pfb','font/a010013l.afm')
@@ -0,0 +1,15 @@
# Updates the unique, final XREF table
# Usage: Fix1 in.pdf [out.pdf]
import sys
from PDFRUUtils import *
def Fix1(inPDF, outPDF):
buf=UpdateStreamLengths(file(inPDF,'rb').read())
newbuf=ReplaceXRefsTable(buf, BuildXRefsTable(FindXRefs(buf)))
file(outPDF,'wb').write(newbuf)
if __name__=='__main__':
inPDF=outPDF=sys.argv[1]
if len(sys.argv) > 2:
outPDF=sys.argv[2]
Fix1(inPDF, outPDF)
@@ -0,0 +1,12 @@
# Decompress streams, to edit file
# Usage: Fix2 in.pdf [out.pdf]
import sys
from PDFRUUtils import *
inPDF=outPDF=sys.argv[1]
if len(sys.argv) > 2:
outPDF=sys.argv[2]
buf=DecompressStreams(file(inPDF,'rb').read())
newbuf=ReplaceXRefsTable(buf, BuildXRefsTable(FindXRefs(buf)))
file(outPDF,'wb').write(newbuf)
@@ -0,0 +1,12 @@
# Compress streams
# Usage: Fix3 in.pdf [out.pdf]
import sys
from PDFRUUtils import *
inPDF=outPDF=sys.argv[1]
if len(sys.argv) > 2:
outPDF=sys.argv[2]
buf=CompressStreams(file(inPDF,'rb').read())
newbuf=ReplaceXRefsTable(buf, BuildXRefsTable(FindXRefs(buf)))
file(outPDF,'wb').write(newbuf)
@@ -0,0 +1,94 @@
# Utilities to Re-Use PDF files generated by FPDF for Python
# (Probably, more memory-wasting than it should)
import re, zlib
def UpdateStreamLengths(pdf):
"Updates the streams /Length in a modified, uncompressed PDF file"
L, Lengths=[],{}
for m in re.finditer('<</Length (\d+)(>>)\nstream\n(.+?)\nendstream',pdf,re.S):
oldlen, newlen = m.group(1), len(m.group(3))
if newlen!=oldlen:
L+=[m.start(1)]
# length_start=old_len, next_content
Lengths[str(m.start(1))]=(str(newlen), m.start(2))
if not L:
return pdf
newpdf=''
i=0
for j in L:
newpdf+=pdf[i:j]
i=Lengths[str(j)][1]
newpdf+=Lengths[str(j)][0]
newpdf+=pdf[i:]
return newpdf
def FindXRefs(pdf):
"Returns a dictionary of {PDF object:position} found"
XRefs={}
for m in re.finditer('^(\d+) 0 obj',pdf,re.M):
XRefs[int(m.group(1))] = m.start()
return XRefs
def BuildXRefsTable(XRefs):
"Constructs the PDF xref table from a dictionary returned by FindXRefs"
s='xref\n'
s+='0 '+str(len(XRefs)+1)+'\n'
s+='0000000000 65535 f \n'
for i in xrange(1,len(XRefs)+1):
s+='%010d 00000 n \n'%XRefs[i]
return s
def ReplaceXRefsTable(pdf, newtable):
"Replaces the unique XRef table in a PDF file with the updated one"
startxref=pdf.find('xref')
newbuf=pdf[:startxref] + newtable + re.sub('\d+(?=\n%%EOF)',str(startxref), pdf[pdf.find('trailer'):])
return newbuf
def DecompressStreams(pdf):
"Decompresses all deflated streams and returns the updated PDF file"
L, streams=[], {}
for m in re.finditer('^<</Filter /FlateDecode /Length (\d+)>>\n(stream)',pdf,re.M):
start=m.start(2)+7
# stream_start: filter_start, stream_end
streams[start]=(m.start(), start+int(m.group(1)))
L+=[start]
delta=0
for i in L:
start=i+delta
end=streams[i][1]+delta
stream=zlib.decompress(pdf[start:end])
before=len(pdf)
pdf=pdf.replace(pdf[streams[i][0]+delta:end], '<</Length %d>>\nstream\n'%len(stream)+stream)
delta+=len(pdf)-before
return pdf
def CompressStreams(pdf):
"Compresses all plain streams and returns the updated PDF file"
L, streams=[], {}
for m in re.finditer('^<</Length (\d+)>>\n(stream)',pdf,re.M):
start=m.start(2)+7
# stream_start: filter_start, stream_end
streams[start]=(m.start(), start+int(m.group(1)))
L+=[start]
delta=0
for i in L:
start=i+delta
end=streams[i][1]+delta
stream=zlib.compress(pdf[start:end])
before=len(pdf)
pdf=pdf.replace(pdf[streams[i][0]+delta:end], '<</Filter /FlateDecode /Length %d>>\nstream\n'%len(stream)+stream)
delta+=len(pdf)-before
return pdf
if __name__=='__main__':
buf=file('b.pdf','rb').read()
newbuf=DecompressStreams(buf)
newbuf=ReplaceXRefsTable(newbuf, BuildXRefsTable(FindXRefs(newbuf)))
newbuf=UpdateStreamLengths(newbuf) # does nothing here: test purpose only!
file('b0.pdf','wb').write(newbuf)
newbuf=CompressStreams(newbuf)
newbuf=ReplaceXRefsTable(newbuf, BuildXRefsTable(FindXRefs(newbuf)))
file('b1.pdf','wb').write(newbuf) #should be identical
@@ -0,0 +1,85 @@
# -*- coding: iso-8859-1 -*-
import sys,os
from pyfpdf import FPDF
class Form:
def __init__(self, infile):
keys = ('name','type','x1','y1','x2','y2','font','size',
'bold','italic','underline','foreground','background',
'align','text','priority')
# parse form format file and create fields dict
self.fields = {}
for linea in open(infile).readlines():
kargs = {}
for i,v in enumerate(linea.split(";")):
if not v.startswith("'"):
v = v.replace(",",".")
else:
v = v#.decode('latin1')
if v=='':
v = None
else:
v = eval(v.strip())
kargs[keys[i]] = v
self.fields[kargs['name'].lower()] = kargs
self.handlers = {'T': self.text, 'L': self.line, 'I': self.image,
'B': self.rect, 'BC': self.barcode}
def set(self, name, value):
if name.lower() in self.fields:
self.fields[name.lower()]['text'] = value
def render(self, outfile):
pdf = FPDF()
pdf.add_page();
pdf.set_font('Arial','B',16);
for field in self.fields.values():
self.handlers[field['type'].upper()](pdf, **field)
pdf.output(outfile,"F")
def text(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=10,
bold=False, italic=False, underline=False, align="", *args, **kwargs):
if text:
font = font.strip().lower()
if font == 'arial black':
font = 'arial'
style = ""
if bold: style += "B"
if italic: style += "I"
if underline: style += "U"
align = {'I':'L','D':'R','C':'C','':'',None:None}[align]
pdf.set_font(font,style,size)
##m_k = 72 / 2.54
##h = (size/m_k)
pdf.set_xy(x1,y1)
pdf.cell(w=x2-x1,h=y2-y1,txt=text,border=0,ln=0,align=align)
#pdf.Text(x=x1,y=y1,txt=text)
def line(self, pdf, x1=0, y1=0, x2=0, y2=0, size=0, *args, **kwargs):
pdf.set_line_width(size)
pdf.line(x1, y1, x2, y2)
def rect(self, pdf, x1=0, y1=0, x2=0, y2=0, size=0, *args, **kwargs):
pdf.set_line_width(size)
pdf.rect(x1, y1, x2-x1, y2-y1)
def image(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', *args,**kwargs):
pdf.image(text,x1,y1,w=x2-x1,h=y2-y1,type='',link='')
def barcode(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=1,
*args, **kwargs):
font = font.lower().strip()
if font == 'interleaved 2of5 nt':
pdf.interleaved2of5(text,x1,y1,w=size)
if __name__ == "__main__":
f = Form("invoice.csv")
f.set("EMPRESA","Saraza")
f.set("logo","logo.png")
f.render("./invoice.pdf")
if sys.platform.startswith("linux"):
os.system("evince ./invoice.pdf")
else:
os.system("./invoice.pdf")
@@ -0,0 +1,136 @@
# -*- coding: iso-8859-1 -*-
import os
from pyfpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_font('helvetica', '', 13.0)
pdf.set_xy(105.0, 8.0)
pdf.cell(ln=0, h=22.0, align='C', w=75.0, txt='Sample Invoice', border=0)
pdf.set_line_width(0.0)
pdf.rect(15.0, 15.0, 170.0, 245.0)
pdf.set_line_width(0.0)
pdf.rect(95.0, 15.0, 10.0, 10.0)
pdf.image('../tutorial/logo.png', 20.0, 17.0, link='', type='', w=13.0, h=13.0)
pdf.set_font('arial', 'B', 16.0)
pdf.set_xy(95.0, 18.0)
pdf.cell(ln=0, h=2.0, align='C', w=10.0, txt='X', border=0)
pdf.set_font('arial', '', 8.0)
pdf.set_xy(105.0, 21.0)
pdf.cell(ln=0, h=4.0, align='C', w=75.0, txt='Original', border=0)
pdf.set_font('arial', 'B', 7.0)
pdf.set_xy(95.0, 21.5)
pdf.cell(ln=0, h=4.5, align='C', w=10.0, txt='COD.00', border=0)
pdf.set_line_width(0.0)
pdf.line(100.0, 25.0, 100.0, 57.0)
pdf.set_font('arial', 'B', 14.0)
pdf.set_xy(125.0, 25.5)
pdf.cell(ln=0, h=9.5, align='L', w=60.0, txt='00000001', border=0)
pdf.set_xy(115.0, 27.5)
pdf.cell(ln=0, h=5.5, align='L', w=10.0, txt='N\xba: ', border=0)
pdf.set_font('arial', 'B', 12.0)
pdf.set_xy(17.0, 32.5)
pdf.cell(ln=0, h=5.0, align='L', w=98.0, txt='COMPANY', border=0)
pdf.set_font('arial', '', 12.0)
pdf.set_xy(115.0, 33.0)
pdf.cell(ln=0, h=7.0, align='L', w=60.0, txt='Date:', border=0)
pdf.set_xy(135.0, 33.0)
pdf.cell(ln=0, h=7.0, align='L', w=40.0, txt='19/02/2009', border=0)
pdf.set_line_width(0.0)
pdf.line(15.0, 57.0, 185.0, 57.0)
pdf.set_font('times', '', 10.0)
pdf.set_xy(17.0, 59.0)
pdf.cell(ln=0, h=6.0, align='L', w=13.0, txt='Mr.(s):', border=0)
pdf.set_xy(35.0, 59.0)
pdf.cell(ln=0, h=6.0, align='L', w=140.0, txt='Mariano Reingart', border=0)
pdf.set_xy(17.0, 64.0)
pdf.cell(ln=0, h=6.0, align='L', w=18.0, txt='Address:', border=0)
pdf.set_xy(35.0, 64.0)
pdf.cell(ln=0, h=6.0, align='L', w=125.0, txt='Siempreviva 12345', border=0)
pdf.set_xy(17.0, 69.0)
pdf.cell(ln=0, h=6.0, align='L', w=18.0, txt='Tel\xe9fono:', border=0)
pdf.set_xy(35.0, 69.0)
pdf.cell(ln=0, h=6.0, align='L', w=80.0, txt='+1-5555-5555', border=0)
pdf.set_xy(115.0, 69.0)
pdf.cell(ln=0, h=6.0, align='L', w=18.0, txt='City:', border=0)
pdf.set_xy(133.0, 69.0)
pdf.cell(ln=0, h=6.0, align='L', w=42.0, txt='Springfield', border=0)
pdf.set_line_width(0.0)
pdf.line(15.0, 77.0, 185.0, 77.0)
pdf.set_xy(17.0, 80.0)
pdf.cell(ln=0, h=5.0, align='L', w=15.0, txt='VAT:', border=0)
pdf.set_xy(35.0, 80.0)
pdf.cell(ln=0, h=5.0, align='L', w=70.0, txt='Responsable', border=0)
pdf.set_xy(115.0, 80.0)
pdf.cell(ln=0, h=5.0, align='L', w=20.0, txt='Tax ID:', border=0)
pdf.set_xy(135.0, 80.0)
pdf.cell(ln=0, h=5.0, align='L', w=40.0, txt='10-12345678-9', border=0)
pdf.set_line_width(0.0)
pdf.line(15.0, 88.0, 185.0, 88.0)
pdf.set_xy(17.0, 90.0)
pdf.cell(ln=0, h=5.0, align='L', w=48.0, txt='Due Date:', border=0)
pdf.set_xy(65.0, 90.0)
pdf.cell(ln=0, h=5.0, align='L', w=20.0, txt='23/07/1978', border=0)
pdf.set_xy(92.0, 90.0)
pdf.cell(ln=0, h=5.0, align='L', w=43.0, txt='Period', border=0)
pdf.set_xy(125.0, 90.0)
pdf.cell(ln=0, h=5.0, align='L', w=20.0, txt='01/01/2009', border=0)
pdf.set_xy(150.0, 90.0)
pdf.cell(ln=0, h=5.0, align='L', w=20.0, txt='31/01/2009', border=0)
pdf.set_line_width(0.0)
pdf.line(15.0, 95.0, 185.0, 95.0)
pdf.set_line_width(0.0)
pdf.line(155.0, 95.0, 155.0, 230.0)
pdf.set_xy(20.0, 97.0)
pdf.cell(ln=0, h=5.0, align='L', w=125.0, txt='Description', border=0)
pdf.set_xy(160.0, 97.0)
pdf.cell(ln=0, h=5.0, align='R', w=20.0, txt='Amount', border=0)
pdf.set_line_width(0.0)
pdf.line(15.0, 102.0, 185.0, 102.0)
pdf.set_xy(20.0, 103.0)
pdf.cell(ln=0, h=7.0, align='L', w=125.0, txt='Esto es una prueba y no es v\xe1lido como factura', border=0)
pdf.set_xy(160.0, 103.0)
pdf.cell(ln=0, h=7.0, align='R', w=20.0, txt='100,00', border=0)
pdf.set_line_width(0.0)
pdf.line(15.0, 230.0, 185.0, 230.0)
pdf.set_xy(20.0, 233.0)
pdf.cell(ln=0, h=5.0, align='L', w=95.0, txt='CAE N\xba', border=0)
pdf.set_xy(45.0, 233.0)
pdf.cell(ln=0, h=5.0, align='L', w=30.0, txt='01234567890', border=0)
pdf.set_font('arial', '', 12.0)
pdf.set_xy(105.0, 234.0)
pdf.cell(ln=0, h=9.0, align='R', w=45.0, txt='Subtotal:', border=0)
pdf.set_font('arial', 'B', 12.0)
pdf.set_xy(145.0, 234.0)
pdf.cell(ln=0, h=9.0, align='R', w=33.0, txt='100,00', border=0)
pdf.set_font('arial', '', 10.0)
pdf.set_xy(20.0, 238.0)
pdf.cell(ln=0, h=5.0, align='L', w=95.0, txt='Fecha Vto. CAE:', border=0)
pdf.set_xy(55.0, 238.0)
pdf.cell(ln=0, h=5.0, align='L', w=30.0, txt='19/02/2009', border=0)
pdf.set_font('arial', '', 12.0)
pdf.set_xy(125.0, 241.0)
pdf.cell(ln=0, h=9.0, align='R', w=25.0, txt='VAT 21%:', border=0)
pdf.set_font('arial', 'B', 12.0)
pdf.set_xy(145.0, 241.0)
pdf.cell(ln=0, h=9.0, align='R', w=33.0, txt='21,00', border=0)
pdf.interleaved2of5('012345678905', 20.0, 243.5, w=0.75)
pdf.set_font('arial', 'B', 12.0)
pdf.set_xy(105.0, 251.0)
pdf.cell(ln=0, h=9.0, align='R', w=73.0, txt='121,00', border=0)
pdf.set_font('arial', '', 12.0)
pdf.set_xy(125.0, 251.0)
pdf.cell(ln=0, h=9.0, align='R', w=25.0, txt='Total:', border=0)
pdf.set_line_width(0.0)
pdf.rect(155.0, 252.0, 25.0, 7.0)
pdf.set_font('courier', '', 10.0)
pdf.set_xy(20.0, 253.0)
pdf.cell(ln=0, h=7.0, align='L', w=120.0, txt='012345678905', border=0)
pdf.output('./invoice.pdf', 'F')
import sys
if sys.platform.startswith("linux"):
os.system("evince ./invoice.pdf")
else:
os.system("./invoice.pdf")
@@ -0,0 +1,26 @@
# -*- coding: iso-8859-1 -*-
import sys,os
sys.path.append("..")
import pyfpdf
customer = {'name':'John Doe','tax_id':'00-0000000-0','vat':True}
items = [
{'qty':12,'description':'Eggs','price':1.00},
{'qty':20,'description':'Spam','price':3.00},
{'qty':1,'description':'Varios','price':0.50},
]
pdf = pyfpdf.FPDF()
pdf.add_page();
pdf.set_font('Arial','B',16);
for line in open("simple-csv-invoice.txt").readlines():
print line
args = eval(line.strip())
pdf.text(x=args[0],y=args[1],txt=str(args[2]).decode('latin1'));
pdf.output(r"./invoice.pdf","F")
import sys
if sys.platform.startswith("linux"):
os.system("evince ./invoice.pdf")
else:
os.system("./invoice.pdf")
@@ -0,0 +1,20 @@
100, 10, 'INVOICE'
10, 46, 'VAT:'
53, 46, customer['vat'] and 'X' or ''
63, 46, not customer['vat'] and 'X' or ''
10, 20, customer['name']
100, 20, customer['tax_id']
10, 60, items[0]['qty']
40, 60, items[0]['description']
150, 60, items[0]['price']
190, 60, items[0]['qty']*items[0]['price']
10, 65, items[1]['qty']
40, 65, items[1]['description']
150, 65, items[1]['price']
190, 65, items[1]['qty']*items[1]['price']
10, 70, items[2]['qty']
40, 70, items[2]['description']
150, 70, items[2]['price']
190, 70, items[2]['qty']*items[2]['price']
100,100, 'Total:'
120,100, sum([item['qty']*item['price'] for item in items])
+210
View File
@@ -0,0 +1,210 @@
'barcode';'BC';20.30;246.80;140.30;254.30;'Interleaved 2of5 NT';0.75;0;0;0;0;0;'I';'200000000001000159053338016581200810081';3
'barcode_readable';'T';19.30;253.30;140.30;260.30;'Arial';10.00;0;0;0;0;0;'I';'200000000001000159053338016581200810081';3
'box';'B';15.30;15.30;185.30;260.30;'Arial';0.00;0;0;0;0;0;'I';None;0
'box_x';'B';95.30;15.30;105.30;25.30;'Arial';0.00;1;0;0;0;0;'I';None;2
'company_footer1';'T';115.30;45.30;175.30;50.30;'Arial';10.00;0;0;0;0;0;'I';'Company footer 1';2
'company_footer2';'T';115.30;50.30;175.30;55.30;'Arial';10.00;0;0;0;0;0;'I';'Company footer 2';2
'company_header1';'T';17.30;40.30;85.30;45.30;'Arial';10.00;0;0;0;0;0;'I';'Company header 1';2
'company_header2';'T';17.30;45.30;85.30;50.30;'Arial';10.00;0;0;0;0;0;'I';'Company header 2';2
'company_logo';'I';20.30;17.30;55.70;30.30;None;0.00;0;0;0;0;0;'I';'tutorial/logo.png';2
'company_name';'T';17.30;32.80;98.30;37.80;'Arial';12.00;1;0;0;0;0;'I';'Company name';2
'currency';'T';42.30;90.30;67.30;94.30;'Arial';10.00;0;0;0;0;65535;'I';'U.S.D.';0
'currency_l';'T';17.30;90.30;65.30;94.30;'Arial';10.00;0;0;0;0;0;'I';'Currency:';0
'customer_address';'T';35.30;64.30;160.30;70.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_address_l';'t';17.30;64.30;35.30;70.30;'Arial';10.00;0;0;0;0;0;'I';'Address:';0
'customer_city';'T';133.30;69.30;175.30;75.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_city_l';'T';115.30;69.30;133.30;75.30;'Arial';10.00;0;0;0;0;0;'I';'City:';0
'customer_country';'T';133.30;73.30;175.30;79.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_name';'T';35.30;59.30;175.30;65.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_name_l';'T';17.30;59.30;30.30;65.30;'Arial';10.00;0;0;0;0;0;'I';'Bill to:';0
'customer_phone';'T';35.30;69.30;115.30;75.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_phone_l';'T';17.30;69.30;35.30;75.30;'Arial';10.00;0;0;0;0;0;'I';'Phone/Fax:';0
'customer_taxid';'T';135.30;74.30;175.30;79.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_taxid_l';'T';115.30;74.30;135.30;79.30;'Arial';10.00;0;0;0;0;0;'I';'Tax ID:';0
'customer_vat';'T';35.30;74.30;105.30;79.30;'Arial';10.00;0;0;0;0;0;'I';None;0
'customer_vat_l';'T';17.30;74.30;32.30;79.30;'Arial';10.00;0;0;0;0;0;'I';'VAT:';0
'document_copy';'T';105.30;21.30;140.30;25.30;'Arial';8.00;0;0;0;0;0;'C';'Original';2
'document_label';'T';105.30;15.90;180.30;21.10;'Arial Black';13.00;0;0;0;0;0;'C';'INVOICE';2
'document_number';'T';115.30;27.80;125.30;33.30;'Arial';14.00;1;0;0;0;0;'I';'N\xba: ';2
'document_type';'T';95.30;16.10;105.30;24.30;'Arial';16.00;1;0;0;0;0;'C';'X';2
'due_date';'T';65.30;82.30;85.30;86.30;'Arial';10.00;0;0;0;0;65535;'I';'31/12/2009';0
'due_date_l';'T';17.30;82.30;65.30;86.30;'Arial';10.00;0;0;0;0;0;'I';'Due Date:';0
'issue_date';'T';135.30;33.30;175.30;40.30;'Arial';12.00;0;0;0;0;65535;'I';None;0
'issue_date_l';'T';115.30;33.30;175.30;40.30;'Arial';12.00;0;0;0;0;0;'I';'Date:';0
'item_amount';'T';160.30;97.30;185.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Amount';0
'item_amount01';'T';160.30;103.30;183.30;108.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount02';'T';160.30;108.30;183.30;113.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount03';'T';160.30;113.30;183.30;118.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount04';'T';160.30;118.30;183.30;123.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount05';'T';160.30;123.30;183.30;128.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount06';'T';160.30;128.30;183.30;133.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount07';'T';160.30;133.30;183.30;138.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount08';'T';160.30;138.30;183.30;143.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount09';'T';160.30;143.30;183.30;148.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount10';'T';160.30;148.30;183.30;153.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount11';'T';160.30;153.30;183.30;158.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount12';'T';160.30;158.30;183.30;163.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount13';'T';160.30;163.30;183.30;168.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount14';'T';160.30;168.30;183.30;173.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount15';'T';160.30;173.30;183.30;178.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount16';'T';160.30;178.30;183.30;183.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount17';'T';160.30;183.30;183.30;188.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount18';'T';160.30;188.30;183.30;193.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount19';'T';160.30;193.30;183.30;198.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount20';'T';160.30;198.30;183.30;203.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount21';'T';160.30;203.30;183.30;208.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount22';'T';160.30;208.30;183.30;213.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount23';'T';160.30;213.30;183.30;218.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount24';'T';160.30;218.30;183.30;223.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount25';'T';160.30;223.30;183.30;228.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_code';'T';30.30;97.30;45.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Cod.';0
'item_code01';'T';30.30;103.30;43.30;108.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code02';'T';30.30;108.30;43.30;113.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code03';'T';30.30;113.30;43.30;118.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code04';'T';30.30;118.30;43.30;123.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code05';'T';30.30;123.30;43.30;128.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code06';'T';30.30;128.30;43.30;133.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code07';'T';30.30;133.30;43.30;138.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code08';'T';30.30;138.30;43.30;143.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code09';'T';30.30;143.30;43.30;148.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code10';'T';30.30;148.30;43.30;153.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code11';'T';30.30;153.30;43.30;158.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code12';'T';30.30;158.30;43.30;163.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code13';'T';30.30;163.30;43.30;168.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code14';'T';30.30;168.30;43.30;173.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code15';'T';30.30;173.30;43.30;178.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code16';'T';30.30;178.30;43.30;183.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code17';'T';30.30;183.30;43.30;188.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code18';'T';30.30;188.30;43.30;193.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code19';'T';30.30;193.30;43.30;198.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code20';'T';30.30;198.30;43.30;203.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code21';'T';30.30;203.30;43.30;208.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code22';'T';30.30;208.30;43.30;213.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code23';'T';30.30;213.30;43.30;218.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code24';'T';30.30;218.30;43.30;223.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code25';'T';30.30;223.30;43.30;228.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description';'T';45.30;97.30;140.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Description';0
'item_description01';'T';47.30;103.30;138.30;108.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description02';'T';47.30;108.30;138.30;113.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description03';'T';47.30;113.30;138.30;118.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description04';'T';47.30;118.30;138.30;123.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description05';'T';47.30;123.30;138.30;128.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description06';'T';47.30;128.30;138.30;133.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description07';'T';47.30;133.30;138.30;138.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description08';'T';47.30;138.30;138.30;143.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description09';'T';47.30;143.30;138.30;148.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description10';'T';47.30;148.30;138.30;153.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description11';'T';47.30;153.30;138.30;158.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description12';'T';47.30;158.30;138.30;163.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description13';'T';47.30;163.30;138.30;168.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description14';'T';47.30;168.30;138.30;173.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description15';'T';47.30;173.30;138.30;178.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description16';'T';47.30;178.30;138.30;183.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description17';'T';47.30;183.30;138.30;188.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description18';'T';47.30;188.30;138.30;193.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description19';'T';47.30;193.30;138.30;198.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description20';'T';47.30;198.30;138.30;203.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description21';'T';47.30;203.30;138.30;208.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description22';'T';47.30;208.30;138.30;213.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description23';'T';47.30;213.30;138.30;218.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description24';'T';47.30;218.30;138.30;223.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description25';'T';47.30;223.30;138.30;228.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_price';'T';140.30;97.30;160.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Price';0
'item_price01';'T';140.30;103.30;158.30;108.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price02';'T';140.30;108.30;158.30;113.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price03';'T';140.30;113.30;158.30;118.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price04';'T';140.30;118.30;158.30;123.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price05';'T';140.30;123.30;158.30;128.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price06';'T';140.30;128.30;158.30;133.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price07';'T';140.30;133.30;158.30;138.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price08';'T';140.30;138.30;158.30;143.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price09';'T';140.30;143.30;158.30;148.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price10';'T';140.30;148.30;158.30;153.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price11';'T';140.30;153.30;158.30;158.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price12';'T';140.30;158.30;158.30;163.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price13';'T';140.30;163.30;158.30;168.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price14';'T';140.30;168.30;158.30;173.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price15';'T';140.30;173.30;158.30;178.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price16';'T';140.30;178.30;158.30;183.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price17';'T';140.30;183.30;158.30;188.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price18';'T';140.30;188.30;158.30;193.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price19';'T';140.30;193.30;158.30;198.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price20';'T';140.30;198.30;158.30;203.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price21';'T';140.30;203.30;158.30;208.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price22';'T';140.30;208.30;158.30;213.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price23';'T';140.30;213.30;158.30;218.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price24';'T';140.30;218.30;158.30;223.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price25';'T';140.30;223.30;158.30;228.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity';'T';15.30;97.30;30.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Qty.';0
'item_quantity01';'T';15.30;103.30;25.30;108.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity02';'T';15.30;108.30;25.30;113.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity03';'T';15.30;113.30;25.30;118.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity04';'T';15.30;118.30;25.30;123.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity05';'T';15.30;123.30;25.30;128.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity06';'T';15.30;128.30;25.30;133.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity07';'T';15.30;133.30;25.30;138.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity08';'T';15.30;138.30;25.30;143.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity09';'T';15.30;143.30;25.30;148.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity10';'T';15.30;148.30;25.30;153.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity11';'T';15.30;153.30;25.30;158.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity12';'T';15.30;158.30;25.30;163.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity13';'T';15.30;163.30;25.30;168.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity14';'T';15.30;168.30;25.30;173.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity15';'T';15.30;173.30;25.30;178.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity16';'T';15.30;178.30;25.30;183.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity17';'T';15.30;183.30;25.30;188.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity18';'T';15.30;188.30;25.30;193.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity19';'T';15.30;193.30;25.30;198.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity20';'T';15.30;198.30;25.30;203.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity21';'T';15.30;203.30;25.30;208.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity22';'T';15.30;208.30;25.30;213.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity23';'T';15.30;213.30;25.30;218.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity24';'T';15.30;218.30;25.30;223.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity25';'T';15.30;223.30;25.30;228.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_unit01';'T';24.30;103.30;30.30;108.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit02';'T';24.30;108.30;30.30;113.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit03';'T';24.30;113.30;30.30;118.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit04';'T';24.30;118.30;30.30;123.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit05';'T';24.30;123.30;30.30;128.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit06';'T';24.30;128.30;30.30;133.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit07';'T';24.30;133.30;30.30;138.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit08';'T';24.30;138.30;30.30;143.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit09';'T';24.30;143.30;30.30;148.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit10';'T';24.30;148.30;30.30;153.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit11';'T';24.30;153.30;30.30;158.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit12';'T';24.30;158.30;30.30;163.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit13';'T';24.30;163.30;30.30;168.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit14';'T';24.30;168.30;30.30;173.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit15';'T';24.30;173.30;30.30;178.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit16';'T';24.30;178.30;30.30;183.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit17';'T';24.30;183.30;30.30;188.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit18';'T';24.30;188.30;30.30;193.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit19';'T';24.30;193.30;30.30;198.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit20';'T';24.30;198.30;30.30;203.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit21';'T';24.30;203.30;30.30;208.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit22';'T';24.30;208.30;30.30;213.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit23';'T';24.30;213.30;30.30;218.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit24';'T';24.30;218.30;30.30;223.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit25';'T';24.30;223.30;30.30;228.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'line1';'L';100.30;25.30;100.30;57.30;'Arial';0;0;0;0;0;0;'I';None;3
'line2';'L';15.30;57.30;185.30;57.30;None;0.00;0;0;0;0;0;'I';None;3
'line3';'L';15.30;80.30;185.30;80.30;None;0.00;0;0;0;0;0;'I';None;3
'line5';'L';15.30;95.30;185.30;95.30;None;0.00;0;0;0;0;0;'I';None;3
'line6';'L';15.30;230.30;185.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line9';'L';15.30;102.30;185.30;102.30;None;0.00;0;0;0;0;0;'I';None;0
'line_cod';'L';45.30;95.30;45.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line_desc';'L';140.30;95.30;140.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line_price';'L';160.30;95.30;160.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line_qty';'L';30.30;95.30;30.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'net';'T';145.30;234.30;178.30;243.30;'Arial';12.00;1;0;0;0;65535;'D';None;0
'net_l';'T';105.30;234.30;150.30;243.30;'Arial';12.00;0;0;0;0;0;'D';'NET:';0
'number';'T';125.30;25.80;185.30;35.30;'Arial';14.00;1;0;0;0;0;'I';'0000-00000000';2
'page';'T';140.30;21.30;180.30;25.30;'Arial';8.00;0;0;0;0;0;'C';'Page';2
'payment';'T';45.30;86.30;150.30;90.30;'Arial';10.00;0;0;0;0;65535;'I';'cash $';0
'payment_l';'T';17.30;86.30;45.30;90.30;'Arial';10.00;0;0;0;0;0;'I';'Payment terms:';0
'total';'T';105.30;251.30;178.30;260.30;'Arial';12.00;1;0;0;0;65535;'D';None;0
'total_box';'B';155.30;252.30;180.30;259.30;None;0.00;0;0;0;0;0;'I';None;0
'total_label';'T';125.30;251.30;150.30;260.30;'Arial';12.00;0;0;0;0;0;'D';'Total:';0
'vat';'T';145.30;241.30;178.30;250.30;'Arial';12.00;1;0;0;0;65535;'D';None;0
'vat';'T';115.30;40.30;175.30;45.30;'Arial';10.00;0;0;0;0;0;'I';'Tax or Vat number';2
'vat_l';'T';125.30;241.30;150.30;250.30;'Arial';12.00;0;0;0;0;0;'D';'VAT 21%:';0
1 'barcode' 'BC' 20.30 246.80 140.30 254.30 'Interleaved 2of5 NT' 0.75 0 0 0 0 0 'I' '200000000001000159053338016581200810081' 3
2 'barcode_readable' 'T' 19.30 253.30 140.30 260.30 'Arial' 10.00 0 0 0 0 0 'I' '200000000001000159053338016581200810081' 3
3 'box' 'B' 15.30 15.30 185.30 260.30 'Arial' 0.00 0 0 0 0 0 'I' None 0
4 'box_x' 'B' 95.30 15.30 105.30 25.30 'Arial' 0.00 1 0 0 0 0 'I' None 2
5 'company_footer1' 'T' 115.30 45.30 175.30 50.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company footer 1' 2
6 'company_footer2' 'T' 115.30 50.30 175.30 55.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company footer 2' 2
7 'company_header1' 'T' 17.30 40.30 85.30 45.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company header 1' 2
8 'company_header2' 'T' 17.30 45.30 85.30 50.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company header 2' 2
9 'company_logo' 'I' 20.30 17.30 55.70 30.30 None 0.00 0 0 0 0 0 'I' 'tutorial/logo.png' 2
10 'company_name' 'T' 17.30 32.80 98.30 37.80 'Arial' 12.00 1 0 0 0 0 'I' 'Company name' 2
11 'currency' 'T' 42.30 90.30 67.30 94.30 'Arial' 10.00 0 0 0 0 65535 'I' 'U.S.D.' 0
12 'currency_l' 'T' 17.30 90.30 65.30 94.30 'Arial' 10.00 0 0 0 0 0 'I' 'Currency:' 0
13 'customer_address' 'T' 35.30 64.30 160.30 70.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
14 'customer_address_l' 't' 17.30 64.30 35.30 70.30 'Arial' 10.00 0 0 0 0 0 'I' 'Address:' 0
15 'customer_city' 'T' 133.30 69.30 175.30 75.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
16 'customer_city_l' 'T' 115.30 69.30 133.30 75.30 'Arial' 10.00 0 0 0 0 0 'I' 'City:' 0
17 'customer_country' 'T' 133.30 73.30 175.30 79.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
18 'customer_name' 'T' 35.30 59.30 175.30 65.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
19 'customer_name_l' 'T' 17.30 59.30 30.30 65.30 'Arial' 10.00 0 0 0 0 0 'I' 'Bill to:' 0
20 'customer_phone' 'T' 35.30 69.30 115.30 75.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
21 'customer_phone_l' 'T' 17.30 69.30 35.30 75.30 'Arial' 10.00 0 0 0 0 0 'I' 'Phone/Fax:' 0
22 'customer_taxid' 'T' 135.30 74.30 175.30 79.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
23 'customer_taxid_l' 'T' 115.30 74.30 135.30 79.30 'Arial' 10.00 0 0 0 0 0 'I' 'Tax ID:' 0
24 'customer_vat' 'T' 35.30 74.30 105.30 79.30 'Arial' 10.00 0 0 0 0 0 'I' None 0
25 'customer_vat_l' 'T' 17.30 74.30 32.30 79.30 'Arial' 10.00 0 0 0 0 0 'I' 'VAT:' 0
26 'document_copy' 'T' 105.30 21.30 140.30 25.30 'Arial' 8.00 0 0 0 0 0 'C' 'Original' 2
27 'document_label' 'T' 105.30 15.90 180.30 21.10 'Arial Black' 13.00 0 0 0 0 0 'C' 'INVOICE' 2
28 'document_number' 'T' 115.30 27.80 125.30 33.30 'Arial' 14.00 1 0 0 0 0 'I' 'N\xba: ' 2
29 'document_type' 'T' 95.30 16.10 105.30 24.30 'Arial' 16.00 1 0 0 0 0 'C' 'X' 2
30 'due_date' 'T' 65.30 82.30 85.30 86.30 'Arial' 10.00 0 0 0 0 65535 'I' '31/12/2009' 0
31 'due_date_l' 'T' 17.30 82.30 65.30 86.30 'Arial' 10.00 0 0 0 0 0 'I' 'Due Date:' 0
32 'issue_date' 'T' 135.30 33.30 175.30 40.30 'Arial' 12.00 0 0 0 0 65535 'I' None 0
33 'issue_date_l' 'T' 115.30 33.30 175.30 40.30 'Arial' 12.00 0 0 0 0 0 'I' 'Date:' 0
34 'item_amount' 'T' 160.30 97.30 185.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Amount' 0
35 'item_amount01' 'T' 160.30 103.30 183.30 108.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
36 'item_amount02' 'T' 160.30 108.30 183.30 113.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
37 'item_amount03' 'T' 160.30 113.30 183.30 118.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
38 'item_amount04' 'T' 160.30 118.30 183.30 123.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
39 'item_amount05' 'T' 160.30 123.30 183.30 128.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
40 'item_amount06' 'T' 160.30 128.30 183.30 133.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
41 'item_amount07' 'T' 160.30 133.30 183.30 138.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
42 'item_amount08' 'T' 160.30 138.30 183.30 143.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
43 'item_amount09' 'T' 160.30 143.30 183.30 148.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
44 'item_amount10' 'T' 160.30 148.30 183.30 153.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
45 'item_amount11' 'T' 160.30 153.30 183.30 158.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
46 'item_amount12' 'T' 160.30 158.30 183.30 163.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
47 'item_amount13' 'T' 160.30 163.30 183.30 168.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
48 'item_amount14' 'T' 160.30 168.30 183.30 173.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
49 'item_amount15' 'T' 160.30 173.30 183.30 178.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
50 'item_amount16' 'T' 160.30 178.30 183.30 183.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
51 'item_amount17' 'T' 160.30 183.30 183.30 188.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
52 'item_amount18' 'T' 160.30 188.30 183.30 193.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
53 'item_amount19' 'T' 160.30 193.30 183.30 198.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
54 'item_amount20' 'T' 160.30 198.30 183.30 203.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
55 'item_amount21' 'T' 160.30 203.30 183.30 208.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
56 'item_amount22' 'T' 160.30 208.30 183.30 213.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
57 'item_amount23' 'T' 160.30 213.30 183.30 218.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
58 'item_amount24' 'T' 160.30 218.30 183.30 223.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
59 'item_amount25' 'T' 160.30 223.30 183.30 228.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
60 'item_code' 'T' 30.30 97.30 45.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Cod.' 0
61 'item_code01' 'T' 30.30 103.30 43.30 108.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
62 'item_code02' 'T' 30.30 108.30 43.30 113.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
63 'item_code03' 'T' 30.30 113.30 43.30 118.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
64 'item_code04' 'T' 30.30 118.30 43.30 123.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
65 'item_code05' 'T' 30.30 123.30 43.30 128.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
66 'item_code06' 'T' 30.30 128.30 43.30 133.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
67 'item_code07' 'T' 30.30 133.30 43.30 138.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
68 'item_code08' 'T' 30.30 138.30 43.30 143.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
69 'item_code09' 'T' 30.30 143.30 43.30 148.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
70 'item_code10' 'T' 30.30 148.30 43.30 153.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
71 'item_code11' 'T' 30.30 153.30 43.30 158.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
72 'item_code12' 'T' 30.30 158.30 43.30 163.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
73 'item_code13' 'T' 30.30 163.30 43.30 168.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
74 'item_code14' 'T' 30.30 168.30 43.30 173.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
75 'item_code15' 'T' 30.30 173.30 43.30 178.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
76 'item_code16' 'T' 30.30 178.30 43.30 183.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
77 'item_code17' 'T' 30.30 183.30 43.30 188.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
78 'item_code18' 'T' 30.30 188.30 43.30 193.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
79 'item_code19' 'T' 30.30 193.30 43.30 198.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
80 'item_code20' 'T' 30.30 198.30 43.30 203.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
81 'item_code21' 'T' 30.30 203.30 43.30 208.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
82 'item_code22' 'T' 30.30 208.30 43.30 213.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
83 'item_code23' 'T' 30.30 213.30 43.30 218.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
84 'item_code24' 'T' 30.30 218.30 43.30 223.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
85 'item_code25' 'T' 30.30 223.30 43.30 228.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
86 'item_description' 'T' 45.30 97.30 140.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Description' 0
87 'item_description01' 'T' 47.30 103.30 138.30 108.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
88 'item_description02' 'T' 47.30 108.30 138.30 113.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
89 'item_description03' 'T' 47.30 113.30 138.30 118.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
90 'item_description04' 'T' 47.30 118.30 138.30 123.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
91 'item_description05' 'T' 47.30 123.30 138.30 128.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
92 'item_description06' 'T' 47.30 128.30 138.30 133.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
93 'item_description07' 'T' 47.30 133.30 138.30 138.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
94 'item_description08' 'T' 47.30 138.30 138.30 143.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
95 'item_description09' 'T' 47.30 143.30 138.30 148.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
96 'item_description10' 'T' 47.30 148.30 138.30 153.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
97 'item_description11' 'T' 47.30 153.30 138.30 158.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
98 'item_description12' 'T' 47.30 158.30 138.30 163.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
99 'item_description13' 'T' 47.30 163.30 138.30 168.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
100 'item_description14' 'T' 47.30 168.30 138.30 173.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
101 'item_description15' 'T' 47.30 173.30 138.30 178.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
102 'item_description16' 'T' 47.30 178.30 138.30 183.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
103 'item_description17' 'T' 47.30 183.30 138.30 188.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
104 'item_description18' 'T' 47.30 188.30 138.30 193.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
105 'item_description19' 'T' 47.30 193.30 138.30 198.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
106 'item_description20' 'T' 47.30 198.30 138.30 203.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
107 'item_description21' 'T' 47.30 203.30 138.30 208.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
108 'item_description22' 'T' 47.30 208.30 138.30 213.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
109 'item_description23' 'T' 47.30 213.30 138.30 218.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
110 'item_description24' 'T' 47.30 218.30 138.30 223.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
111 'item_description25' 'T' 47.30 223.30 138.30 228.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
112 'item_price' 'T' 140.30 97.30 160.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Price' 0
113 'item_price01' 'T' 140.30 103.30 158.30 108.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
114 'item_price02' 'T' 140.30 108.30 158.30 113.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
115 'item_price03' 'T' 140.30 113.30 158.30 118.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
116 'item_price04' 'T' 140.30 118.30 158.30 123.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
117 'item_price05' 'T' 140.30 123.30 158.30 128.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
118 'item_price06' 'T' 140.30 128.30 158.30 133.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
119 'item_price07' 'T' 140.30 133.30 158.30 138.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
120 'item_price08' 'T' 140.30 138.30 158.30 143.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
121 'item_price09' 'T' 140.30 143.30 158.30 148.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
122 'item_price10' 'T' 140.30 148.30 158.30 153.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
123 'item_price11' 'T' 140.30 153.30 158.30 158.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
124 'item_price12' 'T' 140.30 158.30 158.30 163.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
125 'item_price13' 'T' 140.30 163.30 158.30 168.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
126 'item_price14' 'T' 140.30 168.30 158.30 173.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
127 'item_price15' 'T' 140.30 173.30 158.30 178.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
128 'item_price16' 'T' 140.30 178.30 158.30 183.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
129 'item_price17' 'T' 140.30 183.30 158.30 188.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
130 'item_price18' 'T' 140.30 188.30 158.30 193.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
131 'item_price19' 'T' 140.30 193.30 158.30 198.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
132 'item_price20' 'T' 140.30 198.30 158.30 203.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
133 'item_price21' 'T' 140.30 203.30 158.30 208.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
134 'item_price22' 'T' 140.30 208.30 158.30 213.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
135 'item_price23' 'T' 140.30 213.30 158.30 218.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
136 'item_price24' 'T' 140.30 218.30 158.30 223.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
137 'item_price25' 'T' 140.30 223.30 158.30 228.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
138 'item_quantity' 'T' 15.30 97.30 30.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Qty.' 0
139 'item_quantity01' 'T' 15.30 103.30 25.30 108.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
140 'item_quantity02' 'T' 15.30 108.30 25.30 113.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
141 'item_quantity03' 'T' 15.30 113.30 25.30 118.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
142 'item_quantity04' 'T' 15.30 118.30 25.30 123.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
143 'item_quantity05' 'T' 15.30 123.30 25.30 128.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
144 'item_quantity06' 'T' 15.30 128.30 25.30 133.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
145 'item_quantity07' 'T' 15.30 133.30 25.30 138.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
146 'item_quantity08' 'T' 15.30 138.30 25.30 143.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
147 'item_quantity09' 'T' 15.30 143.30 25.30 148.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
148 'item_quantity10' 'T' 15.30 148.30 25.30 153.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
149 'item_quantity11' 'T' 15.30 153.30 25.30 158.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
150 'item_quantity12' 'T' 15.30 158.30 25.30 163.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
151 'item_quantity13' 'T' 15.30 163.30 25.30 168.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
152 'item_quantity14' 'T' 15.30 168.30 25.30 173.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
153 'item_quantity15' 'T' 15.30 173.30 25.30 178.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
154 'item_quantity16' 'T' 15.30 178.30 25.30 183.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
155 'item_quantity17' 'T' 15.30 183.30 25.30 188.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
156 'item_quantity18' 'T' 15.30 188.30 25.30 193.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
157 'item_quantity19' 'T' 15.30 193.30 25.30 198.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
158 'item_quantity20' 'T' 15.30 198.30 25.30 203.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
159 'item_quantity21' 'T' 15.30 203.30 25.30 208.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
160 'item_quantity22' 'T' 15.30 208.30 25.30 213.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
161 'item_quantity23' 'T' 15.30 213.30 25.30 218.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
162 'item_quantity24' 'T' 15.30 218.30 25.30 223.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
163 'item_quantity25' 'T' 15.30 223.30 25.30 228.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
164 'item_unit01' 'T' 24.30 103.30 30.30 108.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
165 'item_unit02' 'T' 24.30 108.30 30.30 113.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
166 'item_unit03' 'T' 24.30 113.30 30.30 118.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
167 'item_unit04' 'T' 24.30 118.30 30.30 123.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
168 'item_unit05' 'T' 24.30 123.30 30.30 128.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
169 'item_unit06' 'T' 24.30 128.30 30.30 133.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
170 'item_unit07' 'T' 24.30 133.30 30.30 138.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
171 'item_unit08' 'T' 24.30 138.30 30.30 143.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
172 'item_unit09' 'T' 24.30 143.30 30.30 148.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
173 'item_unit10' 'T' 24.30 148.30 30.30 153.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
174 'item_unit11' 'T' 24.30 153.30 30.30 158.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
175 'item_unit12' 'T' 24.30 158.30 30.30 163.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
176 'item_unit13' 'T' 24.30 163.30 30.30 168.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
177 'item_unit14' 'T' 24.30 168.30 30.30 173.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
178 'item_unit15' 'T' 24.30 173.30 30.30 178.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
179 'item_unit16' 'T' 24.30 178.30 30.30 183.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
180 'item_unit17' 'T' 24.30 183.30 30.30 188.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
181 'item_unit18' 'T' 24.30 188.30 30.30 193.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
182 'item_unit19' 'T' 24.30 193.30 30.30 198.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
183 'item_unit20' 'T' 24.30 198.30 30.30 203.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
184 'item_unit21' 'T' 24.30 203.30 30.30 208.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
185 'item_unit22' 'T' 24.30 208.30 30.30 213.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
186 'item_unit23' 'T' 24.30 213.30 30.30 218.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
187 'item_unit24' 'T' 24.30 218.30 30.30 223.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
188 'item_unit25' 'T' 24.30 223.30 30.30 228.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
189 'line1' 'L' 100.30 25.30 100.30 57.30 'Arial' 0 0 0 0 0 0 'I' None 3
190 'line2' 'L' 15.30 57.30 185.30 57.30 None 0.00 0 0 0 0 0 'I' None 3
191 'line3' 'L' 15.30 80.30 185.30 80.30 None 0.00 0 0 0 0 0 'I' None 3
192 'line5' 'L' 15.30 95.30 185.30 95.30 None 0.00 0 0 0 0 0 'I' None 3
193 'line6' 'L' 15.30 230.30 185.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
194 'line9' 'L' 15.30 102.30 185.30 102.30 None 0.00 0 0 0 0 0 'I' None 0
195 'line_cod' 'L' 45.30 95.30 45.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
196 'line_desc' 'L' 140.30 95.30 140.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
197 'line_price' 'L' 160.30 95.30 160.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
198 'line_qty' 'L' 30.30 95.30 30.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
199 'net' 'T' 145.30 234.30 178.30 243.30 'Arial' 12.00 1 0 0 0 65535 'D' None 0
200 'net_l' 'T' 105.30 234.30 150.30 243.30 'Arial' 12.00 0 0 0 0 0 'D' 'NET:' 0
201 'number' 'T' 125.30 25.80 185.30 35.30 'Arial' 14.00 1 0 0 0 0 'I' '0000-00000000' 2
202 'page' 'T' 140.30 21.30 180.30 25.30 'Arial' 8.00 0 0 0 0 0 'C' 'Page' 2
203 'payment' 'T' 45.30 86.30 150.30 90.30 'Arial' 10.00 0 0 0 0 65535 'I' 'cash $' 0
204 'payment_l' 'T' 17.30 86.30 45.30 90.30 'Arial' 10.00 0 0 0 0 0 'I' 'Payment terms:' 0
205 'total' 'T' 105.30 251.30 178.30 260.30 'Arial' 12.00 1 0 0 0 65535 'D' None 0
206 'total_box' 'B' 155.30 252.30 180.30 259.30 None 0.00 0 0 0 0 0 'I' None 0
207 'total_label' 'T' 125.30 251.30 150.30 260.30 'Arial' 12.00 0 0 0 0 0 'D' 'Total:' 0
208 'vat' 'T' 145.30 241.30 178.30 250.30 'Arial' 12.00 1 0 0 0 65535 'D' None 0
209 'vat' 'T' 115.30 40.30 175.30 45.30 'Arial' 10.00 0 0 0 0 0 'I' 'Tax or Vat number' 2
210 'vat_l' 'T' 125.30 241.30 150.30 250.30 'Arial' 12.00 0 0 0 0 0 'D' 'VAT 21%:' 0
+6
View File
@@ -0,0 +1,6 @@
[metadata]
description-file = README.md
[wheel]
universal = 1
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env python
from distutils.core import setup
import os
import sys
import warnings
import subprocess
import fpdf
package_dir = 'fpdf'
# convert the README and format in restructured text (only when registering)
long_desc = ""
if os.path.exists("README.md"):
try:
cmd = ['pandoc', '--from=markdown', '--to=rst', 'README.md']
long_desc = subprocess.check_output(cmd).decode("utf8")
except Exception as e:
warnings.warn("Exception when converting the README format: %s" % e)
setup(name='fpdf',
version=fpdf.__version__,
description='Simple PDF generation for Python',
long_description=long_desc,
author='Olivier PLATHEY ported by Max',
author_email='maxpat78@yahoo.it',
maintainer = "Mariano Reingart",
maintainer_email = "reingart@gmail.com",
url='http://code.google.com/p/pyfpdf',
license='LGPLv3+',
download_url="https://github.com/reingart/pyfpdf/tarball/%s" % fpdf.__version__,
packages=['fpdf', ],
package_dir={'fpdf': package_dir},
package_data={'fpdf': ['font/*.ttf', 'font/*.txt']},
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python",
"Programming Language :: Python :: 2.5",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Operating System :: OS Independent",
"Topic :: Software Development :: Libraries :: PHP Classes",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Multimedia :: Graphics",
],
keywords=["pdf", "unicode", "png", "jpg", "ttf"],
)
@@ -0,0 +1,13 @@
English: Hello World
Greek: Γειά σου κόσμος
Polish: Witaj świecie
Portuguese: Olá mundo
Russian: Здравствуй, Мир
Vietnamese: Xin chào thế giới
Arabic: مرحبا العالم
Hebrew: שלום עולם
Hindi: नमस्ते दुनिया
Chinese: 你好世界
Japanese: こんにちは世界
Korean: 안녕하세요
Thai: สวัสดีชาวโลก
@@ -0,0 +1,47 @@
"Print all charters"
from fpdf import FPDF, FPDF_VERSION, TTFontFile
print FPDF_VERSION
class MyTTFontFile(TTFontFile):
def getCMAP4(self, unicode_cmap_offset, glyphToChar, charToGlyph):
TTFontFile.getCMAP4(self, unicode_cmap_offset, glyphToChar, charToGlyph)
self.saveChar = charToGlyph
def getCMAP12(self, unicode_cmap_offset, glyphToChar, charToGlyph):
TTFontFile.getCMAP12(self, unicode_cmap_offset, glyphToChar, charToGlyph)
self.saveChar = charToGlyph
pdf=FPDF()
pdf.compression = True
pdf.add_page()
fontpath = "DroidSansFallback.ttf"
pdf.add_font("font", '', fontpath, uni = True)
ttf = MyTTFontFile()
ttf.getMetrics(fontpath)
pdf.set_font("font", '', 10)
# create PDF with first 999 charters in font
cnt = 0
for char in ttf.saveChar:
cnt += 1
pdf.write(8, u"%03d) %06x - " % (cnt, char) + unichr(char))
pdf.ln()
if cnt >= 999:
break
fn = 'charmap.pdf'
pdf.output(fn,'F')
import os
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)
@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from .common import *
@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Test environment
import common
def main():
common.log("CHECK")
try:
from fpdf import FPDF_VERSION
except ImportError:
FPDF_VERSION = None
common.log("VER =", FPDF_VERSION)
try:
try:
import Image
except:
from PIL import Image
except ImportError:
Image = None
if Image:
common.log("PIL = yes")
else:
common.log("PIL = no")
if __name__ == "__main__":
main()
@@ -0,0 +1,284 @@
# -*- coding: utf-8 -*-
# common utilities for pyfpdf tests
# Note: 1) this file imported from both 2 and 3 version of python
# 2) import this file before import fpdf
# 3) assert this file in tests/cover folder
import sys, os, subprocess
PY3K = sys.version_info >= (3, 0)
basepath = os.path.abspath(os.path.join(__file__, "..", ".."))
RESHASH = "38db8db76e80a2e75f94d1df9eda307e"
# if PYFPDFTESTLOCAL is not set - use instaled pyfpdf version
PYFPDFTESTLOCAL = ("PYFPDFTESTLOCAL" in os.environ)
if PYFPDFTESTLOCAL:
sys.path = [os.path.join(basepath, "fpdf_local")] + sys.path
if PY3K:
#import common3 as _common
def tobytes(value):
return value.encode("latin1")
def frombytes(value):
return value.decode("latin1")
from hashlib import md5
unicode = str
else:
#import common2 as _common
def tobytes(value):
return value
def frombytes(value):
return value
try:
from hashlib import md5
except ImportError:
import md5
def exec_cmd(cmd):
"Execute command and return console output (stdout, stderr)"
obj = subprocess.Popen(cmd, \
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
std, err = obj.communicate()
return (frombytes(std), frombytes(err))
def start_by_ext(fn):
"Open file in associated progrom"
try:
try:
os.startfile(fn)
except WindowsError:
os.system("start " + fn)
except:
subprocess.call(["xdg-open", fn])
def writer(stream, items):
sep = ""
for item in items:
stream.write(sep)
sep = " "
if not isinstance(item, str):
item = str(item)
if not PY3K:
if not isinstance(item, unicode):
item = str(item)
stream.write(item)
stream.write("\n")
def log(*kw):
writer(sys.stdout, kw)
def err(*kw):
writer(sys.stderr, kw)
def test_putinfo(self):
"Replace info stamp with defaults for all automated test objects"
self._out('/Producer '+self._textstring('PyFPDF TEST http://pyfpdf.googlecode.com/'))
if hasattr(self,'title'):
self._out('/Title '+self._textstring(self.title))
if hasattr(self,'subject'):
self._out('/Subject '+self._textstring(self.subject))
if hasattr(self,'author'):
self._out('/Author '+self._textstring(self.author))
if hasattr (self,'keywords'):
self._out('/Keywords '+self._textstring(self.keywords))
if hasattr(self,'creator'):
self._out('/Creator '+self._textstring(self.creator))
self._out('/CreationDate '+self._textstring('D:19700101000000'))
def file_hash(fn):
"Calc MD5 hash for file"
md = md5()
f = open(fn, "rb")
try:
md.update(f.read())
finally:
f.close()
return md.hexdigest()
def read_cover_info(fn):
"Read cover test info"
f = open(fn, "rb")
da = {"res": []}
mark = "#PyFPDF-cover-test:"
encmark = "# -*- coding:"
enc = None
try:
hdr = False
for line in f.readlines():
if enc is None:
if line.decode("latin-1")[:len(encmark)] == unicode(encmark):
enc = line.decode("latin-1")[len(encmark):].strip()
if enc[-3:] == unicode("-*-"):
enc = enc[:-3].strip()
try:
line.decode(enc)
except:
enc = None
line = line.decode(enc or "UTF-8").strip()
if line[:len(mark)] == mark:
hdr = True
kv = line[len(mark):].split("=", 1)
if len(kv) == 2:
if kv[0] == "res":
da["res"].append(kv[1])
else:
da[kv[0]] = kv[1]
else:
if hdr and len(line) == 0:
break
finally:
f.close()
return da
def parse_test_args(args, deffn):
"Parse test args, return (fn, autotest)"
args = args[1:]
da = {}
da["fn"] = deffn
da["autotest"] = False
da["check"] = False
while len(args) > 0:
arg = args[0]
if arg == "--help":
log("Test usage: [--auto] [--check] [<outputname>]")
log(" --auto - no version and timestamp in file, do not open")
log(" --check - compare new file with stock")
log(" <outputname> - output filename, default \"%s\"" % deffn)
sys.exit(0)
if arg == "--auto":
da["autotest"] = True
elif arg == "--check":
da["check"] = True
else:
da["fn"] = arg
args = args[1:]
return da
def load_res_file(path):
items = {}
res = None
for line in open(path):
line = line.strip()
if line[:1] == "#":
continue
kv = line.split("=", 1)
if len(kv) != 2:
continue
if kv[0] == "res":
res = kv[1]
if res not in items:
items[res] = ["", []]
elif res is None:
continue
elif kv[0] == "hash":
items[res][0] = kv[1]
elif kv[0] == "tags":
items[res][1] += [kv[1].split(",")]
return items
def check_env(settings, args):
"Check test environment"
verbose = not args["autotest"]
# check python version
if PY3K:
if settings.get("python3", "yes") == "no":
# python 3 inacceptable
if verbose:
err("Python 3.x unsupported %s" % repr(sys.version_info))
else:
log("NOTFORPY3")
return False
else:
if settings.get("python2", "yes") == "no":
# python 2 inacceptable
if verbose:
err("Python 2.x unsupported %s" % repr(sys.version_info))
else:
log("NOTFORPY2")
return False
if settings.get("pil", "no") == "yes":
# import PIL
try:
try:
import Image
except:
from PIL import Image
except ImportError:
Image = None
if Image is None:
if verbose:
err("PIL or Pillow module is required")
else:
log("NOPIL")
return False
# check res
reslst = None
for res in settings.get("res", []):
if reslst is None:
# check
respath = os.path.join(basepath, "resources.txt")
if file_hash(respath) != RESHASH:
if verbose:
err("File resources.txt damaged (hash mismatch)")
else:
log("RESHASH")
return False
# load data
reslst = load_res_file(respath)
if res not in reslst:
err("Resource \"" + res + "\" not found")
if not verbose:
log("NORES")
return False
# check hash
respath = os.path.join(basepath, res)
hs = file_hash(respath)
if hs != reslst[res][0]:
err("Resource \"" + res + "\" damaged")
err(" read = %s" % hs)
err(" required = %s" % reslst[res][0])
if not verbose:
log("RESERR")
return False
return True
def check_result(settings, args):
check = True
if settings.get("fn"):
if args["check"]:
# compare with hash
hs = file_hash(args["fn"])
fhs = settings.get("hash", "")
if fhs != "" and hs != fhs:
check = False
err("Hash mismatch:")
err(" new = %s" % hs)
err(" required = %s" % fhs)
if args["autotest"]:
if check:
log("OK")
else:
log("HASHERROR")
else:
if settings.get("fn"):
start_by_ext(args["fn"])
else:
log("Test passed")
def testmain(fn, testfunc):
si = read_cover_info(fn)
da = parse_test_args(sys.argv, si.get("fn"))
if not check_env(si, da):
return
testfunc(da["fn"], da["autotest"] or da["check"])
check_result(si, da)
@@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
"Test caching"
#PyFPDF-cover-test:res=font/DejaVuSansCondensed.ttf
#PyFPDF-cover-test:res=font/DejaVuSans.ttf
import common
import fpdf
import os, shutil, time
def testfile(f1, f2):
# create pdf
pdf = fpdf.FPDF()
if f1:
pdf.add_font('DejaVuSansCondensed', '', f1, uni = True)
if f2:
pdf.add_font('DejaVuSans', '', f2, uni = True)
pdf.set_font('DejaVuSans', "", 10)
return pdf
def trashfile(fn):
f = open(fn, "w")
f.write("1234567890")
f.close()
try:
from hashlib import md5
except ImportError:
try:
from md5 import md5
except ImportError:
md5 = None
def hashfn(fn):
h = md5()
if common.PY3K:
h.update(fn.encode("UTF-8"))
else:
h.update(fn)
return h.hexdigest()
def dotest(outputname, nostamp):
cachepath = os.path.join(os.path.dirname(__file__), "cache")
if os.path.exists(cachepath):
# cleanup dest
for item in os.listdir(cachepath):
os.remove(os.path.join(cachepath, item))
else:
# create font dir
os.makedirs(cachepath)
hashpath = os.path.join(os.path.dirname(__file__), "hash")
if os.path.exists(hashpath):
# cleanup dest
for item in os.listdir(hashpath):
os.remove(os.path.join(hashpath, item))
else:
# create font dir
os.makedirs(hashpath)
# copy font files
shutil.copy(os.path.join(common.basepath, "font", "DejaVuSansCondensed.ttf"), cachepath)
shutil.copy(os.path.join(common.basepath, "font", "DejaVuSans.ttf"), cachepath)
f1 = os.path.join(cachepath, "DejaVuSansCondensed.ttf")
f2 = os.path.join(cachepath, "DejaVuSans.ttf")
# --- normal cache mode ---
fpdf.set_global("FPDF_CACHE_MODE", 0)
# first load
t0 = time.time()
pdf = testfile(f1, f2)
t1 = time.time()
assert os.path.exists(f1[:-3] + "pkl")
assert os.path.exists(f2[:-3] + "pkl")
# load cached
t2 = time.time()
pdf = testfile(f1, f2)
t3 = time.time()
if not nostamp:
common.log("Cache fonts: ", t1 - t0)
common.log("Reload fonts: ", t3 - t2)
pdf.add_page()
# trigger cw127
#pdf.write(5, "Γειά σου κόσμος")
pdf.write(5, "Привет!")
pdf.write(10, "Hello")
pdf.output(os.path.join(cachepath, "pdf0.pdf"), "F")
# check cw127
assert not os.path.exists(f1[:-3] + "cw127.pkl")
assert os.path.exists(f2[:-3] + "cw127.pkl")
# --- disable cache reading ---
fpdf.set_global("FPDF_CACHE_MODE", 1)
# put garbage data to cache files - fpdf should not read pkl
trashfile(f1[:-3] + "pkl")
trashfile(f2[:-3] + "pkl")
trashfile(f2[:-3] + "cw127.pkl")
# test same file
t0 = time.time()
pdf = testfile(f1, f2)
t1 = time.time()
# remove pkl files
os.remove(f1[:-3] + "pkl")
os.remove(f2[:-3] + "pkl")
os.remove(f2[:-3] + "cw127.pkl")
# test reload
t2 = time.time()
pdf = testfile(f1, f2)
t3 = time.time()
if not nostamp:
common.log("No cache 1st: ", t1 - t0)
common.log("No cache 2nd: ", t3 - t2)
pdf.add_page()
pdf.write(5, "Γειά σου κόσμος")
pdf.write(10, "Hello")
pdf.output(os.path.join(cachepath, "pdf1.pdf"), "F")
# test no files created
assert not os.path.exists(f1[:-3] + "pkl")
assert not os.path.exists(f2[:-3] + "pkl")
assert not os.path.exists(f1[:-3] + "cw127.pkl")
assert not os.path.exists(f2[:-3] + "cw127.pkl")
# --- hash cache ---
fpdf.set_global("FPDF_CACHE_MODE", 2)
fpdf.set_global("FPDF_CACHE_DIR", hashpath)
t0 = time.time()
pdf = testfile(f1, f2)
t1 = time.time()
assert not os.path.exists(f1[:-3] + "pkl")
assert not os.path.exists(f2[:-3] + "pkl")
# load cached
t2 = time.time()
pdf = testfile(f1, f2)
t3 = time.time()
# test reload
if not nostamp:
common.log("Hash load 1st:", t1 - t0)
common.log("Hash load 2nd:", t3 - t2)
# check hash
assert os.path.exists(os.path.join(hashpath, hashfn(f1) + ".pkl"))
assert os.path.exists(os.path.join(hashpath, hashfn(f2) + ".pkl"))
pdf.add_page()
pdf.write(5, "Хешировали, хешировали, да выдохешиовали.")
pdf.write(10, "Hello")
pdf.output(os.path.join(cachepath, "pdf2.pdf"), "F")
assert not os.path.exists(os.path.join(hashpath, hashfn(f1) + ".cw127.pkl"))
assert os.path.exists(os.path.join(hashpath, hashfn(f2) + ".cw127.pkl"))
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,165 @@
# -*- coding: utf-8 -*-
"PDF Template Helper for FPDF.py"
__author__ = "Mariano Reingart <reingart@gmail.com>"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
__license__ = "LGPL 3.0"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=invoice.pdf
#PyFPDF-cover-test:hash=5844bbebe3e33b0ac9cc15ac39327a81
#PyFPDF-cover-test:res=invoice.csv
import common
from fpdf import Template
import os
class randomfake:
RINT1_10 = [8, 5, 7, 9, 10, 8, 1, 9, 1, 7, 6, 2, 3, 7, 8, 4, 6, 5, 7, 2, \
5, 8, 6, 5, 5, 8, 7, 7, 6]
RINT65_90 = [67, 67, 87, 78, 84, 67, 86, 75, 86, 89, 81, 69, 72, 71, 84, \
80, 71 , 86 , 82 , 70 , 84 , 69 , 70]
RFLT = [0.820710198665, 0.342854771472, 0.0238515965298, 0.177658111957, \
0.422301628067, 0.701867781693, 0.168650983171, 0.329723498664, \
0.490481106182, 0.892634029991, 0.994758791625, 0.998243714035, \
0.596244312914 ,0.318601111178 ,0.321593673214 ,0.203486335469]
def __init__(self):
self.icnt1_10 = 0
self.icnt65_90 = 0
self.fcnt = 0
def randint(self, beg, end):
if beg == 1 and end == 10:
self.icnt1_10 += 1
if self.icnt1_10 > len(self.RINT1_10):
self.icnt1_10 = 1
return self.RINT1_10[self.icnt1_10 - 1]
if beg == 65 and end == 90:
self.icnt65_90 += 1
if self.icnt65_90 > len(self.RINT65_90):
self.icnt65_90 = 1
return self.RINT65_90[self.icnt65_90 - 1]
raise Exception("Not implemented")
def random(self):
self.fcnt += 1
if self.fcnt > len(self.RFLT):
self.fcnt = 1
return self.RFLT[self.fcnt - 1]
def dotest(outputname, nostamp):
# generate sample invoice (according Argentina's regulations)
from decimal import Decimal
f = Template(format="A4",
title="Sample Invoice", author="Sample Company",
subject="Sample Customer", keywords="Electronic TAX Invoice")
if nostamp:
f.pdf._putinfo = lambda: common.test_putinfo(f.pdf)
random = randomfake()
else:
import random
csvpath = os.path.join(common.basepath, "invoice.csv")
f.parse_csv(infile=csvpath, delimiter=";", decimal_sep=",")
detail = "Lorem ipsum dolor sit amet, consectetur. " * 30
items = []
for i in range(1, 30):
ds = "Sample product %s" % i
qty = random.randint(1,10)
price = round(random.random()*100,3)
code = "%s%s%02d" % (chr(random.randint(65,90)), chr(random.randint(65,90)),i)
items.append(dict(code=code, unit='u',
qty=qty, price=price,
amount=qty*price,
ds="%s: %s" % (i,ds)))
# divide and count lines
lines = 0
li_items = []
for it in items:
qty = it['qty']
code = it['code']
unit = it['unit']
for ds in f.split_multicell(it['ds'], 'item_description01'):
# add item description line (without price nor amount)
li_items.append(dict(code=code, ds=ds, qty=qty, unit=unit, price=None, amount=None))
# clean qty and code (show only at first)
unit = qty = code = None
# set last item line price and amount
li_items[-1].update(amount = it['amount'],
price = it['price'])
obs="\n<U>Detail:</U>\n\n" + detail
for ds in f.split_multicell(obs, 'item_description01'):
li_items.append(dict(code=code, ds=ds, qty=qty, unit=unit, price=None, amount=None))
# calculate pages:
lines = len(li_items)
max_lines_per_page = 24
pages = int(lines / (max_lines_per_page - 1))
if lines % (max_lines_per_page - 1): pages = pages + 1
# completo campos y hojas
for page in range(1, int(pages)+1):
f.add_page()
f['page'] = 'Page %s of %s' % (page, pages)
if pages>1 and page<pages:
s = 'Continues on page %s' % (page+1)
else:
s = ''
f['item_description%02d' % (max_lines_per_page+1)] = s
f["company_name"] = "Sample Company"
f["company_logo"] = os.path.join(common.basepath, "../tutorial/logo.png")
f["company_header1"] = "Some Address - somewhere -"
f["company_header2"] = "http://www.example.com"
f["company_footer1"] = "Tax Code ..."
f["company_footer2"] = "Tax/VAT ID ..."
f['number'] = '0001-00001234'
f['issue_date'] = '2010-09-10'
f['due_date'] = '2099-09-10'
f['customer_name'] = "Sample Client"
f['customer_address'] = "Siempreviva 1234"
# print line item...
li = 0
k = 0
total = Decimal("0.00")
for it in li_items:
k = k + 1
if k > page * (max_lines_per_page - 1):
break
if it['amount']:
total += Decimal("%.6f" % it['amount'])
if k > (page - 1) * (max_lines_per_page - 1):
li += 1
if it['qty'] is not None:
f['item_quantity%02d' % li] = it['qty']
if it['code'] is not None:
f['item_code%02d' % li] = it['code']
if it['unit'] is not None:
f['item_unit%02d' % li] = it['unit']
f['item_description%02d' % li] = it['ds']
if it['price'] is not None:
f['item_price%02d' % li] = "%0.3f" % it['price']
if it['amount'] is not None:
f['item_amount%02d' % li] = "%0.2f" % it['amount']
if pages == page:
f['net'] = "%0.2f" % (total/Decimal("1.21"))
f['vat'] = "%0.2f" % (total*(1-1/Decimal("1.21")))
f['total_label'] = 'Total:'
else:
f['total_label'] = 'SubTotal:'
f['total'] = "%0.2f" % total
f.render(outputname)
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
"Test images flow mode (cell-like, trigger page breaks)"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=issue_14.pdf
#PyFPDF-cover-test:hash=7e4a5b0a77c4eaefa475bb7db655fcd9
#PyFPDF-cover-test:res=../tutorial/logo_pb.png
import common
from fpdf import FPDF
import os
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
for i in range(1,41):
# for flow mode, do not pass x or y:
pdf.image(os.path.join(common.basepath, '../tutorial/logo_pb.png'))
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,114 @@
# -*- coding: utf-8 -*-
"Test issue 33 (Cannot import GIF files that don't have transparency)"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=issue_33.pdf
#PyFPDF-cover-test:hash=be95c7ef3a5b14b5a54a52f7eaf3a9e4
#PyFPDF-cover-test:2to3=no
#PyFPDF-cover-test:pil=yes
import common
from fpdf import FPDF
import os, sys, tempfile
try:
try:
import Image
except:
from PIL import Image
except ImportError:
Image = None
def genbar():
# bg
bg = Image.new("L", (112, 1), 1)
bg = bg.resize((112, 11))
# stripes
vbarnum = [0x4F43484B, 0xEE90D642, 0xF11A2735, 0xD71A]
vbar = Image.new("L", (112, 1), 1)
pix = vbar.load()
pos = 0
for b in vbarnum:
for i in range(32):
pix[pos, 0] = 0 if (b & 1) else 1
b = b >> 1
pos += 1
if pos >= 112: break
vbar = vbar.resize((112, 31), Image.NEAREST)
# digit
dignum = [0x398, 0x6dc, 0x61a, 0x31b, 0x1bf, 0x6d8, 0x7d8]
dbar = Image.new("L", (16, 7), 1)
pix = dbar.load()
pos = 0
ypos = 0
for b in dignum:
for i in range(16):
pix[pos, ypos] = 0 if (b & 1) else 1
b = b >> 1
pos += 1
ypos += 1
pos = 0
# result
bar = Image.new("L", (114, 44), 2)
bar.paste(vbar, (1, 1))
bar.paste(bg, (1, 32))
for i in range(4):
bar.paste(dbar, (35 + i * 12, 34))
return bar
def dotest(outputname, nostamp):
plane = genbar()
palette = (0,0,0, 255,255,255) + (128,128,128)*254
img = Image.fromstring("P", plane.size, plane.tostring())
img.putpalette(palette)
f = tempfile.NamedTemporaryFile(delete = False, suffix = ".gif")
gif1 = f.name
f.close()
f = tempfile.NamedTemporaryFile(delete = False, suffix = ".gif")
gif2 = f.name
f.close()
img.save(gif1, "GIF", optimize = 0)
img.save(gif2, "GIF", transparency = 1, optimize = 0)
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
pdf.set_font('Arial', '', 16)
pdf.write(8, "Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.image(gif1, x = 15, y = 15)
pdf.write(8, "Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.image(gif2, x = 15, y = 39)
pdf.output(outputname, 'F')
os.unlink(gif1)
os.unlink(gif2)
def main():
si = common.read_cover_info(__file__)
da = common.parse_test_args(sys.argv, si["fn"])
if not common.check_env(si, da):
return
dotest(da["fn"], da["autotest"] or da["check"])
common.check_result(si, da)
if __name__ == "__main__":
main()
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
"Tests new dashed line feature (issue 35)"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=issue_35.pdf
#PyFPDF-cover-test:hash=e8f92b3210aea65caa72f70d0f898c04
import common
from fpdf import FPDF
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
pdf.dashed_line(10, 10, 110, 10)
pdf.dashed_line(10, 20, 110, 20, 5, 5)
pdf.dashed_line(10, 30, 110, 30, 1, 10)
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
"Test issue 41 (escape CR char)"
#PyFPDF-cover-test:format=TXT
#PyFPDF-cover-test:fn=issue_41.txt
#PyFPDF-cover-test:hash=c576afec3362a7cc3b4b07a12feeefd3
import common # common set of utilities
import fpdf
import sys
def dotest(outputname, nostamp):
txt = "This is test string for issue41 with special symbols \n" +\
"ln - \n\n" +\
"cr - \r\n" +\
"\\ ( ) abcdef..xyz 01234\n" +\
"| [ ] ABCDEF..XYZ 56789\n"
pdf = fpdf.FPDF()
f = open(outputname, "wb")
f.write(pdf._escape(txt).encode("latin1"))
f.close()
def main():
si = common.read_cover_info(__file__)
da = common.parse_test_args(sys.argv, si["fn"])
if not common.check_env(si, da):
return
dotest(da["fn"], da["autotest"] or da["check"])
common.check_result(si, da)
if __name__ == "__main__":
main()
@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
"Basic test to reproduce issue 60: RTL languages (arabian, hebrew, etc.)"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=issue_60.pdf
#PyFPDF-cover-test:hash=bc47380ca9511b96756d1066a3b494c1
#PyFPDF-cover-test:res=font/DejaVuSans.ttf
import common
from fpdf import FPDF
import sys, traceback, os
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.compress = False
pdf.add_page()
pdf.add_font('DejaVu', '', \
os.path.join(common.basepath, 'font/DejaVuSans.ttf'), uni=True)
pdf.set_font('DejaVu', '', 14)
# this will be displayed wrong as actually it is stored LTR:
text= u"این یک متن پارسی است. This is a Persian text !!"
pdf.write(8, text)
pdf.ln(8)
# Reverse the RLT using the Bidirectional Algorithm to be displayed correctly:
# (http://unicode.org/reports/tr9/)
from bidi.algorithm import get_display
rtl_text = get_display(text)
pdf.write(8, rtl_text)
pdf.output(outputname, 'F')
if __name__ == "__main__":
try:
from bidi.algorithm import get_display
except ImportError:
traceback.print_exc(file = sys.stdout)
common.err("This test requre PyBiDi (https://pypi.python.org/pypi/python-bidi)")
common.log("SKIP")
sys.exit(0)
common.testmain(__file__, dotest)
@@ -0,0 +1,39 @@
# -*- coding: latin-1 -*-
"Basic test to reproduce issue 63: warning in unicode get_char_width"
#PyFPDF-cover-test:res=font/DejaVuSans.ttf
import common
from fpdf import FPDF
import os, struct
if common.PY3K:
def u(x):
return x
else:
import codecs
def u(x):
return codecs.unicode_escape_decode(x)[0]
def dotest(outputname, nostamp):
pdf = FPDF()
pdf.set_font('Arial','',14)
s = 'Texto largo que no cabe en esta celda pero que será ajustado'
w = pdf.get_string_width(s)
if not nostamp:
print (s, w)
assert round(w, 2) == 135.90
pdf.add_font('DejaVu', '', './font/DejaVuSans.ttf', uni=True)
pdf.set_font('DejaVu', '', 14)
s = u('Texto largo que no cabe en esta celda pero que será ajustado')
w = pdf.get_string_width(s)
if not nostamp:
print (s, w)
assert round(w, 2) == 153.64
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
"Basic test to check issue 70: raise an exception if add_page was not called"
import common
from fpdf import FPDF
import os, struct
def dotest(outputname, nostamp):
try:
# Portrait, millimeter units, A4 page size
pdf = FPDF("P", "mm", "A4")
# Set font: Times, normal, size 10
pdf.set_font('Times','', 12)
##pdf.add_page()
# Layout cell: 0 x 5 mm, text, no border, Left
pdf.cell(0,5,'Input 1 : ',border=0,align="L")
pdf.cell(0,5,'Input 2 : ', border=0,align="L")
pdf.cell(0,5,'Recomendation : ', border=0, align="L")
pdf.cell(0,5,'Data 1 :', border=0, align="L" )
pdf.cell(0,5,'Data 2 :', border=0, align="L" )
pdf.output(outputname,'F')
except RuntimeError as e:
assert e.args[0] == "FPDF error: No page open, you need to call add_page() first"
else:
raise RuntimeError("Exception not raised!")
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
"Basic test to check issue 71: test Code39"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=issue_71.pdf
#PyFPDF-cover-test:hash=1575947cac5b0a8cdceedf9b525ee6db
# get res from http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Code_3_of_9.svg/262px-Code_3_of_9.svg.png
# PyFPDF-cover-test:res=.png
import common
from fpdf import FPDF
import os
def dotest(outputname, nostamp):
# Portrait, millimeter units, A4 page size
pdf = FPDF("P", "mm", "A4")
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
# Set font: Times, normal, size 10
pdf.add_page()
if not nostamp:
# do not show picture in batch
url = "http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Code_3_of_9.svg/262px-Code_3_of_9.svg.png"
pdf.image(url, 10, 10)
pdf.code39("*wikipedia*", 12.75, 7, 1.49)
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
"Test jpeg image embedding"
# Note: img_cmyk.jpg has no color profile, PDF rendering may vary
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=jpeg.pdf
#PyFPDF-cover-test:hash=eb8db8f336226f6de671a3e515b9cc61
#PyFPDF-cover-test:res=img_gray.jpg
#PyFPDF-cover-test:res=img_rgb.jpg
#PyFPDF-cover-test:res=img_cmyk.jpg
import common # test utilities
from fpdf import FPDF
import sys
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
pdf.set_font('Arial', '', 14)
pdf.text(10, 57, 'DeviceGray')
pdf.image("img_gray.jpg", 55, 5)
pdf.text(10, 157, 'DeviceRGB')
pdf.image("img_rgb.jpg", 55, 105)
pdf.text(10, 257, 'DeviceCMYK')
pdf.image("img_cmyk.jpg", 55, 205)
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
"Simple test to check alias_nb_pages replacement under unicode fonts"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=nb_pages.pdf
#PyFPDF-cover-test:hash=4f22df85e31007cb275fabdc9fa78f97
#PyFPDF-cover-test:res=font/DejaVuSansCondensed.ttf
import common
import fpdf
import os
def dotest(outputname, nostamp):
pdf = fpdf.FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
fpdf.set_global("FPDF_CACHE_MODE", 1)
# set default alias: {nb} that will be replaced with total page count
pdf.alias_nb_pages()
# Add a Unicode font (uses UTF-8)
pdf.add_font('DejaVu', '', \
os.path.join(common.basepath, "font", 'DejaVuSansCondensed.ttf'), \
uni = True)
pdf.set_font('DejaVu', '', 14)
for i in range(5):
pdf.add_page()
pdf.set_font('Arial','B',16)
pdf.cell(40,10,'Hello World! Page %d from {nb}' % (i + 1))
pdf.set_font('DejaVu','',14)
pdf.cell(40,30,'Hello World! unicode {nb}')
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
"Basic example to test py3k conversion"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=py3k.pdf
#PyFPDF-cover-test:hash=ecf5ec7b9a3bb6015b4c9f0546f62e84
#PyFPDF-cover-test:python2=no
import common # test utilities
from fpdf import FPDF
import sys
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
pdf.set_font('Arial', '', 14)
pdf.ln(10)
if nostamp:
data = "TEST-TEST-TEST"
else:
data = sys.version
#áéíóúüñ
# This string converted with errors in py2.x
pdf.write(5, ('hello world %s áéíóúüñ' % data))
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
"Basic example to test PyFPDF"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=simple.pdf
#PyFPDF-cover-test:hash=1fd821a42cb5029a51727a6107b623ec
#PyFPDF-cover-test:pil=yes
#PyFPDF-cover-test:res=../tutorial/logo.png
#PyFPDF-cover-test:res=flower2.jpg
#PyFPDF-cover-test:res=lena.gif
import common # test utilities
from fpdf import FPDF
import sys
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
pdf.set_font('Arial', '', 14)
pdf.ln(10)
if nostamp:
data = "TEST-TEST-TEST"
else:
data = sys.version
pdf.write(5, 'hello world %s' % data)
pdf.image("../tutorial/logo.png", 50, 50)
pdf.image("flower2.jpg", 100, 50)
pdf.image("lena.gif", 50, 75)
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
"This is test template"
# Lines below must not be separated by blank line
# output formats PDF (can be auto-opened), TXT
#PyFPDF-cover-test:format=PDF
# default filename
#PyFPDF-cover-test:fn=template.pdf
# hash stamp for compare in --check mode (insert your hash)
#PyFPDF-cover-test:hash=b1812fffdcf175976e80317b3766a0f0
# use 2to3 tool (default - no)
#PyFPDF-cover-test:2to3=no
# can be used in python2 (default - yes)
#PyFPDF-cover-test:python2=yes
# can be used in python3 (default - yes)
#PyFPDF-cover-test:python3=yes
# is PIL required (default - no)
#PyFPDF-cover-test:pil=no
# only for platform (default all - *)
#PyFPDF-cover-test:platform=*
#...
#...PyFPDF-cover-test:res=some_resource.ttf
#...PyFPDF-cover-test:res=other_resource.txt
#...
import common # common set of utilities
from fpdf import FPDF
import sys
def dotest(outputname, nostamp):
# filename - output filename
# nostamp - do no use stamp in result file
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
pdf.set_font('Arial', '', 16)
pdf.write(8, "Test template")
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
"Basic test of TrueType Unicode font handling"
#PyFPDF-cover-test:res=font/DejaVuSansCondensed.ttf
#PyFPDF-cover-test:res=dejavusanscondensed.cw.dat
import common
from fpdf.ttfonts import TTFontFile
import os, struct
def dotest(outputname, nostamp):
ttf = TTFontFile()
ttffile = os.path.join(common.basepath, "font", "DejaVuSansCondensed.ttf");
ttf.getMetrics(ttffile)
# test basic metrics:
assert round(ttf.descent, 0) == -236
assert round(ttf.capHeight, 0) == 928
assert ttf.flags == 4
assert [round(i, 0) for i in ttf.bbox] == [-918, -415, 1513, 1167]
assert ttf.italicAngle == 0
assert ttf.stemV == 87
assert round(ttf.defaultWidth, 0) == 540
assert round(ttf.underlinePosition, 0) == -63
assert round(ttf.underlineThickness, 0) == 44
# test char widths 8(against binary file generated by tfpdf.php):
data = open(os.path.join(common.basepath, "dejavusanscondensed.cw.dat"),\
"rb").read()
char_widths = struct.unpack(">%dH" % int(len(data) / 2), data)
assert len(ttf.charWidths) == len(char_widths)
diff = []
for i, (x, y) in enumerate(zip(char_widths, ttf.charWidths)):
if x != y: # compare each char width
diff.append(i)
assert not diff
# for checking assertion works ttf.charWidths[1] = 600
assert tuple(ttf.charWidths) == tuple(char_widths)
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
"Example of unicode support based on tfPDF http://www.fpdf.org/en/script/script92.php"
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=ex.pdf
#PyFPDF-cover-test:hash=f77f71491e1662a732212861a2d87928
#PyFPDF-cover-test:res=font/DejaVuSansCondensed.ttf
#PyFPDF-cover-test:res=HelloWorld.txt
import common
from fpdf import FPDF
import os
def dotest(outputname, nostamp):
pdf = FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
# Add a Unicode font (uses UTF-8)
pdf.add_font('DejaVu', '', \
os.path.join(common.basepath, "font", 'DejaVuSansCondensed.ttf'), \
uni = True)
pdf.set_font('DejaVu','',14)
# Load a UTF-8 string from a file and print it
txt = open(os.path.join(common.basepath, "HelloWorld.txt"), "rb").\
read().decode("UTF-8")
pdf.write(8, txt)
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
"Example of unicode support winfonts based on tfPDF"
# http://www.fpdf.org/en/script/script92.php
#PyFPDF-cover-test:format=PDF
#PyFPDF-cover-test:fn=winfonts.pdf
#PyFPDF-cover-test:platform=win32
#PyFPDF-cover-test:res=HelloWorld.txt
# This test can't calc hash because TTF fonts can vary on systems
import common
import fpdf
import os, time
def dotest(outputname, nostamp):
fpdf.set_global('SYSTEM_TTFONTS', "c:\\WINDOWS\\Fonts")
pdf = fpdf.FPDF()
if nostamp:
pdf._putinfo = lambda: common.test_putinfo(pdf)
pdf.add_page()
# Add a Windows System font (uses UTF-8)
t0 = time.time()
pdf.add_font('sysfont','','arial.ttf',uni=True)
pdf.set_font('sysfont','',14)
t1 = time.time()
if not nostamp:
common.log("ttf loading time", t1-t0)
# Load a UTF-8 string from a file and print it
txt = open(os.path.join(common.basepath, "HelloWorld.txt"), "rb").\
read().decode("UTF-8")
pdf.multi_cell(25, 5, txt)
pdf.text(100, 5, '1234')
pdf.write(5,'To find out what\'s new in self tutorial, click ')
pdf.set_font('','U')
link=pdf.add_link()
pdf.write(5,'here',link)
# Select a standard font (uses windows-1252)
pdf.set_font('Arial','',14)
pdf.ln(10)
pdf.write(5, 'The file size of this PDF is only 12 KB.')
pdf.output(outputname, 'F')
if __name__ == "__main__":
common.testmain(__file__, dotest)
@@ -0,0 +1,61 @@
%PDF-1.3
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Contents 4 0 R>>
endobj
4 0 obj
<</Filter /FlateDecode /Length 99>>
stream
xœUÍ1€0ÐBKË\7G½¾­±. Š…[ÁEUÙ£á™vRçvp‰l '¢»¼ùÀJµ÷ª$–Ñ×l‹køìȳ_[=åµÌníy¢7}&5
endstream
endobj
1 0 obj
<</Type /Pages
/Kids [3 0 R ]
/Count 1
/MediaBox [0 0 595.28 841.89]
>>
endobj
2 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
>>
/XObject <<
>>
>>
endobj
5 0 obj
<<
/Producer (PyFPDF 1.7.1 http://pyfpdf.googlecode.com/)
/CreationDate (D:20130308083055)
>>
endobj
6 0 obj
<<
/Type /Catalog
/Pages 1 0 R
/OpenAction [3 0 R /FitH null]
/PageLayout /OneColumn
>>
endobj
xref
0 7
0000000000 65535 f
0000000255 00000 n
0000000342 00000 n
0000000009 00000 n
0000000087 00000 n
0000000436 00000 n
0000000545 00000 n
trailer
<<
/Size 7
/Root 6 0 R
/Info 5 0 R
>>
startxref
648
%%EOF
@@ -0,0 +1,21 @@
"Tests new dashed line feature (issue 35)"
from fpdf import FPDF
import os
pdf=FPDF()
pdf.add_page()
pdf.dashed_line(10, 10, 110, 10)
pdf.dashed_line(10, 20, 110, 20, 5, 5)
pdf.dashed_line(10, 30, 110, 30, 1, 10)
fn = 'dashed_line_issue35.pdf'
pdf.output(fn,'F')
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)
@@ -0,0 +1,29 @@
# Example of unicode support based on tfPDF
# http://www.fpdf.org/en/script/script92.php
from fpdf import FPDF
import sys
pdf = FPDF()
pdf.add_page()
# Add a Unicode font (uses UTF-8)
pdf.add_font('DejaVu','','DejaVuSansCondensed.ttf',uni=True)
pdf.set_font('DejaVu','',14)
fn = 'ex.pdf'
# Load a UTF-8 string from a file and print it
txt = open('HelloWorld.txt').read()
pdf.write(8, txt)
# Select a standard font (uses windows-1252)
pdf.set_font('Arial','',14)
pdf.ln(10)
pdf.write(5, 'The file size of this PDF is only 12 KB.')
pdf.output(fn,'F')
import os
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)
Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

+99
View File
@@ -0,0 +1,99 @@
# -*- coding: latin-1 -*-
"HTML Renderer for FPDF.py"
__author__ = "Mariano Reingart <reingart@gmail.com>"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
__license__ = "LGPL 3.0"
# Inspired by tuto5.py and several examples from fpdf.org, html2fpdf, etc.
from fpdf import FPDF, HTMLMixin
if __name__=='__main__':
html="""
<H1 align="center">html2fpdf</H1>
<h2>Basic usage</h2>
<p>You can now easily print text mixing different
styles : <B>bold</B>, <I>italic</I>, <U>underlined</U>, or
<B><I><U>all at once</U></I></B>!<BR>You can also insert links
on text, such as <A HREF="http://www.fpdf.org">www.fpdf.org</A>,
or on an image: click on the logo.<br>
<center>
<A HREF="http://www.fpdf.org"><img src="../tutorial/logo.png" width="104" height="71"></A>
</center>
<h3>Sample List</h3>
<ul><li>option 1</li>
<ol><li>option 2</li></ol>
<li>option 3</li></ul>
<table border="0" align="center" width="50%">
<thead><tr><th width="30%">Header 1</th><th width="70%">header 2</th></tr></thead>
<tbody>
<tr><td>cell 1</td><td>cell 2</td></tr>
<tr><td>cell 2</td><td>cell 3</td></tr>
</tbody>
</table>
<table border="1">
<thead><tr bgcolor="#A0A0A0"><th width="30%">Header 1</th><th width="70%">header 2</th></tr></thead>
<tfoot><tr bgcolor="#E0E0E0"><td>footer 1</td><td>footer 2</td></tr></tfoot>
<tbody>
<tr><td>cell 1</td><td>cell 2</td></tr>
<tr>
<td width="30%">cell 1</td><td width="70%" bgcolor="#D0D0FF" align='right'>cell 2</td>
</tr>
</tbody>
<tbody><tr><td colspan="2">cell spanned</td></tr></tbody>
<tbody>
""" + """<tr bgcolor="#F0F0F0">
<td>cell 3</td><td>cell 4</td>
</tr><tr bgcolor="#FFFFFF">
<td>cell 5</td><td>cell 6</td>
</tr>""" * 200 + """
</tbody>
</table>
<font face='helvetica' size='40'>Font example: Arial 40pt</font>
"""
class MyFPDF(FPDF, HTMLMixin):
def header(self):
self.image('../tutorial/logo_pb.png',10,8,33)
self.set_font('Arial','B',15)
self.cell(80)
self.cell(30,10,'Title',1,0,'C')
self.ln(20)
def footer(self):
self.set_y(-15)
self.set_font('Arial','I',8)
txt = 'Page %s of %s' % (self.page_no(), self.alias_nb_pages())
self.cell(0,10,txt,0,0,'C')
pdf=MyFPDF()
#First page
pdf.add_page()
pdf.write_html(html)
# this will fail (tables without widht are not supported):
try:
pdf.write_html("""<table><tr><td></td></tr></table>""")
except RuntimeError:
pass
# this may be rendered incorrectly as currently there is no two pass auto-layout:
pdf.write_html("""<table><tr><th></th><td width="100%">100%</td></tr></table>""")
fn = 'html.pdf'
pdf.output(fn,'F')
import os
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)
@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
"HTML Renderer for FPDF.py (unicode)"
__author__ = "Mariano Reingart <reingart@gmail.com>"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
__license__ = "LGPL 3.0"
# Inspired by tuto5.py and several examples from fpdf.org, html2fpdf, etc.
from fpdf import FPDF, HTMLMixin
if __name__ == '__main__':
class MyFPDF(FPDF, HTMLMixin): pass
pdf=MyFPDF()
# load the unicode font
pdf.add_font('DejaVu', '', 'DejaVuSansCondensed.ttf', uni=True)
pdf.add_page()
# test the basic fonts
pdf.write_html("""<p><font face="Arial"><B>hello</B> <I>world</I></font></p>""")
pdf.write_html("""<p><font face="Times"><B>hello</B> <I>world</I></font></p>""")
pdf.write_html("""<p><font face="Courier"><B>hello</B> <I>world</I></font></p>""")
pdf.write_html("""<p><font face="zapfdingbats"><B>hello</B> <I>world</I></font></p>""")
# test the unicode (utf8) font:
# greek
pdf.write_html(u"""<p><font face="DejaVu">Γειά σου κόσμος</font></p>""")
# russian
pdf.write_html(u"""<p><font face="DejaVu">Здравствуй, Мир</font></p>""")
fn = 'html_unicode.pdf'
pdf.output(fn,'F')
import os
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

+210
View File
@@ -0,0 +1,210 @@
'barcode';'BC';20.30;246.80;140.30;254.30;'Interleaved 2of5 NT';0.75;0;0;0;0;0;'I';'200000000001000159053338016581200810081';3
'barcode_readable';'T';19.30;253.30;140.30;260.30;'Arial';10.00;0;0;0;0;0;'I';'200000000001000159053338016581200810081';3
'box';'B';15.30;15.30;185.30;260.30;'Arial';0.00;0;0;0;0;0;'I';None;0
'box_x';'B';95.30;15.30;105.30;25.30;'Arial';0.00;1;0;0;0;0;'I';None;2
'company_footer1';'T';115.30;45.30;175.30;50.30;'Arial';10.00;0;0;0;0;0;'I';'Company footer 1';2
'company_footer2';'T';115.30;50.30;175.30;55.30;'Arial';10.00;0;0;0;0;0;'I';'Company footer 2';2
'company_header1';'T';17.30;40.30;85.30;45.30;'Arial';10.00;0;0;0;0;0;'I';'Company header 1';2
'company_header2';'T';17.30;45.30;85.30;50.30;'Arial';10.00;0;0;0;0;0;'I';'Company header 2';2
'company_logo';'I';20.30;17.30;55.70;30.30;None;0.00;0;0;0;0;0;'I';'tutorial/logo.png';2
'company_name';'T';17.30;32.80;98.30;37.80;'Arial';12.00;1;0;0;0;0;'I';'Company name';2
'currency';'T';42.30;90.30;67.30;94.30;'Arial';10.00;0;0;0;0;65535;'I';'U.S.D.';0
'currency_l';'T';17.30;90.30;65.30;94.30;'Arial';10.00;0;0;0;0;0;'I';'Currency:';0
'customer_address';'T';35.30;64.30;160.30;70.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_address_l';'t';17.30;64.30;35.30;70.30;'Arial';10.00;0;0;0;0;0;'I';'Address:';0
'customer_city';'T';133.30;69.30;175.30;75.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_city_l';'T';115.30;69.30;133.30;75.30;'Arial';10.00;0;0;0;0;0;'I';'City:';0
'customer_country';'T';133.30;73.30;175.30;79.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_name';'T';35.30;59.30;175.30;65.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_name_l';'T';17.30;59.30;30.30;65.30;'Arial';10.00;0;0;0;0;0;'I';'Bill to:';0
'customer_phone';'T';35.30;69.30;115.30;75.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_phone_l';'T';17.30;69.30;35.30;75.30;'Arial';10.00;0;0;0;0;0;'I';'Phone/Fax:';0
'customer_taxid';'T';135.30;74.30;175.30;79.30;'Arial';10.00;0;0;0;0;65535;'I';None;0
'customer_taxid_l';'T';115.30;74.30;135.30;79.30;'Arial';10.00;0;0;0;0;0;'I';'Tax ID:';0
'customer_vat';'T';35.30;74.30;105.30;79.30;'Arial';10.00;0;0;0;0;0;'I';None;0
'customer_vat_l';'T';17.30;74.30;32.30;79.30;'Arial';10.00;0;0;0;0;0;'I';'VAT:';0
'document_copy';'T';105.30;21.30;140.30;25.30;'Arial';8.00;0;0;0;0;0;'C';'Original';2
'document_label';'T';105.30;15.90;180.30;21.10;'Arial Black';13.00;0;0;0;0;0;'C';'INVOICE';2
'document_number';'T';115.30;27.80;125.30;33.30;'Arial';14.00;1;0;0;0;0;'I';'N\xba: ';2
'document_type';'T';95.30;16.10;105.30;24.30;'Arial';16.00;1;0;0;0;0;'C';'X';2
'due_date';'T';65.30;82.30;85.30;86.30;'Arial';10.00;0;0;0;0;65535;'I';'31/12/2009';0
'due_date_l';'T';17.30;82.30;65.30;86.30;'Arial';10.00;0;0;0;0;0;'I';'Due Date:';0
'issue_date';'T';135.30;33.30;175.30;40.30;'Arial';12.00;0;0;0;0;65535;'I';None;0
'issue_date_l';'T';115.30;33.30;175.30;40.30;'Arial';12.00;0;0;0;0;0;'I';'Date:';0
'item_amount';'T';160.30;97.30;185.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Amount';0
'item_amount01';'T';160.30;103.30;183.30;108.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount02';'T';160.30;108.30;183.30;113.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount03';'T';160.30;113.30;183.30;118.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount04';'T';160.30;118.30;183.30;123.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount05';'T';160.30;123.30;183.30;128.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount06';'T';160.30;128.30;183.30;133.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount07';'T';160.30;133.30;183.30;138.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount08';'T';160.30;138.30;183.30;143.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount09';'T';160.30;143.30;183.30;148.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount10';'T';160.30;148.30;183.30;153.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount11';'T';160.30;153.30;183.30;158.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount12';'T';160.30;158.30;183.30;163.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount13';'T';160.30;163.30;183.30;168.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount14';'T';160.30;168.30;183.30;173.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount15';'T';160.30;173.30;183.30;178.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount16';'T';160.30;178.30;183.30;183.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount17';'T';160.30;183.30;183.30;188.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount18';'T';160.30;188.30;183.30;193.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount19';'T';160.30;193.30;183.30;198.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount20';'T';160.30;198.30;183.30;203.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount21';'T';160.30;203.30;183.30;208.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount22';'T';160.30;208.30;183.30;213.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount23';'T';160.30;213.30;183.30;218.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount24';'T';160.30;218.30;183.30;223.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_amount25';'T';160.30;223.30;183.30;228.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_code';'T';30.30;97.30;45.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Cod.';0
'item_code01';'T';30.30;103.30;43.30;108.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code02';'T';30.30;108.30;43.30;113.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code03';'T';30.30;113.30;43.30;118.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code04';'T';30.30;118.30;43.30;123.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code05';'T';30.30;123.30;43.30;128.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code06';'T';30.30;128.30;43.30;133.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code07';'T';30.30;133.30;43.30;138.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code08';'T';30.30;138.30;43.30;143.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code09';'T';30.30;143.30;43.30;148.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code10';'T';30.30;148.30;43.30;153.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code11';'T';30.30;153.30;43.30;158.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code12';'T';30.30;158.30;43.30;163.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code13';'T';30.30;163.30;43.30;168.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code14';'T';30.30;168.30;43.30;173.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code15';'T';30.30;173.30;43.30;178.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code16';'T';30.30;178.30;43.30;183.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code17';'T';30.30;183.30;43.30;188.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code18';'T';30.30;188.30;43.30;193.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code19';'T';30.30;193.30;43.30;198.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code20';'T';30.30;198.30;43.30;203.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code21';'T';30.30;203.30;43.30;208.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code22';'T';30.30;208.30;43.30;213.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code23';'T';30.30;213.30;43.30;218.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code24';'T';30.30;218.30;43.30;223.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_code25';'T';30.30;223.30;43.30;228.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description';'T';45.30;97.30;140.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Description';0
'item_description01';'T';47.30;103.30;138.30;108.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description02';'T';47.30;108.30;138.30;113.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description03';'T';47.30;113.30;138.30;118.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description04';'T';47.30;118.30;138.30;123.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description05';'T';47.30;123.30;138.30;128.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description06';'T';47.30;128.30;138.30;133.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description07';'T';47.30;133.30;138.30;138.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description08';'T';47.30;138.30;138.30;143.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description09';'T';47.30;143.30;138.30;148.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description10';'T';47.30;148.30;138.30;153.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description11';'T';47.30;153.30;138.30;158.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description12';'T';47.30;158.30;138.30;163.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description13';'T';47.30;163.30;138.30;168.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description14';'T';47.30;168.30;138.30;173.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description15';'T';47.30;173.30;138.30;178.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description16';'T';47.30;178.30;138.30;183.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description17';'T';47.30;183.30;138.30;188.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description18';'T';47.30;188.30;138.30;193.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description19';'T';47.30;193.30;138.30;198.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description20';'T';47.30;198.30;138.30;203.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description21';'T';47.30;203.30;138.30;208.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description22';'T';47.30;208.30;138.30;213.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description23';'T';47.30;213.30;138.30;218.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description24';'T';47.30;218.30;138.30;223.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_description25';'T';47.30;223.30;138.30;228.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_price';'T';140.30;97.30;160.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Price';0
'item_price01';'T';140.30;103.30;158.30;108.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price02';'T';140.30;108.30;158.30;113.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price03';'T';140.30;113.30;158.30;118.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price04';'T';140.30;118.30;158.30;123.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price05';'T';140.30;123.30;158.30;128.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price06';'T';140.30;128.30;158.30;133.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price07';'T';140.30;133.30;158.30;138.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price08';'T';140.30;138.30;158.30;143.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price09';'T';140.30;143.30;158.30;148.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price10';'T';140.30;148.30;158.30;153.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price11';'T';140.30;153.30;158.30;158.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price12';'T';140.30;158.30;158.30;163.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price13';'T';140.30;163.30;158.30;168.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price14';'T';140.30;168.30;158.30;173.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price15';'T';140.30;173.30;158.30;178.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price16';'T';140.30;178.30;158.30;183.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price17';'T';140.30;183.30;158.30;188.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price18';'T';140.30;188.30;158.30;193.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price19';'T';140.30;193.30;158.30;198.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price20';'T';140.30;198.30;158.30;203.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price21';'T';140.30;203.30;158.30;208.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price22';'T';140.30;208.30;158.30;213.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price23';'T';140.30;213.30;158.30;218.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price24';'T';140.30;218.30;158.30;223.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_price25';'T';140.30;223.30;158.30;228.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity';'T';15.30;97.30;30.30;102.30;'Arial';10.00;0;0;0;0;65535;'C';'Qty.';0
'item_quantity01';'T';15.30;103.30;25.30;108.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity02';'T';15.30;108.30;25.30;113.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity03';'T';15.30;113.30;25.30;118.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity04';'T';15.30;118.30;25.30;123.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity05';'T';15.30;123.30;25.30;128.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity06';'T';15.30;128.30;25.30;133.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity07';'T';15.30;133.30;25.30;138.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity08';'T';15.30;138.30;25.30;143.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity09';'T';15.30;143.30;25.30;148.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity10';'T';15.30;148.30;25.30;153.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity11';'T';15.30;153.30;25.30;158.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity12';'T';15.30;158.30;25.30;163.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity13';'T';15.30;163.30;25.30;168.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity14';'T';15.30;168.30;25.30;173.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity15';'T';15.30;173.30;25.30;178.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity16';'T';15.30;178.30;25.30;183.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity17';'T';15.30;183.30;25.30;188.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity18';'T';15.30;188.30;25.30;193.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity19';'T';15.30;193.30;25.30;198.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity20';'T';15.30;198.30;25.30;203.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity21';'T';15.30;203.30;25.30;208.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity22';'T';15.30;208.30;25.30;213.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity23';'T';15.30;213.30;25.30;218.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity24';'T';15.30;218.30;25.30;223.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_quantity25';'T';15.30;223.30;25.30;228.30;'Arial';10.00;0;0;0;0;65535;'D';'';0
'item_unit01';'T';24.30;103.30;30.30;108.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit02';'T';24.30;108.30;30.30;113.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit03';'T';24.30;113.30;30.30;118.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit04';'T';24.30;118.30;30.30;123.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit05';'T';24.30;123.30;30.30;128.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit06';'T';24.30;128.30;30.30;133.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit07';'T';24.30;133.30;30.30;138.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit08';'T';24.30;138.30;30.30;143.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit09';'T';24.30;143.30;30.30;148.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit10';'T';24.30;148.30;30.30;153.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit11';'T';24.30;153.30;30.30;158.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit12';'T';24.30;158.30;30.30;163.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit13';'T';24.30;163.30;30.30;168.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit14';'T';24.30;168.30;30.30;173.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit15';'T';24.30;173.30;30.30;178.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit16';'T';24.30;178.30;30.30;183.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit17';'T';24.30;183.30;30.30;188.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit18';'T';24.30;188.30;30.30;193.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit19';'T';24.30;193.30;30.30;198.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit20';'T';24.30;198.30;30.30;203.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit21';'T';24.30;203.30;30.30;208.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit22';'T';24.30;208.30;30.30;213.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit23';'T';24.30;213.30;30.30;218.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit24';'T';24.30;218.30;30.30;223.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'item_unit25';'T';24.30;223.30;30.30;228.30;'Arial';10.00;0;0;0;0;65535;'I';'';0
'line1';'L';100.30;25.30;100.30;57.30;'Arial';0;0;0;0;0;0;'I';None;3
'line2';'L';15.30;57.30;185.30;57.30;None;0.00;0;0;0;0;0;'I';None;3
'line3';'L';15.30;80.30;185.30;80.30;None;0.00;0;0;0;0;0;'I';None;3
'line5';'L';15.30;95.30;185.30;95.30;None;0.00;0;0;0;0;0;'I';None;3
'line6';'L';15.30;230.30;185.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line9';'L';15.30;102.30;185.30;102.30;None;0.00;0;0;0;0;0;'I';None;0
'line_cod';'L';45.30;95.30;45.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line_desc';'L';140.30;95.30;140.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line_price';'L';160.30;95.30;160.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'line_qty';'L';30.30;95.30;30.30;230.30;None;0.00;0;0;0;0;0;'I';None;3
'net';'T';145.30;234.30;178.30;243.30;'Arial';12.00;1;0;0;0;65535;'D';None;0
'net_l';'T';105.30;234.30;150.30;243.30;'Arial';12.00;0;0;0;0;0;'D';'NET:';0
'number';'T';125.30;25.80;185.30;35.30;'Arial';14.00;1;0;0;0;0;'I';'0000-00000000';2
'page';'T';140.30;21.30;180.30;25.30;'Arial';8.00;0;0;0;0;0;'C';'Page';2
'payment';'T';45.30;86.30;150.30;90.30;'Arial';10.00;0;0;0;0;65535;'I';'cash $';0
'payment_l';'T';17.30;86.30;45.30;90.30;'Arial';10.00;0;0;0;0;0;'I';'Payment terms:';0
'total';'T';105.30;251.30;178.30;260.30;'Arial';12.00;1;0;0;0;65535;'D';None;0
'total_box';'B';155.30;252.30;180.30;259.30;None;0.00;0;0;0;0;0;'I';None;0
'total_label';'T';125.30;251.30;150.30;260.30;'Arial';12.00;0;0;0;0;0;'D';'Total:';0
'vat';'T';145.30;241.30;178.30;250.30;'Arial';12.00;1;0;0;0;65535;'D';None;0
'vat';'T';115.30;40.30;175.30;45.30;'Arial';10.00;0;0;0;0;0;'I';'Tax or Vat number';2
'vat_l';'T';125.30;241.30;150.30;250.30;'Arial';12.00;0;0;0;0;0;'D';'VAT 21%:';0
1 'barcode' 'BC' 20.30 246.80 140.30 254.30 'Interleaved 2of5 NT' 0.75 0 0 0 0 0 'I' '200000000001000159053338016581200810081' 3
2 'barcode_readable' 'T' 19.30 253.30 140.30 260.30 'Arial' 10.00 0 0 0 0 0 'I' '200000000001000159053338016581200810081' 3
3 'box' 'B' 15.30 15.30 185.30 260.30 'Arial' 0.00 0 0 0 0 0 'I' None 0
4 'box_x' 'B' 95.30 15.30 105.30 25.30 'Arial' 0.00 1 0 0 0 0 'I' None 2
5 'company_footer1' 'T' 115.30 45.30 175.30 50.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company footer 1' 2
6 'company_footer2' 'T' 115.30 50.30 175.30 55.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company footer 2' 2
7 'company_header1' 'T' 17.30 40.30 85.30 45.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company header 1' 2
8 'company_header2' 'T' 17.30 45.30 85.30 50.30 'Arial' 10.00 0 0 0 0 0 'I' 'Company header 2' 2
9 'company_logo' 'I' 20.30 17.30 55.70 30.30 None 0.00 0 0 0 0 0 'I' 'tutorial/logo.png' 2
10 'company_name' 'T' 17.30 32.80 98.30 37.80 'Arial' 12.00 1 0 0 0 0 'I' 'Company name' 2
11 'currency' 'T' 42.30 90.30 67.30 94.30 'Arial' 10.00 0 0 0 0 65535 'I' 'U.S.D.' 0
12 'currency_l' 'T' 17.30 90.30 65.30 94.30 'Arial' 10.00 0 0 0 0 0 'I' 'Currency:' 0
13 'customer_address' 'T' 35.30 64.30 160.30 70.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
14 'customer_address_l' 't' 17.30 64.30 35.30 70.30 'Arial' 10.00 0 0 0 0 0 'I' 'Address:' 0
15 'customer_city' 'T' 133.30 69.30 175.30 75.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
16 'customer_city_l' 'T' 115.30 69.30 133.30 75.30 'Arial' 10.00 0 0 0 0 0 'I' 'City:' 0
17 'customer_country' 'T' 133.30 73.30 175.30 79.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
18 'customer_name' 'T' 35.30 59.30 175.30 65.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
19 'customer_name_l' 'T' 17.30 59.30 30.30 65.30 'Arial' 10.00 0 0 0 0 0 'I' 'Bill to:' 0
20 'customer_phone' 'T' 35.30 69.30 115.30 75.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
21 'customer_phone_l' 'T' 17.30 69.30 35.30 75.30 'Arial' 10.00 0 0 0 0 0 'I' 'Phone/Fax:' 0
22 'customer_taxid' 'T' 135.30 74.30 175.30 79.30 'Arial' 10.00 0 0 0 0 65535 'I' None 0
23 'customer_taxid_l' 'T' 115.30 74.30 135.30 79.30 'Arial' 10.00 0 0 0 0 0 'I' 'Tax ID:' 0
24 'customer_vat' 'T' 35.30 74.30 105.30 79.30 'Arial' 10.00 0 0 0 0 0 'I' None 0
25 'customer_vat_l' 'T' 17.30 74.30 32.30 79.30 'Arial' 10.00 0 0 0 0 0 'I' 'VAT:' 0
26 'document_copy' 'T' 105.30 21.30 140.30 25.30 'Arial' 8.00 0 0 0 0 0 'C' 'Original' 2
27 'document_label' 'T' 105.30 15.90 180.30 21.10 'Arial Black' 13.00 0 0 0 0 0 'C' 'INVOICE' 2
28 'document_number' 'T' 115.30 27.80 125.30 33.30 'Arial' 14.00 1 0 0 0 0 'I' 'N\xba: ' 2
29 'document_type' 'T' 95.30 16.10 105.30 24.30 'Arial' 16.00 1 0 0 0 0 'C' 'X' 2
30 'due_date' 'T' 65.30 82.30 85.30 86.30 'Arial' 10.00 0 0 0 0 65535 'I' '31/12/2009' 0
31 'due_date_l' 'T' 17.30 82.30 65.30 86.30 'Arial' 10.00 0 0 0 0 0 'I' 'Due Date:' 0
32 'issue_date' 'T' 135.30 33.30 175.30 40.30 'Arial' 12.00 0 0 0 0 65535 'I' None 0
33 'issue_date_l' 'T' 115.30 33.30 175.30 40.30 'Arial' 12.00 0 0 0 0 0 'I' 'Date:' 0
34 'item_amount' 'T' 160.30 97.30 185.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Amount' 0
35 'item_amount01' 'T' 160.30 103.30 183.30 108.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
36 'item_amount02' 'T' 160.30 108.30 183.30 113.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
37 'item_amount03' 'T' 160.30 113.30 183.30 118.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
38 'item_amount04' 'T' 160.30 118.30 183.30 123.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
39 'item_amount05' 'T' 160.30 123.30 183.30 128.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
40 'item_amount06' 'T' 160.30 128.30 183.30 133.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
41 'item_amount07' 'T' 160.30 133.30 183.30 138.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
42 'item_amount08' 'T' 160.30 138.30 183.30 143.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
43 'item_amount09' 'T' 160.30 143.30 183.30 148.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
44 'item_amount10' 'T' 160.30 148.30 183.30 153.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
45 'item_amount11' 'T' 160.30 153.30 183.30 158.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
46 'item_amount12' 'T' 160.30 158.30 183.30 163.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
47 'item_amount13' 'T' 160.30 163.30 183.30 168.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
48 'item_amount14' 'T' 160.30 168.30 183.30 173.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
49 'item_amount15' 'T' 160.30 173.30 183.30 178.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
50 'item_amount16' 'T' 160.30 178.30 183.30 183.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
51 'item_amount17' 'T' 160.30 183.30 183.30 188.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
52 'item_amount18' 'T' 160.30 188.30 183.30 193.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
53 'item_amount19' 'T' 160.30 193.30 183.30 198.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
54 'item_amount20' 'T' 160.30 198.30 183.30 203.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
55 'item_amount21' 'T' 160.30 203.30 183.30 208.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
56 'item_amount22' 'T' 160.30 208.30 183.30 213.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
57 'item_amount23' 'T' 160.30 213.30 183.30 218.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
58 'item_amount24' 'T' 160.30 218.30 183.30 223.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
59 'item_amount25' 'T' 160.30 223.30 183.30 228.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
60 'item_code' 'T' 30.30 97.30 45.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Cod.' 0
61 'item_code01' 'T' 30.30 103.30 43.30 108.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
62 'item_code02' 'T' 30.30 108.30 43.30 113.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
63 'item_code03' 'T' 30.30 113.30 43.30 118.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
64 'item_code04' 'T' 30.30 118.30 43.30 123.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
65 'item_code05' 'T' 30.30 123.30 43.30 128.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
66 'item_code06' 'T' 30.30 128.30 43.30 133.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
67 'item_code07' 'T' 30.30 133.30 43.30 138.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
68 'item_code08' 'T' 30.30 138.30 43.30 143.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
69 'item_code09' 'T' 30.30 143.30 43.30 148.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
70 'item_code10' 'T' 30.30 148.30 43.30 153.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
71 'item_code11' 'T' 30.30 153.30 43.30 158.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
72 'item_code12' 'T' 30.30 158.30 43.30 163.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
73 'item_code13' 'T' 30.30 163.30 43.30 168.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
74 'item_code14' 'T' 30.30 168.30 43.30 173.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
75 'item_code15' 'T' 30.30 173.30 43.30 178.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
76 'item_code16' 'T' 30.30 178.30 43.30 183.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
77 'item_code17' 'T' 30.30 183.30 43.30 188.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
78 'item_code18' 'T' 30.30 188.30 43.30 193.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
79 'item_code19' 'T' 30.30 193.30 43.30 198.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
80 'item_code20' 'T' 30.30 198.30 43.30 203.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
81 'item_code21' 'T' 30.30 203.30 43.30 208.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
82 'item_code22' 'T' 30.30 208.30 43.30 213.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
83 'item_code23' 'T' 30.30 213.30 43.30 218.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
84 'item_code24' 'T' 30.30 218.30 43.30 223.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
85 'item_code25' 'T' 30.30 223.30 43.30 228.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
86 'item_description' 'T' 45.30 97.30 140.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Description' 0
87 'item_description01' 'T' 47.30 103.30 138.30 108.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
88 'item_description02' 'T' 47.30 108.30 138.30 113.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
89 'item_description03' 'T' 47.30 113.30 138.30 118.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
90 'item_description04' 'T' 47.30 118.30 138.30 123.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
91 'item_description05' 'T' 47.30 123.30 138.30 128.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
92 'item_description06' 'T' 47.30 128.30 138.30 133.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
93 'item_description07' 'T' 47.30 133.30 138.30 138.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
94 'item_description08' 'T' 47.30 138.30 138.30 143.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
95 'item_description09' 'T' 47.30 143.30 138.30 148.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
96 'item_description10' 'T' 47.30 148.30 138.30 153.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
97 'item_description11' 'T' 47.30 153.30 138.30 158.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
98 'item_description12' 'T' 47.30 158.30 138.30 163.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
99 'item_description13' 'T' 47.30 163.30 138.30 168.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
100 'item_description14' 'T' 47.30 168.30 138.30 173.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
101 'item_description15' 'T' 47.30 173.30 138.30 178.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
102 'item_description16' 'T' 47.30 178.30 138.30 183.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
103 'item_description17' 'T' 47.30 183.30 138.30 188.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
104 'item_description18' 'T' 47.30 188.30 138.30 193.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
105 'item_description19' 'T' 47.30 193.30 138.30 198.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
106 'item_description20' 'T' 47.30 198.30 138.30 203.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
107 'item_description21' 'T' 47.30 203.30 138.30 208.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
108 'item_description22' 'T' 47.30 208.30 138.30 213.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
109 'item_description23' 'T' 47.30 213.30 138.30 218.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
110 'item_description24' 'T' 47.30 218.30 138.30 223.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
111 'item_description25' 'T' 47.30 223.30 138.30 228.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
112 'item_price' 'T' 140.30 97.30 160.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Price' 0
113 'item_price01' 'T' 140.30 103.30 158.30 108.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
114 'item_price02' 'T' 140.30 108.30 158.30 113.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
115 'item_price03' 'T' 140.30 113.30 158.30 118.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
116 'item_price04' 'T' 140.30 118.30 158.30 123.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
117 'item_price05' 'T' 140.30 123.30 158.30 128.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
118 'item_price06' 'T' 140.30 128.30 158.30 133.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
119 'item_price07' 'T' 140.30 133.30 158.30 138.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
120 'item_price08' 'T' 140.30 138.30 158.30 143.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
121 'item_price09' 'T' 140.30 143.30 158.30 148.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
122 'item_price10' 'T' 140.30 148.30 158.30 153.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
123 'item_price11' 'T' 140.30 153.30 158.30 158.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
124 'item_price12' 'T' 140.30 158.30 158.30 163.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
125 'item_price13' 'T' 140.30 163.30 158.30 168.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
126 'item_price14' 'T' 140.30 168.30 158.30 173.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
127 'item_price15' 'T' 140.30 173.30 158.30 178.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
128 'item_price16' 'T' 140.30 178.30 158.30 183.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
129 'item_price17' 'T' 140.30 183.30 158.30 188.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
130 'item_price18' 'T' 140.30 188.30 158.30 193.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
131 'item_price19' 'T' 140.30 193.30 158.30 198.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
132 'item_price20' 'T' 140.30 198.30 158.30 203.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
133 'item_price21' 'T' 140.30 203.30 158.30 208.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
134 'item_price22' 'T' 140.30 208.30 158.30 213.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
135 'item_price23' 'T' 140.30 213.30 158.30 218.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
136 'item_price24' 'T' 140.30 218.30 158.30 223.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
137 'item_price25' 'T' 140.30 223.30 158.30 228.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
138 'item_quantity' 'T' 15.30 97.30 30.30 102.30 'Arial' 10.00 0 0 0 0 65535 'C' 'Qty.' 0
139 'item_quantity01' 'T' 15.30 103.30 25.30 108.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
140 'item_quantity02' 'T' 15.30 108.30 25.30 113.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
141 'item_quantity03' 'T' 15.30 113.30 25.30 118.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
142 'item_quantity04' 'T' 15.30 118.30 25.30 123.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
143 'item_quantity05' 'T' 15.30 123.30 25.30 128.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
144 'item_quantity06' 'T' 15.30 128.30 25.30 133.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
145 'item_quantity07' 'T' 15.30 133.30 25.30 138.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
146 'item_quantity08' 'T' 15.30 138.30 25.30 143.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
147 'item_quantity09' 'T' 15.30 143.30 25.30 148.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
148 'item_quantity10' 'T' 15.30 148.30 25.30 153.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
149 'item_quantity11' 'T' 15.30 153.30 25.30 158.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
150 'item_quantity12' 'T' 15.30 158.30 25.30 163.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
151 'item_quantity13' 'T' 15.30 163.30 25.30 168.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
152 'item_quantity14' 'T' 15.30 168.30 25.30 173.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
153 'item_quantity15' 'T' 15.30 173.30 25.30 178.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
154 'item_quantity16' 'T' 15.30 178.30 25.30 183.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
155 'item_quantity17' 'T' 15.30 183.30 25.30 188.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
156 'item_quantity18' 'T' 15.30 188.30 25.30 193.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
157 'item_quantity19' 'T' 15.30 193.30 25.30 198.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
158 'item_quantity20' 'T' 15.30 198.30 25.30 203.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
159 'item_quantity21' 'T' 15.30 203.30 25.30 208.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
160 'item_quantity22' 'T' 15.30 208.30 25.30 213.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
161 'item_quantity23' 'T' 15.30 213.30 25.30 218.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
162 'item_quantity24' 'T' 15.30 218.30 25.30 223.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
163 'item_quantity25' 'T' 15.30 223.30 25.30 228.30 'Arial' 10.00 0 0 0 0 65535 'D' '' 0
164 'item_unit01' 'T' 24.30 103.30 30.30 108.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
165 'item_unit02' 'T' 24.30 108.30 30.30 113.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
166 'item_unit03' 'T' 24.30 113.30 30.30 118.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
167 'item_unit04' 'T' 24.30 118.30 30.30 123.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
168 'item_unit05' 'T' 24.30 123.30 30.30 128.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
169 'item_unit06' 'T' 24.30 128.30 30.30 133.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
170 'item_unit07' 'T' 24.30 133.30 30.30 138.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
171 'item_unit08' 'T' 24.30 138.30 30.30 143.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
172 'item_unit09' 'T' 24.30 143.30 30.30 148.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
173 'item_unit10' 'T' 24.30 148.30 30.30 153.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
174 'item_unit11' 'T' 24.30 153.30 30.30 158.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
175 'item_unit12' 'T' 24.30 158.30 30.30 163.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
176 'item_unit13' 'T' 24.30 163.30 30.30 168.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
177 'item_unit14' 'T' 24.30 168.30 30.30 173.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
178 'item_unit15' 'T' 24.30 173.30 30.30 178.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
179 'item_unit16' 'T' 24.30 178.30 30.30 183.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
180 'item_unit17' 'T' 24.30 183.30 30.30 188.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
181 'item_unit18' 'T' 24.30 188.30 30.30 193.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
182 'item_unit19' 'T' 24.30 193.30 30.30 198.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
183 'item_unit20' 'T' 24.30 198.30 30.30 203.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
184 'item_unit21' 'T' 24.30 203.30 30.30 208.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
185 'item_unit22' 'T' 24.30 208.30 30.30 213.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
186 'item_unit23' 'T' 24.30 213.30 30.30 218.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
187 'item_unit24' 'T' 24.30 218.30 30.30 223.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
188 'item_unit25' 'T' 24.30 223.30 30.30 228.30 'Arial' 10.00 0 0 0 0 65535 'I' '' 0
189 'line1' 'L' 100.30 25.30 100.30 57.30 'Arial' 0 0 0 0 0 0 'I' None 3
190 'line2' 'L' 15.30 57.30 185.30 57.30 None 0.00 0 0 0 0 0 'I' None 3
191 'line3' 'L' 15.30 80.30 185.30 80.30 None 0.00 0 0 0 0 0 'I' None 3
192 'line5' 'L' 15.30 95.30 185.30 95.30 None 0.00 0 0 0 0 0 'I' None 3
193 'line6' 'L' 15.30 230.30 185.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
194 'line9' 'L' 15.30 102.30 185.30 102.30 None 0.00 0 0 0 0 0 'I' None 0
195 'line_cod' 'L' 45.30 95.30 45.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
196 'line_desc' 'L' 140.30 95.30 140.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
197 'line_price' 'L' 160.30 95.30 160.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
198 'line_qty' 'L' 30.30 95.30 30.30 230.30 None 0.00 0 0 0 0 0 'I' None 3
199 'net' 'T' 145.30 234.30 178.30 243.30 'Arial' 12.00 1 0 0 0 65535 'D' None 0
200 'net_l' 'T' 105.30 234.30 150.30 243.30 'Arial' 12.00 0 0 0 0 0 'D' 'NET:' 0
201 'number' 'T' 125.30 25.80 185.30 35.30 'Arial' 14.00 1 0 0 0 0 'I' '0000-00000000' 2
202 'page' 'T' 140.30 21.30 180.30 25.30 'Arial' 8.00 0 0 0 0 0 'C' 'Page' 2
203 'payment' 'T' 45.30 86.30 150.30 90.30 'Arial' 10.00 0 0 0 0 65535 'I' 'cash $' 0
204 'payment_l' 'T' 17.30 86.30 45.30 90.30 'Arial' 10.00 0 0 0 0 0 'I' 'Payment terms:' 0
205 'total' 'T' 105.30 251.30 178.30 260.30 'Arial' 12.00 1 0 0 0 65535 'D' None 0
206 'total_box' 'B' 155.30 252.30 180.30 259.30 None 0.00 0 0 0 0 0 'I' None 0
207 'total_label' 'T' 125.30 251.30 150.30 260.30 'Arial' 12.00 0 0 0 0 0 'D' 'Total:' 0
208 'vat' 'T' 145.30 241.30 178.30 250.30 'Arial' 12.00 1 0 0 0 65535 'D' None 0
209 'vat' 'T' 115.30 40.30 175.30 45.30 'Arial' 10.00 0 0 0 0 0 'I' 'Tax or Vat number' 2
210 'vat_l' 'T' 125.30 241.30 150.30 250.30 'Arial' 12.00 0 0 0 0 0 'D' 'VAT 21%:' 0
+120
View File
@@ -0,0 +1,120 @@
# -*- coding: iso-8859-1 -*-
"PDF Template Helper for FPDF.py"
__author__ = "Mariano Reingart <reingart@gmail.com>"
__copyright__ = "Copyright (C) 2010 Mariano Reingart"
__license__ = "LGPL 3.0"
import sys, os
from fpdf import Template
if __name__ == "__main__":
# generate sample invoice (according Argentina's regulations)
import random
from decimal import Decimal
f = Template(format="A4",
title="Sample Invoice", author="Sample Company",
subject="Sample Customer", keywords="Electronic TAX Invoice")
f.parse_csv(infile="invoice.csv", delimiter=";", decimal_sep=",")
detail = "Lorem ipsum dolor sit amet, consectetur. " * 30
items = []
for i in range(1, 30):
ds = "Sample product %s" % i
qty = random.randint(1,10)
price = round(random.random()*100,3)
code = "%s%s%02d" % (chr(random.randint(65,90)), chr(random.randint(65,90)),i)
items.append(dict(code=code, unit='u',
qty=qty, price=price,
amount=qty*price,
ds="%s: %s" % (i,ds)))
# divide and count lines
lines = 0
li_items = []
for it in items:
qty = it['qty']
code = it['code']
unit = it['unit']
for ds in f.split_multicell(it['ds'], 'item_description01'):
# add item description line (without price nor amount)
li_items.append(dict(code=code, ds=ds, qty=qty, unit=unit, price=None, amount=None))
# clean qty and code (show only at first)
unit = qty = code = None
# set last item line price and amount
li_items[-1].update(amount = it['amount'],
price = it['price'])
obs="\n<U>Detail:</U>\n\n" + detail
for ds in f.split_multicell(obs, 'item_description01'):
li_items.append(dict(code=code, ds=ds, qty=qty, unit=unit, price=None, amount=None))
# calculate pages:
lines = len(li_items)
max_lines_per_page = 24
pages = int(lines / (max_lines_per_page - 1))
if lines % (max_lines_per_page - 1): pages = pages + 1
# completo campos y hojas
for page in range(1, int(pages)+1):
f.add_page()
f['page'] = 'Page %s of %s' % (page, pages)
if pages>1 and page<pages:
s = 'Continues on page %s' % (page+1)
else:
s = ''
f['item_description%02d' % (max_lines_per_page+1)] = s
f["company_name"] = "Sample Company"
f["company_logo"] = "../tutorial/logo.png"
f["company_header1"] = "Some Address - somewhere -"
f["company_header2"] = "http://www.example.com"
f["company_footer1"] = "Tax Code ..."
f["company_footer2"] = "Tax/VAT ID ..."
f['number'] = '0001-00001234'
f['issue_date'] = '2010-09-10'
f['due_date'] = '2099-09-10'
f['customer_name'] = "Sample Client"
f['customer_address'] = "Siempreviva 1234"
# print line item...
li = 0
k = 0
total = Decimal("0.00")
for it in li_items:
k = k + 1
if k > page * (max_lines_per_page - 1):
break
if it['amount']:
total += Decimal("%.6f" % it['amount'])
if k > (page - 1) * (max_lines_per_page - 1):
li += 1
if it['qty'] is not None:
f['item_quantity%02d' % li] = it['qty']
if it['code'] is not None:
f['item_code%02d' % li] = it['code']
if it['unit'] is not None:
f['item_unit%02d' % li] = it['unit']
f['item_description%02d' % li] = it['ds']
if it['price'] is not None:
f['item_price%02d' % li] = "%0.3f" % it['price']
if it['amount'] is not None:
f['item_amount%02d' % li] = "%0.2f" % it['amount']
if pages == page:
f['net'] = "%0.2f" % (total/Decimal("1.21"))
f['vat'] = "%0.2f" % (total*(1-1/Decimal("1.21")))
f['total_label'] = 'Total:'
else:
f['total_label'] = 'SubTotal:'
f['total'] = "%0.2f" % total
f.render("./invoice.pdf")
if sys.platform.startswith("linux"):
os.system("evince ./invoice.pdf")
else:
os.startfile("./invoice.pdf")
@@ -0,0 +1,19 @@
"Test images flow mode (cell-like, trigger page breaks)"
from fpdf import FPDF, FPDF_VERSION
print(FPDF_VERSION)
pdf=FPDF()
pdf.add_page()
for i in range(1,41):
# for flow mode, do not pass x or y:
pdf.image('../tutorial/logo_pb.png')
fn = 'issue14.pdf'
pdf.output(fn,'F')
import os
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)
@@ -0,0 +1,97 @@
"Test issue 33 (Cannot import GIF files that don't have transparency)"
from fpdf import FPDF, FPDF_VERSION
import os, tempfile
try:
import Image
except:
from PIL import Image
def genbar():
# bg
bg = Image.new("L", (112, 1), 1)
bg = bg.resize((112, 11))
# stripes
vbarnum = [0x4F43484B, 0xEE90D642, 0xF11A2735, 0xD71A]
vbar = Image.new("L", (112, 1), 1)
pix = vbar.load()
pos = 0
for b in vbarnum:
for i in range(32):
pix[pos, 0] = 0 if (b & 1) else 1
b = b >> 1
pos += 1
if pos >= 112: break
vbar = vbar.resize((112, 31), Image.NEAREST)
# digit
dignum = [0x398, 0x6dc, 0x61a, 0x31b, 0x1bf, 0x6d8, 0x7d8]
dbar = Image.new("L", (16, 7), 1)
pix = dbar.load()
pos = 0
ypos = 0
for b in dignum:
for i in range(16):
pix[pos, ypos] = 0 if (b & 1) else 1
b = b >> 1
pos += 1
ypos += 1
pos = 0
# result
bar = Image.new("L", (114, 44), 2)
bar.paste(vbar, (1, 1))
bar.paste(bg, (1, 32))
for i in range(4):
bar.paste(dbar, (35 + i * 12, 34))
return bar
plane = genbar()
palette = (0,0,0, 255,255,255) + (128,128,128)*254
img = Image.fromstring("P", plane.size, plane.tostring())
img.putpalette(palette)
f = tempfile.NamedTemporaryFile(delete = False, suffix = ".gif")
gif1 = f.name
f.close()
f = tempfile.NamedTemporaryFile(delete = False, suffix = ".gif")
gif2 = f.name
f.close()
img.save(gif1, "GIF")
img.save(gif2, "GIF", transparency = 1)
pdf=FPDF()
pdf.compress = False
pdf.add_page()
pdf.set_font('Arial', '', 16)
pdf.write(8, "Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.image(gif1, x = 15, y = 15)
pdf.write(8, "Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.write(8, " Transparency")
pdf.ln()
pdf.image(gif2, x = 15, y = 39)
fn = 'issue33.pdf'
pdf.output(fn,'F')
os.unlink(gif1)
os.unlink(gif2)
try:
os.startfile(fn)
except:
os.system("xdg-open \"%s\"" % fn)

Some files were not shown because too many files have changed in this diff Show More