From 641cd8a952ba4cf8c50ea2ca0057515b8b8cbcd6 Mon Sep 17 00:00:00 2001 From: Robert Lawrence Date: Sun, 31 Jul 2011 09:41:47 -0500 Subject: [PATCH] made internal for version control --- fpdf.rbbas | 1 + fpdf.rbo | Bin 125976 -> 0 bytes rsfpdf.rbvcp | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fpdf.rbbas delete mode 100755 fpdf.rbo diff --git a/fpdf.rbbas b/fpdf.rbbas new file mode 100644 index 0000000..5ce3673 --- /dev/null +++ b/fpdf.rbbas @@ -0,0 +1 @@ +#tag Class Protected Class fpdf #tag Method, Flags = &h1 Protected Function AcceptPageBreak() As boolean //Accept automatic page break or not return me.AutoPageBreak End Function #tag EndMethod #tag Method, Flags = &h0 Sub AddFont(Family as string, optional Style as string = "", optional File as string = "") dim FontKey as string dim FontInfo as new Collection //Add a TrueType or Type1 font family = Family.Lowercase if file = "" then file = Family.ReplaceAll(" ","") + Style.Lowercase if Family = "arial" then Family = "helvetica" Style = Style.Uppercase if Style = "IB" then style = "BI" fontKey = Family + Style if Fonts.Item(FontKey) <> nil then me.Error("Font already added: " + family + " " + style) return end if if me.LoadCharTable(File) = false then me.Error("Could not include font definition file") return end if 'fontinfo.Add me.Fonts.Count + 1, "i" 'fontinfo.Add type, "type" ' 'fontinfo.Add name, "name" 'fontinfo.Add desc, "desc" 'fontinfo.add 'fontinfo.Add me.CoreFonts.Item(fontkey), "name" 'fontinfo.Add -100, "up" 'fontinfo.Add 50, "ut" 'fontinfo.Add me.CharWidths.Item(fontkey), "cw" ' 'me.fonts.Add collection(fontinfo), fontkey ' ' '$this->fonts[$fontkey]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file); 'if($diff) '{ '//Search existing encodings '$d=0; '$nb=count($this->diffs); 'for($i=1;$i<=$nb;$i++) '{ 'if($this->diffs[$i]==$diff) '{ '$d=$i; 'break; '} '} 'if($d==0) '{ '$d=$nb+1; '$this->diffs[$d]=$diff; '} '$this->fonts[$fontkey]['diff']=$d; '} 'if($file) '{ 'if($type=='TrueType') '$this->FontFiles[$file]=array('length1'=>$originalsize); 'else '$this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2); '} End Sub #tag EndMethod #tag Method, Flags = &h0 Function AddLink() As String dim n as integer dim detLink as new Collection //Create a new internal link n = me.links.Count + 1 detLink.Add nil, "link" me.links.Add detLink, str(n) return str(n) End Function #tag EndMethod #tag Method, Flags = &h0 Sub AddPage(optional orientation as string = "") dim family,style as string dim size,lw as double dim cf as Boolean dim dc,fc,tc as string //Start a new page if(me.state = 0) then me.Open() family = me.FontFamily style = me.FontStyle if me.Underline then style = me.FontStyle + "U" size = me.FontSizePt lw = me.LineWidth dc = me.DrawColor fc = me.FillColor tc = me.TextColor cf = me.ColorFlag if(me.page > 0) then //Page footer me.InFooter = true me.Footer() me.InFooter = false //Close page me.endpage() end if //Start new page me.beginpage(orientation) //Set line cap style to square me.out("2 J") //Set line width me.LineWidth = lw me.out( fNum(lw * me.k,"0.00") + " w" ) //Set font if(family <> "") then me.SetFont(family,style,size) //Set colors me.DrawColor = dc if(dc <> "0 G") then me.out(dc) me.FillColor=fc if(fc <> "0 g") then me.out(fc) me.TextColor = tc me.ColorFlag = cf //Page header me.Header() //Restore line width if(me.LineWidth <> lw) then me.LineWidth = lw me.out( fNum(lw * me.k,"0.00") + " w" ) end if //Restore font if(family <> "") then me.SetFont(family,style,size) //Restore colors if(me.DrawColor <> dc) then me.DrawColor = dc me.out(dc) end if if(me.FillColor <> fc) then me.FillColor=fc me.out(fc) end if me.TextColor = tc me.ColorFlag = cf End Sub #tag EndMethod #tag Method, Flags = &h0 Sub AliasNbPages(optional alias as string = "{nb}") //Define an alias for total number of pages me.AliasNbPages = alias End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub BeginPage(optional orientation as string = "") me.page = me.page + 1 me.Pages.append "" me.state=2 me.x = me.lMargin me.y = me.tMargin me.FontFamily = "" //Page orientation if(orientation = "") then orientation = me.DefOrientation else orientation = orientation.Uppercase.Left(1) if(orientation <> me.DefOrientation) then me.OrientationChanges.Add true, str(me.Page) end if end if if(orientation <> me.CurOrientation) then //Change orientation if(orientation = "P") then me.wPt = me.fwPt me.hPt = me.fhPt me.w = me.fw me.h = me.fh else me.wPt = me.fhPt me.hPt = me.fwPt me.w = me.fh me.h = me.fw end if me.PageBreakTrigger = me.h - me.bMargin me.CurOrientation = orientation end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Cell(w as double,optional h as double = 0, optional txt as string = "", optional border as variant = 0, optional ln as integer = 0, optional align as string = "", optional fill as integer = 0, optional link as string = "") dim x,y,ws,k,dx,sw as double dim s,op as string //Output a cell k = me.k if(me.y + h > me.PageBreakTrigger AND not me.InFooter and me.AcceptPageBreak() ) then //Automatic page break x = me.x ws = me.ws if( ws > 0) then me.ws=0 me.out("0 Tw") end if me.AddPage(me.CurOrientation) me.x = x if(ws > 0) then me.ws = ws me.out( fNum( ws * k, "0.000") + " Tw") end if end if if( w = 0 ) then w = me.w - me.rMargin - me.x s = "" if ( fill = 1 or border = 1) then if( fill = 1) then if border = 1 then op = "B" else op = "f" end if else op = "S" end if s = fNum(me.x * k,"0.00") + " " + _ fNum((me.h - me.y) * k,"0.00") + " " + _ fNum(w * k,"0.00") + " " + _ fNum( - (h * k),"0.00") + " re " + _ op + " " end if if(not border.IsNumeric) then x = me.x y = me.y if border.StringValue.InStr("L") > 0 then s = s + fNum(x * k,"0.00") + " " + _ fNum((me.h - y) * k,"0.00") + " m " + _ fNum(x * k,"0.00") + " " + _ fNum((me.h - (y + h)) * k,"0.00") + " l S " end if if border.StringValue.InStr("T") > 0 then s = s + fNum(x * k,"0.00") + " " + _ fNum((me.h - y) * k,"0.00") + " m " + _ fNum((x + w) * k,"0.00") + " " + _ fNum((me.h - y) * k,"0.00") + " l S " end if if border.StringValue.InStr("R") > 0 then s = s + fNum((x+w)*k,"0.00") + " " + _ fNum((me.h-y)*k,"0.00") + " m " + _ fNum((x+w)*k,"0.00") + " " + _ fNum((me.h-(y+h))*k,"0.00") + " l S " end if if border.StringValue.InStr("B") > 0 then s = s + fNum(x*k,"0.00") + " " + _ fNum((me.h-(y+h))*k,"0.00") + " m " + _ fNum((x+w)*k,"0.00") + " " + _ fNum((me.h-(y+h))*k,"0.00") + " l S " end if end if if(txt <> "") then select case align case "R" sw = me.GetStringWidth(txt) dx = w - me.cMargin - sw case "C" sw = me.GetStringWidth(txt) dx = (w - sw) / 2 case else dx = me.cMargin end select if (me.ColorFlag) then s = s + "q " + me.TextColor + " " end if s = s + "BT " + _ fNum( (me.x + dx) * k,"0.00") + " " + _ fNum( (me.h - (me.y + 0.5 * h + 0.3 * me.FontSize)) * k,"0.00") + " Td " + _ me.textstring(txt) + " Tj ET" if ( me.underline = true ) then s = s + " " + me.dounderline(me.x + dx, me.y + 0.5 * h + 0.3 * me.FontSize, txt) end if if(me.ColorFlag) then s = s + " Q" end if if(link <> "") then me.Link(me.x + dx, me.y + 0.5 * h - 0.5 * me.FontSize, me.GetStringWidth(txt),me.FontSize,link) end if end if if (s <> "" ) then me.out(s) me.lasth = h if(ln > 0) then //Go to next line me.y = me.y + h if(ln = 1) then me.x = me.lMargin else me.x = me.x + w end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Close() //Terminate document if (me.state = 3) then return if (me.page = 0) then me.AddPage() //Page footer me.InFooter=true me.Footer() me.InFooter=false //Close page me.endpage() //Close document me.enddoc() End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Constructor(optional orientation as string = "P", optional unit as string = "mm", optional format as string = "A4", optional pWidth as double = 0, optional pHeigth as double = 0) dim margin as Double //Some checks //me._dochecks(); //Initialization of properties me.page=0 me.n=2 me.buffer="" redim me.pages(0) me.PageLinks = new Dictionary me.offsets = new Collection me.OrientationChanges = new Collection me.CurrentFont = new Collection me.CharWidths = new Collection me.fonts = new Collection me.state=0 me.FontFiles=new Collection me.diffs=array(-1) me.Images = new Collection me.Links = new Collection me.InFooter=false me.lasth=0 me.FontFamily="" me.FontStyle="" me.FontSizePt=12 me.underline=false me.DrawColor="0 G" me.FillColor="0 g" me.TextColor="0 g" me.ColorFlag=false me.ws=0 //Standard fonts me.CoreFonts = new Collection me.CoreFonts.Add "Courier","courier" me.CoreFonts.Add "Courier-Bold","courierB" me.CoreFonts.Add "Courier-Oblique","courierI" me.CoreFonts.Add "Courier-BoldOblique","courierBI" me.CoreFonts.Add "Helvetica","helvetica" me.CoreFonts.Add "Helvetica-Bold","helveticaB" me.CoreFonts.Add "Helvetica-Oblique","helveticaI" me.CoreFonts.Add "Helvetica-BoldOblique","helveticaBI" me.CoreFonts.Add "Times-Roman","times" me.CoreFonts.Add "Times-Bold","timesB" me.CoreFonts.Add "Times-Italic","timesI" me.CoreFonts.Add "Times-BoldItalic","timesBI" me.CoreFonts.Add "Symbol","symbol" me.CoreFonts.Add "ZapfDingbats","zapfdingbats" //gdf: build chartable strings used in LoadCharTable me.kCTs = New Dictionary me.kCTs.Value("courier") = kCT_courier me.kCTs.Value("helvetica") = kCT_helvetica me.kCTs.Value("helveticab") = kCT_helveticab me.kCTs.Value("helveticabi") = kCT_helveticabi me.kCTs.Value("helveticai") = kCT_helveticai me.kCTs.Value("symbol") = kCT_symbol me.kCTs.Value("times") = kCT_times me.kCTs.Value("timesb") = kCT_timesb me.kCTs.Value("timesbi") = kCT_timesbi me.kCTs.Value("timesi") = kCT_timesi me.kCTs.Value("zapfdingbats") = kCT_zapfdingbats //gdf: set default encoding me.InternalEncoding = Encodings.UTF8 //Scale factor select case unit.Lowercase case "pt" me.k = 1 case"mm" me.k = 72 / 25.4 case "cm" me.k = 72 / 2.54 case "in" me.k = 72 case else me.Error("Incorrect unit: " + unit) end select //Page format if( format <> "" ) then select case format.Lowercase case "a3" me.fwPt = 841.89 me.fhPt = 1190.55 case "a4" me.fwPt = 595.28 me.fhPt = 841.89 case "a5" me.fwPt = 420.94 me.fhPt = 595.28 case "letter" me.fwPt = 612 me.fhPt = 792 case "legal" me.fwPt = 612 me.fhPt = 1008 case else me.Error("Unknown page format: " + str(format)) end select else me.fwPt = pWidth * me.k me.fhPt = pHeigth * me.k end if me.fw = me.fwPt / me.k me.fh = me.fhPt / me.k //Page orientation orientation = orientation.Lowercase select case orientation.Lowercase case "p", "portrait" me.DefOrientation="P" me.wPt=me.fwPt me.hPt=me.fhPt case "l", "landscape" me.DefOrientation="L" me.wPt=me.fhPt me.hPt=me.fwPt case else me.Error("Incorrect orientation: " + orientation) end select me.CurOrientation = me.DefOrientation me.w = me.wPt / me.k me.h = me.hPt / me.k margin = 28.35 / me.k //Page margins (1 cm) me.SetMargins(margin,margin) //Interior cell margin (1 mm) me.cMargin=margin / 10 //Line width (0.2 mm) me.LineWidth = 0.567 / me.k //Automatic page break me.SetAutoPageBreak(true, 2 * margin) //Full width display mode me.SetDisplayMode("fullwidth") //Enable compression me.SetCompression(True) //Set default PDF version number me.PDFVersion="1.3" End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Function dounderline(x as double, y as double, txt as string) As string dim up,ut,w as double dim s as string //Underline text up = me.CurrentFont.item("up") ut = me.CurrentFont.item("ut") w = me.GetStringWidth(txt) + me.ws * substr_count(txt," ") s = fNum(x * me.k,"0.00") + " " + _ fNum((me.h - (y - up / 1000 * me.FontSize)) * me.k,"0.00") + " " + _ fNum(w * me.k,"0.00") + " " + _ fNum(- ut / 1000 * me.FontSizePt,"0.00") + " re f" return s End Function #tag EndMethod #tag Method, Flags = &h1 Protected Sub enddoc() dim i as integer me.putheader() me.putpages() me.putresources() //Info me.newobj() me.out("<<") me.putinfo() me.out(">>") me.out("endobj") //Catalog me.newobj() me.out("<<") me.putcatalog() me.out(">>") me.out("endobj") //Cross-ref me.out("xref") me.out("0 " + str(me.n + 1) ) me.out("0000000000 65535 f ") for i = 1 to me.n me.out( format( me.offsets.item(str(i)), "0000000000" ) + " 00000 n " ) next //Trailer me.out("trailer") me.out("<<") me.puttrailer() me.out(">>") me.out("startxref") me.out(str(me.buffer.Len)) me.out("%%EOF") me.state = 3 End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub endpage() //End of page contents me.state=1 End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub Error(msg as string) MsgBox msg End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Function escape(s as string) As string //Add \ before \, ( and ) s = s.ReplaceAll(chr(92), chr(92) + chr(92)) s = s.ReplaceAll(")", chr(92) + ")") s = s.ReplaceAll("(", chr(92) + "(") return s End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function fNum(mNumber as double, optional mFormat as string = "0.00") As string dim myDecPoint as string dim myRetVar as string dim i as integer myDecPoint = format(1.1,"0.0").mid(2,1) myRetVar = format(mNumber, "-" + mFormat).ReplaceAll(myDecPoint,".") return myRetVar End Function #tag EndMethod #tag Method, Flags = &h0 Sub Footer() //To be implemented in your own inherited class End Sub #tag EndMethod #tag Method, Flags = &h21 Private Function GetImageSize(file as string) As collection dim a as FolderItem dim f as BinaryStream dim data as string dim marker as Integer dim length, bits, height, width, channels as Integer dim r as Collection a = GetFolderItem(file, FolderItem.PathTypeShell) f = a.OpenAsBinaryFile marker = jpegnextmarker(f) if marker <> &hD8 then return nil while true marker = jpegnextmarker(f) select case marker case &hc0,&hc1,&hc2,&hc3, &hc5,&hc6,&hc7, &hc9,&hca,&hcb, &hcd,&hce,&hcf length = f.ReadShort r = new Collection r.Add f.readbyte, "bits" r.Add f.readshort, "height" r.Add f.readshort, "width" r.Add f.Readbyte, "channels" return r case &hd8,&hd9 return r case else end select wend End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function GetStringWidth(s as string) As double dim cw as new Collection dim i as Integer dim w as double //Get width of a string in the current font cw = collection(CurrentFont.Item("cw")) w = 0 for i = 1 to s.Len w = w + cw.Item( str(s.mid(i,1).asc) ) next i return w * me.FontSize / 1000 End Function #tag EndMethod #tag Method, Flags = &h0 Function GetX() As Double return me.x End Function #tag EndMethod #tag Method, Flags = &h0 Function GetY() As Double return me.y End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function gzcompress(s as string) As string // Heres goes the gzip compression algoritm or plugin call return zlibCompress(s) End Function #tag EndMethod #tag Method, Flags = &h0 Sub Header() //To be implemented in your own inherited class End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Image(file as string, x as double, y as double, optional w as double = 0, optional h as double = 0, optional type as string = "", optional link as string = "") //Put an image on the page dim info as collection dim pos as integer if( me.Images.Item(file) = nil) then //First use of image, get info if(type = "") then pos = file.InStr(".") if(pos = 0) then me.Error("Image file has no extension and no type was specified: " + file) return end if type = file.Mid(pos+1) end if type = type.Lowercase select case type case "jpg","jpeg" info = me.parsejpg(file) case "png" info = me.parsepng(file) case else me.Error("Unsupported image type: " + type) return end select info.add me.Images.Count + 1, "i" me.Images.Add info, file else info = collection(me.Images.Item(file)) end if //Automatic width and height calculation if needed if(w = 0 and h = 0) then //Put image at 72 dpi w = info.item("w") / me.k h = info.item("h") / me.k end if if(w = 0) then w = h * info.item("w") / info.item("h") if(h = 0) then h = w * info.item("h") / info.item("w") me.out("q " + fNum(w * me.k,"0.00") + " 0 0 " + fnum(h * me.k,"0.00") + " " + fnum(x * me.k,"0.00") + " " + fNum((me.h-(y+h)) * me.k,"0.00") + " cm /I" + info.item("i").StringValue + " Do Q") if(link <> "") then me.Link(x,y,w,h,link) End Sub #tag EndMethod #tag Method, Flags = &h21 Private Function jpegnextmarker(f as binaryStream) As integer dim c as integer while true // look for 0xff while (f.readbyte <> 255) wend c = f.readbyte if c <> 0 then return c wend End Function #tag EndMethod #tag Method, Flags = &h0 Sub Line(x1 as double, y1 as double, x2 as double, y2 as double) dim s as string //Draw a line s = fNum(x1 * me.k,"0.00") + " " + _ fNum((me.h - y1) * me.k,"0.00") + " m " + _ fNum(x2 * me.k,"0.00") + " " + _ fNum((me.h - y2) * me.k,"0.00") + " l S" me.out(s) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Link(x as double, y as double, w as double, h as double, link as string) dim detLink as new Collection //Put a link on the page detLink.add x * me.k,"x" detLink.add me.hPt - y * me.k,"y" detlink.add w * me.k,"w" detlink.add h * me.k, "h" detlink.add link, "link" me.PageLinks.Value(me.page) = detLink End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Ln(optional h as double) '*** Line feed; default value is last cell height self.x = self.lMargin if h = 0 then self.y = self.y + lasth else self.y = self.y + h end if End Sub #tag EndMethod #tag Method, Flags = &h21 Private Function LoadCharTable(charfile as string) As boolean Dim t As String dim rowFromFile as string dim chrCod as string dim chrVal as integer dim chrTable as new Collection dim i,tot as integer If Me.kCTs.Lookup(charfile, Nil) = Nil Then return False t = kCTs.Value(charfile).StringValue() tot = CountFields(t, me.kCT__rowdelim) For i = 1 To tot rowFromFile = t.NthField(me.kCT__rowdelim, i) chrCod = rowFromFile.NthField(me.kCT__fielddelim,1) chrVal = rowFromFile.NthField(me.kCT__fielddelim,2).Val chrTable.Add chrVal, chrCod Next CharWidths.Add chrTable, charfile return true End Function #tag EndMethod #tag Method, Flags = &h0 Sub MultiCell(w as double, h as double, txt as string, border as variant = 0, align as string = "J", fill as integer = 0) //Output text with automatic or explicit line breaks dim cw as new collection dim s,b,b2,c,letra as string dim i,j,nb,ns,nl,sep,asc_val as integer dim tmp,l,ls,wmax as double cw = collection(CurrentFont.Item("cw")) letra = CurrentFont.Item("name") if w = 0 then w = me.w - me.rMargin - me.x wmax = (w - 2 * me.cMargin) * 1000 / me.FontSize s = txt.ReplaceAll(chr(13),"") nb = s.len if nb > 0 and s.Right(1) = chr(10) then nb = nb - 1 b = "" if(border) then if( vartype(border) = 2 and border.IntegerValue = 1) then border="LTRB" b="LRT" b2="LR" else b2 = "" if border.StringValue.instr("L") > 0 then b2 = b2 + "L" if border.StringValue.InStr("R") > 0 then b2 = b2 + "R" if border.StringValue.InStr("T") > 0 then b2 = b2 + "T" b = b2 end if end if sep=-1 i=1 j=1 l=0 ns=0 nl=1 while i <= nb //Get next character c = s.mid(i,1) //Explicit line break if c = chr(10) then if(me.ws > 0) then me.ws = 0 me.out("0 Tw") end if me.Cell(w,h, s.mid(j, i-j), b, 2, align, fill) i = i + 1 sep = -1 j = i l=0 ns=0 nl = nl + 1 if(border and nl = 2) then b = b2 continue end if if(c = " ") then sep=i ls=l ns = ns + 1 end if asc_val = c.Asc if asc_val > 255 then asc_val = 64 // IF COMES OTHER THAN STANDARD ASCII OVERRIDE TO ASC 64 tmp = cw.Item( str(asc_val) ) l = l + tmp //Automatic line break If(l > wmax) Then If(sep = -1) Then If(i=j) Then i = i + 1 If(Me.ws > 0) Then Me.ws = 0 Me.out("0 Tw") End If Me.Cell(w,h,s.mid(j,i-j),b,2,align,fill) Else If(align ="J") Then If (ns > 1) Then Me.ws = (wmax - ls) / 1000 * Me.FontSize / (ns-1) Else Me.ws = 0 End If Me.out(Me.fNum(Me.ws * Me.k,"0.000") + " Tw") End if me.Cell(w,h, s.mid(j,sep-j),b,2,align,fill) i = sep + 1 End If sep = -1 j = i l= 0 ns = 0 nl = nl + 1 If(border And nl = 2) Then b=b2 else i = i + 1 End If wend //Last chunk if (me.ws>0) then me.ws=0 me.out("0 Tw") end if if( vartype(border) = 8 and border.StringValue.InStr("B") > 0) then b = b + "B" me.cell(w,h,s.mid(j,i-j),b,2,align,fill) me.x = me.lMargin End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub newobj() //Begin a new object me.n = me.n + 1 me.offsets.add me.buffer.Len, str(me.n) me.out(str(me.n) + " 0 obj") End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Open() me.state = 1 End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub out(s as string) //gdf: Convert the text string encoding s = s.ConvertEncoding(me.InternalEncoding) //Add a line to the document if (me.state = 2) then me.pages(me.page) = me.pages(me.page) + s + chr(10) else me.buffer = me.buffer + s + chr(10) end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Output(optional name as string = "", optional dest as string = "F") Dim f As FolderItem Dim t as BinaryStream //Output PDF to some destination //Finish document if necessary if(me.state < 3) then me.Close() //Normalize parameters if(name = "") then name="doc.pdf" dest="F" end if select case dest //Save to local file case "F" f = GetFolderItem(name) t = f.CreateBinaryFile("pdf") t.Write me.buffer t.close f.Launch case "S" //Return as a string 'return me.buffer case else me.Error("Incorrect output destination: " + dest) 'return false end select End Sub #tag EndMethod #tag Method, Flags = &h0 Function PageNo() As Integer //Get current page number return me.page End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function parseJPG(file as string) As collection dim f as FolderItem dim t as BinaryStream dim a as new Collection dim r as new Collection dim bpc as integer dim colspace as string dim data as string a = GetImageSize(file) if(a = nil) then me.Error("Missing or incorrect image file: " + file) return nil end if select case a.item("channels").IntegerValue case 3 colspace="DeviceRGB" case 4 colspace="DeviceCMYK" case else colspace="DeviceGray" end select bpc = 8 if (a.item("bits") <> nil) then bpc = a.item("bits").IntegerValue f = GetFolderItem(file, FolderItem.PathTypeShell) t = f.OpenAsBinaryFile while not t.EOF data = data + t.Read(4) wend r.Add a.item("width").IntegerValue, "w" r.Add a.item("height").IntegerValue, "h" r.Add bpc, "bpc" r.add colspace, "cs" r.Add "DCTDecode", "f" r.add data, "data" return r End Function #tag EndMethod #tag Method, Flags = &h1 Protected Function parsePNG(file as string) As collection dim colspace,parms,pal,data,type as string dim w,h,n as double dim trns as Collection dim bpc,ct as Integer dim r as new Collection Dim f As FolderItem Dim t as BinaryStream dim nulo as string f = GetFolderItem(file, FolderItem.PathTypeShell) t = f.OpenAsBinaryFile //Check signature if( t.Read(8) <> chr(137) + "PNG" + chr(13) + chr(10) + chr(26) + chr(10)) then me.Error("Not a PNG file: " + file) return r end if //Read header chunk nulo = t.read(4) if(t.read(4) <> "IHDR") then me.Error("Incorrect PNG file: " + file) return r end if w = t.ReadInt32 h = t.readint32 bpc = t.read(1).Asc if(bpc > 8) then me.Error("16-bit depth not supported: " + file) return r end if ct = t.read(1).asc select case ct case 0 colspace ="DeviceGray" case 2 colspace = "DeviceRGB" case 3 colspace="Indexed" case else me.Error("Alpha channel not supported: " + file) return r end select if(t.read(1).asc <> 0) then me.Error("Unknown compression method: " + file) return r end if if(t.read(1).asc <> 0) then me.Error("Unknown filter method: " + file) return r end if if(t.read(1).asc <> 0) then me.Error("Interlacing not supported: " + file) return r end if nulo = t.Read(4) parms = "/DecodeParms <>" //Scan chunks looking for palette, transparency and image data pal = "" trns = new collection data = "" do nulo = str(t.readint32) n = nulo.CDbl type = t.read(4) select case type case "PLTE" pal = t.read(n) nulo = t.Read(4) case "tRNS" //Read transparency info nulo = t.read(n) if(ct = 0) then trns.Add str(nulo.left(1).asc) elseif(ct = 2) then trns.Add str(nulo.mid(1,1).asc) trns.Add str(nulo.mid(3,1).asc) trns.Add str(nulo.mid(5,1).asc) else if (nulo.inStr(chr(0)) > 0) then trns.Add str(nulo.inStr(chr(0))) end if end if nulo = t.read(4) case "IDAT" //Read image data block data = data + t.read(n) nulo = t.read(4) case "IEND" case else nulo = t.read(n + 4) end select loop until(t.EOF) t.close if(colspace = "Indexed" AND pal = "") then me.Error("Missing palette in " + file) return r end if r.Add w, "w" r.add h, "h" r.add colspace, "cs" r.add bpc, "bpc" r.add "FlateDecode", "f" r.add parms, "parms" r.add pal, "pal" r.add trns, "trns" r.add data, "data" return r End Function #tag EndMethod #tag Method, Flags = &h1 Protected Sub putcatalog() me.out("/Type /Catalog") me.out("/Pages 1 0 R") select case me.ZoomMode case "fullpage" me.out("/OpenAction [3 0 R /Fit]") case "fullwidth" me.out("/OpenAction [3 0 R /FitH null]") case "real" me.out("/OpenAction [3 0 R /XYZ null null 1]") '// POR AHORA NO! ' 'case else ' 'if IsNumeric(me.ZoomMode) then 'me.out("/OpenAction [3 0 R /XYZ null null " + str( me.ZoomMode.clCDbl / 100) + "]") 'else 'me.out("/OpenAction [3 0 R /XYZ null null 1]"); 'end if end select select case me.LayoutMode case "single" me.out("/PageLayout /SinglePage") case "continuous" me.out("/PageLayout /OneColumn") case "two" me.out("/PageLayout /TwoColumnLeft") end select End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putfonts() dim nf,i,j as Integer dim font as new Collection dim cw as new Collection dim s,type,name,file as string nf = me.n for i = 1 to ubound(me.diffs) //Encodings me.newobj() me.out("<>") me.out("endobj") next for i = 1 to fonts.Count collection(fonts.Item(i)).Add me.n+1,"n" font = collection(fonts.Item(i)) //Font objects type = font.Item("type") name = font.Item("name") if(type = "core") then //Standard font me.newobj() me.out("< "Symbol" and name <> "ZapfDingbats") then me.out("/Encoding /WinAnsiEncoding") end if me.out(">>") me.out("endobj") elseif(type = "Type1" or type = "TrueType") then //Additional Type1 or TrueType font me.newobj() me.out("< nil) then if(font.item("diff") <> nil) then me.out("/Encoding " + str(nf + font.item("diff")) + " 0 R" ) else me.out("/Encoding /WinAnsiEncoding") end if end if me.out(">>") me.out("endobj") //Widths me.newobj() cw = font.Item("cw") s = "[" for j = 32 to 254 s = s + chr(cw.Item(str(j)) ) + " " next j s = s + "]" me.out(s) me.out("endobj") //Descriptor me.newobj() s = "<$v) '$s.=' /'.$k.' '.$v; file = font.Item("file").StringValue if(file) <> "" then s = " /FontFile" if font.Item("type") <> "Type1" then s = s + "2" s = s + " " + collection(FontFiles.item(file)).Item("n").stringvalue + " 0 R" end if me.out(s + ">>") me.out("endobj") end if next i End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putheader() me.out("%PDF-" + me.PDFVersion) End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putimages() dim filter as string dim info, cTrns as collection dim file,pal,trns as string dim i,j as integer info = new Collection cTrns = new Collection if me.Compress then filter = "/Filter /FlateDecode " for j = 1 to me.Images.Count me.newobj() collection(Images.Item(j)).Add me.n, "n" info = collection(me.Images.Item(j)) me.out("< nil) then me.out("/Filter /" + info.item("f")) if(info.item("parms") <> nil) then me.out(info.item("parms")) cTrns = collection(info.Item("trns")) if(cTrns <> nil and cTrns.Count > 0) then trns = "" for i = 1 to cTrns.Count trns = trns + cTrns.Item(i) me.out("/Mask [" + trns + "]") next i end if me.out("/Length " + str(info.item("data").StringValue.Len) + ">>") me.putstream(info.item("data").StringValue) me.out("endobj") // Palette if( info.Item("cs").StringValue = "Indexed") then me.newobj() if me.compress then pal = gzcompress(info.Item("pal")) else pal = info.item("pal") end if me.out("<<" + filter + "/Length " + str(pal.len) + ">>") me.putstream(pal) me.out("endobj") end if next j End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putinfo() dim miDate as new date dim stDate as string stDate = replaceall(replaceall(replaceall(str(miDate.SQLDateTime),"-",""),":","")," ","") me.out("/Producer " + me.textstring("rsFPDF v" + me.rsFPDFVersion + " by roblthegreat") ) if(me.title <> "") then me.out("/Title " + me.textstring(me.title)) if(me.subject <> "") then me.out("/Subject " + me.textstring(me.subject)) if(me.author <> "") then me.out("/Author " + me.textstring(me.author)) if(me.keywords <> "") then me.out("/Keywords " + me.textstring(me.keywords)) if(me.creator <> "") then me.out("/Creator " + me.textstring(me.creator)) me.out("/CreationDate " + me.textstring("D:" + stDate)) End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putpages() dim n, nb as Integer dim wPt,hPt as double dim annots, filter,rect, p as string dim kids as string dim cLinks as new Collection dim pl as new Collection dim lnk as new Collection nb = me.page if(me.AliasNbPages <> "") then //Replace number of pages for n = 1 to nb me.pages(n) = me.pages(n).ReplaceAll(me.AliasNbPages,str(nb)) next end if if(me.DefOrientation = "P") then wPt = me.fwPt hPt = me.fhPt else wPt = me.fhPt hPt = me.fwPt end if if me.Compress then filter = "/Filter /FlateDecode " for n = 1 to nb //Page me.newobj() me.out("< 0) then //Links annots = "/Annots [" pl = Collection(me.PageLinks.Lookup(n,nil)) 'for i as integer = 0 to cLinks.Count 'pl = cLinks.item(i) rect = fNum( pl.item("x"), "0.00") + " " + _ fNum( pl.item("y"), "0.00") + " " + _ fNum( pl.item("x") + pl.item("w"), "0.00") + " " + _ fNum( pl.item("y") - pl.item("h"), "0.00") annots = annots + "<>>>" else lnk = Collection( me.links.Item( pl.item("link").StringValue ) ) if me.OrientationChanges.Item( lnk.Item("page").StringValue ) then h = wPt else h = hPt end if annots = annots + "/Dest [" + _ str(1 + 2 * lnk.item("page").IntegerValue ) + _ " 0 R /XYZ 0 " + _ fNum(h - lnk.item("y").DoubleValue * me.k,"0.00") + _ " null]>>" end if 'next me.out(annots + "]") end if me.out("/Contents " + str(me.n + 1) + " 0 R>>") me.out("endobj") //Page content if me.Compress then p = gzcompress( me.pages(n) ) else p = me.pages(n) end if me.newobj() me.out("<<" + filter + "/Length " + str(p.Len) + ">>") me.putstream(p) me.out("endobj") next //Pages root me.offsets.add me.buffer.len,"1" me.out("1 0 obj") me.out("<>") me.out("endobj") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putresourcedict() dim i as Integer dim f as new Collection me.out("/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]") me.out("/Font <<") for i = 1 to me.Fonts.Count f = me.Fonts.Item(i) me.out("/F" + f.Item("i").StringValue + " " + f.item("n").StringValue + " 0 R") next i me.out(">>") me.out("/XObject <<") me.putxobjectdict() me.out(">>") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putresources() me.putfonts() me.putimages() //Resource dictionary me.offsets.add me.buffer.Len, "2" me.out("2 0 obj") me.out("<<") me.putresourcedict() me.out(">>") me.out("endobj") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putstream(s as string) me.out("stream") me.out(s) me.out("endstream") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub puttrailer() me.out("/Size " + str(me.n + 1) ) me.out("/Root " + str(me.n + 0) + " 0 R") me.out("/Info " + str(me.n - 1) + " 0 R") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub putxobjectdict() dim i as Integer dim im as new Collection if Images.Count = 0 then return for i = 1 to Images.Count im = collection(images.Item(i)) me.out("/I" + im.item("i").StringValue + " " + im.item("n").StringValue + " 0 R") next i End Sub #tag EndMethod #tag Method, Flags = &h0 Sub Rect(x as double, y as double, w as double, h as double, optional style as string = "") dim s as string //Draw a rectangle s = fNum(x * me.k,"0.00") + " " + _ fNum((me.h - y) * me.k,"0.00") + " " + _ fNum(w * me.k,"0.00") + " " + _ fNum(-h * me.k,"0.00") + " re " select case style case "F" s = s + "f" case "FD", "DF" s = s + "B" case else s = s + "S" end select me.out(s) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetAuthor(Author as string) me.author = author End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetAutoPageBreak(auto as boolean, optional margin as integer = 0) //Set auto page break mode and triggering margin me.AutoPageBreak = auto me.bMargin = margin me.PageBreakTrigger = me.h - margin End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetCompression(compress as boolean) me.compress = compress End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetCreator(Creator as string) //Creator of document me.creator = creator End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetDisplayMode(Zoom as string, optional Layout as string = "continuous") //Set display mode in viewer if (zoom ="fullpage" or zoom = "fullwidth" or zoom = "real" or zoom = "default") then me.ZoomMode = zoom else me.Error("Incorrect zoom display mode: " + zoom) end if if (layout = "single" or layout = "continuous" or layout = "two" or layout = "default") then me.LayoutMode = layout else me.Error("Incorrect layout display mode: " + layout) end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetDrawColor(r as integer, optional g as integer = -1, optional b as integer = -1) if( (r = 0 and g = 0 and b = 0) or g = -1 ) then me.DrawColor = fNum(r / 255,"0.000") + " G" else me.DrawColor = fNum(r / 255,"0.000") + " " + _ fNum(g / 255,"0.000") + " " + _ fNum(b / 255,"0.000") + " RG" end if if (me.page > 0) then me.out(me.DrawColor) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetEnconding(enc as textEncoding) //gdf: set the string encoding used internally by rsFPDF //note that FPDF does not support UTF, but this method allows //to convert to other encodings, such as WindowsLatin1 //(Windows 1252, with Euro sign) or //ISOLatin9 (ISO 8859-15, with Euro sign) me.InternalEncoding = enc End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetFillColor(r as integer, optional g as integer = -1, optional b as integer = -1) if( (r = 0 and g = 0 and b = 0) or g = -1 ) then me.FillColor = fNum(r / 255,"0.000") + " G" else me.FillColor = fNum(r / 255,"0.000") + " " + _ fNum(g / 255,"0.000") + " " + _ fNum(b / 255,"0.000") + " rg" end if me.ColorFlag = not (me.FillColor = me.TextColor) if(me.page > 0) then me.out(me.FillColor) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetFont(family as string, optional style as string = "", optional size as integer = 0) //Select a font; size given in points dim fontkey,file as string dim fontinfo as new Collection family = family.Lowercase select case family case "" family = me.FontFamily case "arial" family = "helvetica" case "symbol", "zapfdingbats" Style = "" end select Style = Style.Uppercase if( Style.InStr("U") > 0) then me.Underline = true Style = Style.Replace("U","") else me.Underline = false end if if(Style = "IB") then Style = "BI" if(Size =0) then Size = me.FontSizePt //Test if font is already selected if (me.FontFamily = family AND me.FontStyle = Style AND me.FontSizePt = Size) then return //Test if used for the first time fontkey = family + style if( me.Fonts.Item(fontkey) = nil ) then //Check if one of the standard fonts if( me.CoreFonts.Item(fontkey) <> nil ) then if( me.CharWidths.Item(fontkey) = nil ) then // Load metric file file = family if(family = "times" or family = "helvetica") then file = file + style.Lowercase if ( me.LoadCharTable(file) = false) then me.Error("Could not include font file") if( me.CharWidths.Item(file) = nil ) then me.Error("Could not include font metric file") end if fontinfo.Add me.Fonts.Count + 1, "i" fontinfo.Add "core", "type" fontinfo.Add me.CoreFonts.Item(fontkey), "name" fontinfo.Add -100, "up" fontinfo.Add 50, "ut" fontinfo.Add me.CharWidths.Item(fontkey), "cw" me.fonts.Add fontinfo, fontkey else me.Error("Undefined font: " + family + " " + style) end if end if // Select it me.FontFamily = family me.FontStyle = style me.FontSizePt = size me.FontSize = size / me.k me.CurrentFont = collection(me.fonts.Item(fontkey)) if( me.page > 0 ) then me.out("BT /F" + me.CurrentFont.Item("i") + " " + fNum(me.FontSizePt,"0.00") + " Tf ET") End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetFontSize(size as integer) dim s as string //Set font size in points if (me.FontSizePt = size) then return me.FontSizePt = size me.FontSize = size / me.k if(me.page > 0) then s = "BT /F" + me.CurrentFont.Item("i") + " " + fNum(me.FontSizePt,"0.00") + "Tf ET" me.out(s) end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetKeywords(keywords as string) //Keywords of document me.keywords = keywords End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetLeftMargin(margin as double) //Set left margin me.lMargin = margin if(me.page > 0 AND me.x < margin) then me.x = margin End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetLineWidth(width as Double) //Set line width me.LineWidth = width if(me.page > 0 ) then me.out( fNum(width * me.k,"0.00") + " w" ) end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetLink(link as string, y as double = -1, page as integer = -1) dim detLink as new Collection //Set destination of internal link if(y = -1) then y = me.y if(page = -1) then page = me.page detLink = Collection(me.links.Item(link)) detLink.add array(page,y), link //detLink.Add page, "page" //detLink.add y, "y" //me.links.Add detLink, link End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetMargins(left as double, top as double, optional right as double = -1) //Set left, top and right margins me.lMargin=left me.tMargin=top if( right = -1) then right = left me.rMargin = right End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetRightMargin(margin as double) //Set right margin me.rMargin = margin End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetSubject(subject as string) //Subject of document me.subject = subject End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetTextColor(r as integer, optional g as integer = -1, optional b as integer = -1) if( (r = 0 and g = 0 and b = 0) or g = -1 ) then me.textcolor = fNum(r / 255,"0.000") + " G" else me.textcolor = fNum(r / 255,"0.000") + " " + _ fNum(g / 255,"0.000") + " " + _ fNum(b / 255,"0.000") + " rg" end if me.ColorFlag = not (me.FillColor = me.TextColor) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetTitle(title as string) //Title of document me.title = title End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetTopMargin(margin as double) //Set top margin me.tMargin = margin End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetX(x as double) //Set x position if(x >= 0) then me.x = x else me.x = me.w + x end if End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetXY(x as double, y as double) //Set x and y positions //Don't Alter order 'cause SetY reset Position (Thanks Gilberto De Faveri) me.setY(y) me.setX(x) End Sub #tag EndMethod #tag Method, Flags = &h0 Sub SetY(y as double) //Set y position and reset x me.x = me.lMargin if(y >= 0) then me.y = y else me.y = me.h + y end if End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Function substr_count(cadena as string, caracter as string) As integer dim i as double dim j as double j = 0 for i = 1 to cadena.Len if cadena.mid(i,1) = caracter then j = j + 1 next i return j End Function #tag EndMethod #tag Method, Flags = &h0 Sub Text(x as double, y as double, txt as string) dim s as string //Output a string s = "BT " + _ fNum(x * me.k,"0.00") + " " + _ fNum((me.h - y) * me.k,"0.00") + " " + _ "Td " + me.textstring (txt) + " Tj ET" if(me.underline AND txt <> "") then s = s + " " + me.dounderline(x,y,txt) if(me.ColorFlag) then s = s + "q " + me.TextColor + " " + s + " Q" me.out(s) End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Function textstring(s as string) As string //Format a text string return "(" + me.Escape(s) + ")" End Function #tag EndMethod #tag Method, Flags = &h0 Sub Write(ph as double, txt as string,optional link as string = "") // THIS PIECE OF CODE WAS PORTED BY DAN HARDING .. THANKS DAN Dim cw as new Collection Dim wTemp as double Dim wmax as double Dim s as string Dim nb as integer Dim sep as integer Dim i as integer Dim j as integer Dim l as integer Dim nl as integer Dim c as string //Output text in flowing mode cw = collection(CurrentFont.Item("cw")) wTemp = me.w - me.rMargin - me.x wmax = (wTemp - 2 * me.cMargin) * 1000 / me.FontSize s = txt.ReplaceAll(chr(13), "") nb = s.Len sep = -1 i = 0 j = 0 l = 0 nl = 1 do if i >= nb then exit //Get next character c = s.Mid(i + 1, 1) if c = chr(10) then // Explicit line break me.Cell(wTemp, ph, s.Mid(j + 1, i - j), 0, 2, "", 0, link) i = i + 1 sep = -1 j = i l = 0 if nl = 1 then me.x = me.lMargin wTemp = me.w - me.rMargin - me.x wmax = (wTemp - 2 * me.cMargin) * 1000 / me.FontSize end if nl = nl + 1 Continue end if if c = " " then sep = i l = l + cw.Item(str(c.asc)) if l > wmax then //Automatic line break if sep = -1 then if me.x > me.lMargin then //Move to next line me.x = me.lMargin me.y = me.y + ph wTemp = me.w - me.rMargin - me.x wmax = ( w - 2 * me.cMargin ) * 1000 / me.FontSize i = i + 1 nl = nl + 1 Continue end if if i = j then i = i + 1 me.Cell(wTemp, ph, s.Mid(j + 1, i - j), 0, 2, "", 0, link) else me.Cell(wTemp, ph, s.Mid(j + 1, sep - j), 0, 2, "", 0, link) i = sep + 1 end if sep = -1 j = i l = 0 if nl = 1 then me.x = me.lMargin wTemp = me.w - me.rMargin - me.x wmax = ( wTemp - 2 * me.cMargin) * 1000 / me.FontSize end if nl = nl + 1 else i = i + 1 end if loop //Last chunk if i <> j then me.Cell( l /1000 * me.FontSize, ph, s.Mid(j + 1), 0, 0, "", 0, link) end if End Sub #tag EndMethod #tag Note, Name = LICENSE RPDF es FREEWARE al igual que FPDF (el proyecto en el cual está basada esta clase). No hay limitaciones de uso. Puede usarlo libre y gratuitamente en su aplicación (comercial o no), con o sin modificaciones. RPDF is FREEWARE like FPDF (the proyect where this class is based on). There is no use limitations. It can be used in free or commercial applications, with/out modifications. 2007-2008 by diego2k Contact me: diego2k[at]gmail[dot]com TODO: - True Type embedding and complete support - Improbe Links support Release 08.03.11 + JPG Image support + Links Support + Add GZIP Support throught ZLIB (Thanks Gilberto De Faveri) + Add Write method (Thanks to Dan Harding) + Add SetEncoding to change the internal RPDF text encoding (Thanks to Gilberto De Faveri) * Eliminate the need of have Font folder (Thanks Gilberto De Faveri) * Fixed SetXY method (Thanks Roberto Tremonti) * Fixed some font metrics (Thanks Roberto Tremonti) * Fixed bug on multicell method (Thanks to Gilberto De Faveri) * h and fontsize changed from private property to protected Release 08.02.22 + I Change the number release version to fit the date so it make sense :D + Add Multicell Method * changed lasth property to double for Inch support (thanks Dan Harding) * Fixed setfillcolor * Fixed settextcolor * Fixed Cell Method. Now it call to acceptpagebreak() method instead of evaluate the property. * Fixed Font Metrics of some fonts definition that was wrong Thanks to people who contribute to the project: * FPDF (http://www.fpdf.org/) * Luis Melgratti * Peter Stys * Jamesee * Forisco * Computercoder * Dan Harding * Gilberto De Faveri (http://www.omnidea.it/) * Roberto Tremonti #tag EndNote #tag Property, Flags = &h1 #tag Note // Alias for total number of pages #tag EndNote Protected AliasNbPages As String = "{nb}" #tag EndProperty #tag Property, Flags = &h1 #tag Note // Author #tag EndNote Protected Author As String #tag EndProperty #tag Property, Flags = &h1 Protected AutoPageBreak As Boolean = True #tag EndProperty #tag Property, Flags = &h1 #tag Note //page break margin #tag EndNote Protected bMargin As Double #tag EndProperty #tag Property, Flags = &h1 #tag Note //buffer holding in-memory PDF #tag EndNote Protected buffer As String #tag EndProperty #tag Property, Flags = &h1 Protected CharWidths As Collection #tag EndProperty #tag Property, Flags = &h1 #tag Note //cell margin #tag EndNote Protected cMargin As Double #tag EndProperty #tag Property, Flags = &h21 #tag Note //indicates whether fill and text colors are different #tag EndNote Private ColorFlag As Boolean = True #tag EndProperty #tag Property, Flags = &h21 #tag Note //compression flag #tag EndNote Private Compress As Boolean = True #tag EndProperty #tag Property, Flags = &h21 #tag Note //array of standard font names #tag EndNote Private CoreFonts As Collection #tag EndProperty #tag Property, Flags = &h21 #tag Note // Creator #tag EndNote Private Creator As String #tag EndProperty #tag Property, Flags = &h21 #tag Note //current orientatio #tag EndNote Private CurOrientation As String #tag EndProperty #tag Property, Flags = &h21 Private CurrentFont As Collection #tag EndProperty #tag Property, Flags = &h21 #tag Note //default orientation #tag EndNote Private DefOrientation As String = "P" #tag EndProperty #tag Property, Flags = &h21 Private diffs() As int32 #tag EndProperty #tag Property, Flags = &h21 #tag Note //commands for drawing color #tag EndNote Private DrawColor As String #tag EndProperty #tag Property, Flags = &h21 #tag Note //dimensions of page format in user unit #tag EndNote Private fh As double #tag EndProperty #tag Property, Flags = &h21 #tag Note //dimensions of page format in points #tag EndNote Private fhPt As double #tag EndProperty #tag Property, Flags = &h21 Private FillColor As String #tag EndProperty #tag Property, Flags = &h21 Private FontFamily As String #tag EndProperty #tag Property, Flags = &h21 Private FontFiles As Collection #tag EndProperty #tag Property, Flags = &h21 Private Fonts As collection #tag EndProperty #tag Property, Flags = &h1 Protected FontSize As Double #tag EndProperty #tag Property, Flags = &h21 Private FontSizePt As Integer #tag EndProperty #tag Property, Flags = &h21 Private FontStyle As String #tag EndProperty #tag Property, Flags = &h21 #tag Note //dimensions of page format in user unit #tag EndNote Private fw As double #tag EndProperty #tag Property, Flags = &h21 #tag Note //dimensions of page format in points #tag EndNote Private fwPt As double #tag EndProperty #tag Property, Flags = &h1 #tag Note //current dimensions of page in user unit #tag EndNote Protected h As double #tag EndProperty #tag Property, Flags = &h21 #tag Note //current dimensions of page in points #tag EndNote Private hPt As double #tag EndProperty #tag Property, Flags = &h21 Private Images As collection #tag EndProperty #tag Property, Flags = &h21 #tag Note //flag set when processing footer #tag EndNote Private InFooter As Boolean = False #tag EndProperty #tag Property, Flags = &h21 #tag Note //gdf: string encoding used internally by rsFPDF #tag EndNote Private InternalEncoding As TextEncoding #tag EndProperty #tag Property, Flags = &h21 #tag Note //scale factor (number of points in user unit) #tag EndNote Private k As double #tag EndProperty #tag Property, Flags = &h21 Private kCTs As Dictionary #tag EndProperty #tag Property, Flags = &h21 #tag Note // Keywords #tag EndNote Private Keywords As String #tag EndProperty #tag Property, Flags = &h21 Private lasth As double #tag EndProperty #tag Property, Flags = &h21 #tag Note // Layout display mode #tag EndNote Private LayoutMode As String = "continuous" #tag EndProperty #tag Property, Flags = &h21 Private LineWidth As Double #tag EndProperty #tag Property, Flags = &h21 Private links As Collection #tag EndProperty #tag Property, Flags = &h1 #tag Note //left margin #tag EndNote Protected lMargin As double #tag EndProperty #tag Property, Flags = &h21 #tag Note //current object number #tag EndNote Private n As Integer #tag EndProperty #tag Property, Flags = &h21 #tag Note //array of object offsets #tag EndNote Private offsets As Collection #tag EndProperty #tag Property, Flags = &h21 #tag Note //array indicating orientation changes #tag EndNote Private OrientationChanges As Collection #tag EndProperty #tag Property, Flags = &h21 #tag Note // current page number #tag EndNote Private Page As Integer = 0 #tag EndProperty #tag Property, Flags = &h21 Private PageBreakTrigger As Double #tag EndProperty #tag Property, Flags = &h21 Private PageLinks As dictionary #tag EndProperty #tag Property, Flags = &h21 #tag Note //array containing pages #tag EndNote Private pages() As String #tag EndProperty #tag Property, Flags = &h21 Private PDFVersion As String = "1.3" #tag EndProperty #tag Property, Flags = &h1 #tag Note //right margin #tag EndNote Protected rMargin As Double #tag EndProperty #tag Property, Flags = &h21 Private rsFPDFVersion As String = "11.07.30B" #tag EndProperty #tag Property, Flags = &h21 #tag Note //current document state #tag EndNote Private state As Integer #tag EndProperty #tag Property, Flags = &h21 #tag Note // Subject #tag EndNote Private Subject As String #tag EndProperty #tag Property, Flags = &h21 Private TextColor As string = "0 G" #tag EndProperty #tag Property, Flags = &h1 #tag Note // Title #tag EndNote Protected Title As String #tag EndProperty #tag Property, Flags = &h1 #tag Note //top margin #tag EndNote Protected tMargin As double #tag EndProperty #tag Property, Flags = &h1 Protected Underline As Boolean = False #tag EndProperty #tag Property, Flags = &h1 #tag Note //current dimensions of page in user unit #tag EndNote Protected w As double #tag EndProperty #tag Property, Flags = &h1 #tag Note //current dimensions of page in points #tag EndNote Protected wPt As double #tag EndProperty #tag Property, Flags = &h1 #tag Note // Word spacing #tag EndNote Protected ws As Double = 0 #tag EndProperty #tag Property, Flags = &h1 #tag Note //current position in user unit for cell positioning #tag EndNote Protected x As Double #tag EndProperty #tag Property, Flags = &h1 #tag Note //current position in user unit for cell positioning #tag EndNote Protected y As Double #tag EndProperty #tag Property, Flags = &h1 #tag Note // Zoom display mode #tag EndNote Protected ZoomMode As String = "fullpage" #tag EndProperty #tag Constant, Name = kCT_courier, Type = String, Dynamic = False, Default = \"0;600:1;600:2;600:3;600:4;600:5;600:6;600:7;600:8;600:9;600:10;600:11;600:12;600:13;600:14;600:15;600:16;600:17;600:18;600:19;600:20;600:21;600:22;600:23;600:24;600:25;600:26;600:27;600:28;600:29;600:30;600:31;600:32;600:33;600:34;600:35;600:36;600:37;600:38;600:39;600:40;600:41;600:42;600:43;600:44;600:45;600:46;600:47;600:48;600:49;600:50;600:51;600:52;600:53;600:54;600:55;600:56;600:57;600:58;600:59;600:60;600:61;600:62;600:63;600:64;600:65;600:66;600:67;600:68;600:69;600:70;600:71;600:72;600:73;600:74;600:75;600:76;600:77;600:78;600:79;600:80;600:81;600:82;600:83;600:84;600:85;600:86;600:87;600:88;600:89;600:90;600:91;600:92;600:93;600:94;600:95;600:96;600:97;600:98;600:99;600:100;600:101;600:102;600:103;600:104;600:105;600:106;600:107;600:108;600:109;600:110;600:111;600:112;600:113;600:114;600:115;600:116;600:117;600:118;600:119;600:120;600:121;600:122;600:123;600:124;600:125;600:126;600:127;600:128;600:129;600:130;600:131;600:132;600:133;600:134;600:135;600:136;600:137;600:138;600:139;600:140;600:141;600:142;600:143;600:144;600:145;600:146;600:147;600:148;600:149;600:150;600:151;600:152;600:153;600:154;600:155;600:156;600:157;600:158;600:159;600:160;600:161;600:162;600:163;600:164;600:165;600:166;600:167;600:168;600:169;600:170;600:171;600:172;600:173;600:174;600:175;600:176;600:177;600:178;600:179;600:180;600:181;600:182;600:183;600:184;600:185;600:186;600:187;600:188;600:189;600:190;600:191;600:192;600:193;600:194;600:195;600:196;600:197;600:198;600:199;600:200;600:201;600:202;600:203;600:204;600:205;600:206;600:207;600:208;600:209;600:210;600:211;600:212;600:213;600:214;600:215;600:216;600:217;600:218;600:219;600:220;600:221;600:222;600:223;600:224;600:225;600:226;600:227;600:228;600:229;600:230;600:231;600:232;600:233;600:234;600:235;600:236;600:237;600:238;600:239;600:240;600:241;600:242;600:243;600:244;600:245;600:246;600:247;600:248;600:249;600:250;600:251;600:252;600:253;600:254;600:255;600:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_helvetica, Type = String, Dynamic = False, Default = \"0;278:1;278:2;278:3;278:4;278:5;278:6;278:7;278:8;278:9;278:10;278:11;278:12;278:13;278:14;278:15;278:16;278:17;278:18;278:19;278:20;278:21;278:22;278:23;278:24;278:25;278:26;278:27;278:28;278:29;278:30;278:31;278:32;278:33;278:34;355:35;556:36;556:37;889:38;667:39;191:40;333:41;333:42;389:43;584:44;278:45;333:46;278:47;278:48;556:49;556:50;556:51;556:52;556:53;556:54;556:55;556:56;556:57;556:58;278:59;278:60;584:61;584:62;584:63;556:64;1015:65;667:66;667:67;722:68;722:69;667:70;611:71;778:72;722:73;278:74;500:75;667:76;556:77;833:78;722:79;778:80;667:81;778:82;722:83;667:84;611:85;722:86;667:87;944:88;667:89;667:90;611:91;278:92;278:93;278:94;469:95;556:96;333:97;556:98;556:99;500:100;556:101;556:102;278:103;556:104;556:105;222:106;222:107;500:108;222:109;833:110;556:111;556:112;556:113;556:114;333:115;500:116;278:117;556:118;500:119;722:120;500:121;500:122;500:123;334:124;260:125;334:126;584:127;350:128;556:129;350:130;222:131;556:132;333:133;1000:134;556:135;556:136;333:137;1000:138;667:139;333:140;1000:141;350:142;611:143;350:144;350:145;222:146;222:147;333:148;333:149;350:150;556:151;1000:152;333:153;1000:154;500:155;333:156;944:157;350:158;500:159;667:160;278:161;333:162;556:163;556:164;556:165;556:166;260:167;556:168;333:169;737:170;370:171;556:172;584:173;333:174;737:175;333:176;400:177;584:178;333:179;333:180;333:181;556:182;537:183;278:184;333:185;333:186;365:187;556:188;834:189;834:190;834:191;611:192;667:193;667:194;667:195;667:196;667:197;667:198;1000:199;722:200;667:201;667:202;667:203;667:204;278:205;278:206;278:207;278:208;722:209;722:210;778:211;778:212;778:213;778:214;778:215;584:216;778:217;722:218;722:219;722:220;722:221;667:222;667:223;611:224;556:225;556:226;556:227;556:228;556:229;556:230;889:231;500:232;556:233;556:234;556:235;556:236;278:237;278:238;278:239;278:240;556:241;556:242;556:243;556:244;556:245;556:246;556:247;584:248;611:249;556:250;556:251;556:252;556:253;500:254;556:255;500:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_helveticab, Type = String, Dynamic = False, Default = \"0;278:1;278:2;278:3;278:4;278:5;278:6;278:7;278:8;278:9;278:10;278:11;278:12;278:13;278:14;278:15;278:16;278:17;278:18;278:19;278:20;278:21;278:22;278:23;278:24;278:25;278:26;278:27;278:28;278:29;278:30;278:31;278:32;278:33;333:34;474:35;556:36;556:37;889:38;722:39;238:40;333:41;333:42;389:43;584:44;278:45;333:46;278:47;278:48;556:49;556:50;556:51;556:52;556:53;556:54;556:55;556:56;556:57;556:58;333:59;333:60;584:61;584:62;584:63;611:64;975:65;722:66;722:67;722:68;722:69;667:70;611:71;778:72;722:73;278:74;556:75;722:76;611:77;833:78;722:79;778:80;667:81;778:82;722:83;667:84;611:85;722:86;667:87;944:88;667:89;667:90;611:91;333:92;278:93;333:94;584:95;556:96;333:97;556:98;611:99;556:100;611:101;556:102;333:103;611:104;611:105;278:106;278:107;556:108;278:109;889:110;611:111;611:112;611:113;611:114;389:115;556:116;333:117;611:118;556:119;778:120;556:121;556:122;500:123;389:124;280:125;389:126;584:127;350:128;556:129;350:130;278:131;556:132;500:133;1000:134;556:135;556:136;333:137;1000:138;667:139;333:140;1000:141;350:142;611:143;350:144;350:145;278:146;278:147;500:148;500:149;350:150;556:151;1000:152;333:153;1000:154;556:155;333:156;944:157;350:158;500:159;667:160;278:161;333:162;556:163;556:164;556:165;556:166;280:167;556:168;333:169;737:170;370:171;556:172;584:173;333:174;737:175;333:176;400:177;584:178;333:179;333:180;333:181;611:182;556:183;278:184;333:185;333:186;365:187;556:188;834:189;834:190;834:191;611:192;722:193;722:194;722:195;722:196;722:197;722:198;1000:199;722:200;667:201;667:202;667:203;667:204;278:205;278:206;278:207;278:208;722:209;722:210;778:211;778:212;778:213;778:214;778:215;584:216;778:217;722:218;722:219;722:220;722:221;667:222;667:223;611:224;556:225;556:226;556:227;556:228;556:229;556:230;889:231;556:232;556:233;556:234;556:235;556:236;278:237;278:238;278:239;278:240;611:241;611:242;611:243;611:244;611:245;611:246;611:247;584:248;611:249;611:250;611:251;611:252;611:253;556:254;611:255;556:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_helveticabi, Type = String, Dynamic = False, Default = \"0;278:1;278:2;278:3;278:4;278:5;278:6;278:7;278:8;278:9;278:10;278:11;278:12;278:13;278:14;278:15;278:16;278:17;278:18;278:19;278:20;278:21;278:22;278:23;278:24;278:25;278:26;278:27;278:28;278:29;278:30;278:31;278:32;278:33;333:34;474:35;556:36;556:37;889:38;722:39;238:40;333:41;333:42;389:43;584:44;278:45;333:46;278:47;278:48;556:49;556:50;556:51;556:52;556:53;556:54;556:55;556:56;556:57;556:58;333:59;333:60;584:61;584:62;584:63;611:64;975:65;722:66;722:67;722:68;722:69;667:70;611:71;778:72;722:73;278:74;556:75;722:76;611:77;833:78;722:79;778:80;667:81;778:82;722:83;667:84;611:85;722:86;667:87;944:88;667:89;667:90;611:91;333:92;278:93;333:94;584:95;556:96;333:97;556:98;611:99;556:100;611:101;556:102;333:103;611:104;611:105;278:106;278:107;556:108;278:109;889:110;611:111;611:112;611:113;611:114;389:115;556:116;333:117;611:118;556:119;778:120;556:121;556:122;500:123;389:124;280:125;389:126;584:127;350:128;556:129;350:130;278:131;556:132;500:133;1000:134;556:135;556:136;333:137;1000:138;667:139;333:140;1000:141;350:142;611:143;350:144;350:145;278:146;278:147;500:148;500:149;350:150;556:151;1000:152;333:153;1000:154;556:155;333:156;944:157;350:158;500:159;667:160;278:161;333:162;556:163;556:164;556:165;556:166;280:167;556:168;333:169;737:170;370:171;556:172;584:173;333:174;737:175;333:176;400:177;584:178;333:179;333:180;333:181;611:182;556:183;278:184;333:185;333:186;365:187;556:188;834:189;834:190;834:191;611:192;722:193;722:194;722:195;722:196;722:197;722:198;1000:199;722:200;667:201;667:202;667:203;667:204;278:205;278:206;278:207;278:208;722:209;722:210;778:211;778:212;778:213;778:214;778:215;584:216;778:217;722:218;722:219;722:220;722:221;667:222;667:223;611:224;556:225;556:226;556:227;556:228;556:229;556:230;889:231;556:232;556:233;556:234;556:235;556:236;278:237;278:238;278:239;278:240;611:241;611:242;611:243;611:244;611:245;611:246;611:247;584:248;611:249;611:250;611:251;611:252;611:253;556:254;611:255;556:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_helveticai, Type = String, Dynamic = False, Default = \"0;278:1;278:2;278:3;278:4;278:5;278:6;278:7;278:8;278:9;278:10;278:11;278:12;278:13;278:14;278:15;278:16;278:17;278:18;278:19;278:20;278:21;278:22;278:23;278:24;278:25;278:26;278:27;278:28;278:29;278:30;278:31;278:32;278:33;278:34;355:35;556:36;556:37;889:38;667:39;191:40;333:41;333:42;389:43;584:44;278:45;333:46;278:47;278:48;556:49;556:50;556:51;556:52;556:53;556:54;556:55;556:56;556:57;556:58;278:59;278:60;584:61;584:62;584:63;556:64;1015:65;667:66;667:67;722:68;722:69;667:70;611:71;778:72;722:73;278:74;500:75;667:76;556:77;833:78;722:79;778:80;667:81;778:82;722:83;667:84;611:85;722:86;667:87;944:88;667:89;667:90;611:91;278:92;278:93;278:94;469:95;556:96;333:97;556:98;556:99;500:100;556:101;556:102;278:103;556:104;556:105;222:106;222:107;500:108;222:109;833:110;556:111;556:112;556:113;556:114;333:115;500:116;278:117;556:118;500:119;722:120;500:121;500:122;500:123;334:124;260:125;334:126;584:127;350:128;556:129;350:130;222:131;556:132;333:133;1000:134;556:135;556:136;333:137;1000:138;667:139;333:140;1000:141;350:142;611:143;350:144;350:145;222:146;222:147;333:148;333:149;350:150;556:151;1000:152;333:153;1000:154;500:155;333:156;944:157;350:158;500:159;667:160;278:161;333:162;556:163;556:164;556:165;556:166;260:167;556:168;333:169;737:170;370:171;556:172;584:173;333:174;737:175;333:176;400:177;584:178;333:179;333:180;333:181;556:182;537:183;278:184;333:185;333:186;365:187;556:188;834:189;834:190;834:191;611:192;667:193;667:194;667:195;667:196;667:197;667:198;1000:199;722:200;667:201;667:202;667:203;667:204;278:205;278:206;278:207;278:208;722:209;722:210;778:211;778:212;778:213;778:214;778:215;584:216;778:217;722:218;722:219;722:220;722:221;667:222;667:223;611:224;556:225;556:226;556:227;556:228;556:229;556:230;889:231;500:232;556:233;556:234;556:235;556:236;278:237;278:238;278:239;278:240;556:241;556:242;556:243;556:244;556:245;556:246;556:247;584:248;611:249;556:250;556:251;556:252;556:253;500:254;556:255;500:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_symbol, Type = String, Dynamic = False, Default = \"0;250:1;250:2;250:3;250:4;250:5;250:6;250:7;250:8;250:9;250:10;250:11;250:12;250:13;250:14;250:15;250:16;250:17;250:18;250:19;250:20;250:21;250:22;250:23;250:24;250:25;250:26;250:27;250:28;250:29;250:30;250:31;250:32;250:33;333:34;713:35;500:36;549:37;833:38;778:39;439:40;333:41;333:42;500:43;549:44;250:45;549:46;250:47;278:48;500:49;500:50;500:51;500:52;500:53;500:54;500:55;500:56;500:57;500:58;278:59;278:60;549:61;549:62;549:63;444:64;549:65;722:66;667:67;722:68;612:69;611:70;763:71;603:72;722:73;333:74;631:75;722:76;686:77;889:78;722:79;722:80;768:81;741:82;556:83;592:84;611:85;690:86;439:87;768:88;645:89;795:90;611:91;333:92;863:93;333:94;658:95;500:96;500:97;631:98;549:99;549:100;494:101;439:102;521:103;411:104;603:105;329:106;603:107;549:108;549:109;576:110;521:111;549:112;549:113;521:114;549:115;603:116;439:117;576:118;713:119;686:120;493:121;686:122;494:123;480:124;200:125;480:126;549:127;0:128;0:129;0:130;0:131;0:132;0:133;0:134;0:135;0:136;0:137;0:138;0:139;0:140;0:141;0:142;0:143;0:144;0:145;0:146;0:147;0:148;0:149;0:150;0:151;0:152;0:153;0:154;0:155;0:156;0:157;0:158;0:159;0:160;750:161;620:162;247:163;549:164;167:165;713:166;500:167;753:168;753:169;753:170;753:171;1042:172;987:173;603:174;987:175;603:176;400:177;549:178;411:179;549:180;549:181;713:182;494:183;460:184;549:185;549:186;549:187;549:188;1000:189;603:190;1000:191;658:192;823:193;686:194;795:195;987:196;768:197;768:198;823:199;768:200;768:201;713:202;713:203;713:204;713:205;713:206;713:207;713:208;768:209;713:210;790:211;790:212;890:213;823:214;549:215;250:216;713:217;603:218;603:219;1042:220;987:221;603:222;987:223;603:224;494:225;329:226;790:227;790:228;786:229;713:230;384:231;384:232;384:233;384:234;384:235;384:236;494:237;494:238;494:239;494:240;0:241;329:242;274:243;686:244;686:245;686:246;384:247;384:248;384:249;384:250;384:251;384:252;494:253;494:254;494:255;0:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_times, Type = String, Dynamic = False, Default = \"0;250:1;250:2;250:3;250:4;250:5;250:6;250:7;250:8;250:9;250:10;250:11;250:12;250:13;250:14;250:15;250:16;250:17;250:18;250:19;250:20;250:21;250:22;250:23;250:24;250:25;250:26;250:27;250:28;250:29;250:30;250:31;250:32;250:33;333:34;408:35;500:36;500:37;833:38;778:39;180:40;333:41;333:42;500:43;564:44;250:45;333:46;250:47;278:48;500:49;500:50;500:51;500:52;500:53;500:54;500:55;500:56;500:57;500:58;278:59;278:60;564:61;564:62;564:63;444:64;921:65;722:66;667:67;667:68;722:69;611:70;556:71;722:72;722:73;333:74;389:75;722:76;611:77;889:78;722:79;722:80;556:81;722:82;667:83;556:84;611:85;722:86;722:87;944:88;722:89;722:90;611:91;333:92;278:93;333:94;469:95;500:96;333:97;444:98;500:99;444:100;500:101;444:102;333:103;500:104;500:105;278:106;278:107;500:108;278:109;778:110;500:111;500:112;500:113;500:114;333:115;389:116;278:117;500:118;500:119;722:120;500:121;500:122;444:123;480:124;200:125;480:126;541:127;350:128;500:129;350:130;333:131;500:132;444:133;1000:134;500:135;500:136;333:137;1000:138;556:139;333:140;889:141;350:142;611:143;350:144;350:145;333:146;333:147;444:148;444:149;350:150;500:151;1000:152;333:153;980:154;389:155;333:156;722:157;350:158;444:159;722:160;250:161;333:162;500:163;500:164;500:165;500:166;200:167;500:168;333:169;760:170;276:171;500:172;564:173;333:174;760:175;333:176;400:177;564:178;300:179;300:180;333:181;500:182;453:183;250:184;333:185;300:186;310:187;500:188;750:189;750:190;750:191;444:192;722:193;722:194;722:195;722:196;722:197;722:198;889:199;667:200;611:201;611:202;611:203;611:204;333:205;333:206;333:207;333:208;722:209;722:210;722:211;722:212;722:213;722:214;722:215;564:216;722:217;722:218;722:219;722:220;722:221;722:222;556:223;500:224;444:225;444:226;444:227;444:228;444:229;444:230;667:231;444:232;444:233;444:234;444:235;444:236;278:237;278:238;278:239;278:240;500:241;500:242;500:243;500:244;500:245;500:246;500:247;564:248;500:249;500:250;500:251;500:252;500:253;500:254;500:255;500:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_timesb, Type = String, Dynamic = False, Default = \"0;250:1;250:2;250:3;250:4;250:5;250:6;250:7;250:8;250:9;250:10;250:11;250:12;250:13;250:14;250:15;250:16;250:17;250:18;250:19;250:20;250:21;250:22;250:23;250:24;250:25;250:26;250:27;250:28;250:29;250:30;250:31;250:32;250:33;333:34;555:35;500:36;500:37;1000:38;833:39;278:40;333:41;333:42;500:43;570:44;250:45;333:46;250:47;278:48;500:49;500:50;500:51;500:52;500:53;500:54;500:55;500:56;500:57;500:58;333:59;333:60;570:61;570:62;570:63;500:64;930:65;722:66;667:67;722:68;722:69;667:70;611:71;778:72;778:73;389:74;500:75;778:76;667:77;944:78;722:79;778:80;611:81;778:82;722:83;556:84;667:85;722:86;722:87;1000:88;722:89;722:90;667:91;333:92;278:93;333:94;581:95;500:96;333:97;500:98;556:99;444:100;556:101;444:102;333:103;500:104;556:105;278:106;333:107;556:108;278:109;833:110;556:111;500:112;556:113;556:114;444:115;389:116;333:117;556:118;500:119;722:120;500:121;500:122;444:123;394:124;220:125;394:126;520:127;350:128;500:129;350:130;333:131;500:132;500:133;1000:134;500:135;500:136;333:137;1000:138;556:139;333:140;1000:141;350:142;667:143;350:144;350:145;333:146;333:147;500:148;500:149;350:150;500:151;1000:152;333:153;1000:154;389:155;333:156;722:157;350:158;444:159;722:160;250:161;333:162;500:163;500:164;500:165;500:166;220:167;500:168;333:169;747:170;300:171;500:172;570:173;333:174;747:175;333:176;400:177;570:178;300:179;300:180;333:181;556:182;540:183;250:184;333:185;300:186;330:187;500:188;750:189;750:190;750:191;500:192;722:193;722:194;722:195;722:196;722:197;722:198;1000:199;722:200;667:201;667:202;667:203;667:204;389:205;389:206;389:207;389:208;722:209;722:210;778:211;778:212;778:213;778:214;778:215;570:216;778:217;722:218;722:219;722:220;722:221;722:222;611:223;556:224;500:225;500:226;500:227;500:228;500:229;500:230;722:231;444:232;444:233;444:234;444:235;444:236;278:237;278:238;278:239;278:240;500:241;556:242;500:243;500:244;500:245;500:246;500:247;570:248;500:249;556:250;556:251;556:252;556:253;500:254;556:255;500:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_timesbi, Type = String, Dynamic = False, Default = \"0;250:1;250:2;250:3;250:4;250:5;250:6;250:7;250:8;250:9;250:10;250:11;250:12;250:13;250:14;250:15;250:16;250:17;250:18;250:19;250:20;250:21;250:22;250:23;250:24;250:25;250:26;250:27;250:28;250:29;250:30;250:31;250:32;250:33;389:34;555:35;500:36;500:37;833:38;778:39;278:40;333:41;333:42;500:43;570:44;250:45;333:46;250:47;278:48;500:49;500:50;500:51;500:52;500:53;500:54;500:55;500:56;500:57;500:58;333:59;333:60;570:61;570:62;570:63;500:64;832:65;667:66;667:67;667:68;722:69;667:70;667:71;722:72;778:73;389:74;500:75;667:76;611:77;889:78;722:79;722:80;611:81;722:82;667:83;556:84;611:85;722:86;667:87;889:88;667:89;611:90;611:91;333:92;278:93;333:94;570:95;500:96;333:97;500:98;500:99;444:100;500:101;444:102;333:103;500:104;556:105;278:106;278:107;500:108;278:109;778:110;556:111;500:112;500:113;500:114;389:115;389:116;278:117;556:118;444:119;667:120;500:121;444:122;389:123;348:124;220:125;348:126;570:127;350:128;500:129;350:130;333:131;500:132;500:133;1000:134;500:135;500:136;333:137;1000:138;556:139;333:140;944:141;350:142;611:143;350:144;350:145;333:146;333:147;500:148;500:149;350:150;500:151;1000:152;333:153;1000:154;389:155;333:156;722:157;350:158;389:159;611:160;250:161;389:162;500:163;500:164;500:165;500:166;220:167;500:168;333:169;747:170;266:171;500:172;606:173;333:174;747:175;333:176;400:177;570:178;300:179;300:180;333:181;576:182;500:183;250:184;333:185;300:186;300:187;500:188;750:189;750:190;750:191;500:192;667:193;667:194;667:195;667:196;667:197;667:198;944:199;667:200;667:201;667:202;667:203;667:204;389:205;389:206;389:207;389:208;722:209;722:210;722:211;722:212;722:213;722:214;722:215;570:216;722:217;722:218;722:219;722:220;722:221;611:222;611:223;500:224;500:225;500:226;500:227;500:228;500:229;500:230;722:231;444:232;444:233;444:234;444:235;444:236;278:237;278:238;278:239;278:240;500:241;556:242;500:243;500:244;500:245;500:246;500:247;570:248;500:249;556:250;556:251;556:252;556:253;444:254;500:255;444:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_timesi, Type = String, Dynamic = False, Default = \"0;250:1;250:2;250:3;250:4;250:5;250:6;250:7;250:8;250:9;250:10;250:11;250:12;250:13;250:14;250:15;250:16;250:17;250:18;250:19;250:20;250:21;250:22;250:23;250:24;250:25;250:26;250:27;250:28;250:29;250:30;250:31;250:32;250:33;333:34;420:35;500:36;500:37;833:38;778:39;214:40;333:41;333:42;500:43;675:44;250:45;333:46;250:47;278:48;500:49;500:50;500:51;500:52;500:53;500:54;500:55;500:56;500:57;500:58;333:59;333:60;675:61;675:62;675:63;500:64;920:65;611:66;611:67;667:68;722:69;611:70;611:71;722:72;722:73;333:74;444:75;667:76;556:77;833:78;667:79;722:80;611:81;722:82;611:83;500:84;556:85;722:86;611:87;833:88;611:89;556:90;556:91;389:92;278:93;389:94;422:95;500:96;333:97;500:98;500:99;444:100;500:101;444:102;278:103;500:104;500:105;278:106;278:107;444:108;278:109;722:110;500:111;500:112;500:113;500:114;389:115;389:116;278:117;500:118;444:119;667:120;444:121;444:122;389:123;400:124;275:125;400:126;541:127;350:128;500:129;350:130;333:131;500:132;556:133;889:134;500:135;500:136;333:137;1000:138;500:139;333:140;944:141;350:142;556:143;350:144;350:145;333:146;333:147;556:148;556:149;350:150;500:151;889:152;333:153;980:154;389:155;333:156;667:157;350:158;389:159;556:160;250:161;389:162;500:163;500:164;500:165;500:166;275:167;500:168;333:169;760:170;276:171;500:172;675:173;333:174;760:175;333:176;400:177;675:178;300:179;300:180;333:181;500:182;523:183;250:184;333:185;300:186;310:187;500:188;750:189;750:190;750:191;500:192;611:193;611:194;611:195;611:196;611:197;611:198;889:199;667:200;611:201;611:202;611:203;611:204;333:205;333:206;333:207;333:208;722:209;667:210;722:211;722:212;722:213;722:214;722:215;675:216;722:217;722:218;722:219;722:220;722:221;556:222;611:223;500:224;500:225;500:226;500:227;500:228;500:229;500:230;667:231;444:232;444:233;444:234;444:235;444:236;278:237;278:238;278:239;278:240;500:241;500:242;500:243;500:244;500:245;500:246;500:247;675:248;500:249;500:250;500:251;500:252;500:253;444:254;500:255;444:", Scope = Private #tag EndConstant #tag Constant, Name = kCT_zapfdingbats, Type = String, Dynamic = False, Default = \"0;0:1;0:2;0:3;0:4;0:5;0:6;0:7;0:8;0:9;0:10;0:11;0:12;0:13;0:14;0:15;0:16;0:17;0:18;0:19;0:20;0:21;0:22;0:23;0:24;0:25;0:26;0:27;0:28;0:29;0:30;0:31;0:32;278:33;974:34;961:35;974:36;980:37;719:38;789:39;790:40;791:41;690:42;960:43;939:44;549:45;855:46;911:47;933:48;911:49;945:50;974:51;755:52;846:53;762:54;761:55;571:56;677:57;763:58;760:59;759:60;754:61;494:62;552:63;537:64;577:65;692:66;786:67;788:68;788:69;790:70;793:71;794:72;816:73;823:74;789:75;841:76;823:77;833:78;816:79;831:80;923:81;744:82;723:83;749:84;790:85;792:86;695:87;776:88;768:89;792:90;759:91;707:92;708:93;682:94;701:95;826:96;815:97;789:98;789:99;707:100;687:101;696:102;689:103;786:104;787:105;713:106;791:107;785:108;791:109;873:110;761:111;762:112;762:113;759:114;759:115;892:116;892:117;788:118;784:119;438:120;138:121;277:122;415:123;392:124;392:125;668:126;668:127;0:128;390:129;390:130;317:131;317:132;276:133;276:134;509:135;509:136;410:137;410:138;234:139;234:140;334:141;334:142;0:143;0:144;0:145;0:146;0:147;0:148;0:149;0:150;0:151;0:152;0:153;0:154;0:155;0:156;0:157;0:158;0:159;0:160;0:161;732:162;544:163;544:164;910:165;667:166;760:167;760:168;776:169;595:170;694:171;626:172;788:173;788:174;788:175;788:176;788:177;788:178;788:179;788:180;788:181;788:182;788:183;788:184;788:185;788:186;788:187;788:188;788:189;788:190;788:191;788:192;788:193;788:194;788:195;788:196;788:197;788:198;788:199;788:200;788:201;788:202;788:203;788:204;788:205;788:206;788:207;788:208;788:209;788:210;788:211;788:212;894:213;838:214;1016:215;458:216;748:217;924:218;748:219;918:220;927:221;928:222;928:223;834:224;873:225;828:226;924:227;924:228;917:229;930:230;931:231;463:232;883:233;836:234;836:235;867:236;867:237;696:238;696:239;874:240;0:241;874:242;760:243;946:244;771:245;865:246;771:247;888:248;967:249;888:250;831:251;873:252;927:253;970:254;918:255;0:", Scope = Private #tag EndConstant #tag Constant, Name = kCT__fielddelim, Type = String, Dynamic = False, Default = \";", Scope = Private #tag EndConstant #tag Constant, Name = kCT__rowdelim, Type = String, Dynamic = False, Default = \":", Scope = Private #tag EndConstant #tag ViewBehavior #tag ViewProperty Name="Index" Visible=true Group="ID" InitialValue="-2147483648" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Left" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Name" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Super" Visible=true Group="ID" InheritedFrom="Object" #tag EndViewProperty #tag ViewProperty Name="Top" Visible=true Group="Position" InitialValue="0" InheritedFrom="Object" #tag EndViewProperty #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file diff --git a/fpdf.rbo b/fpdf.rbo deleted file mode 100755 index c07d40d263884da93ae34482eac5b708d2a265dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125976 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 uzjLXYO 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 F**`zWBq0C* diff --git a/rsfpdf.rbvcp b/rsfpdf.rbvcp index 5a820c4..c3ae677 100644 --- a/rsfpdf.rbvcp +++ b/rsfpdf.rbvcp @@ -1 +1 @@ -Type=Desktop RBProjectVersion=2011.02 MinIDEVersion=20110100 Class=App;App.rbbas;&h64F77FFF;&h0;false Window=Window1;Window1.rbfrm;&h601087FF;&h0;false MenuBar=MenuBar1;MenuBar1.rbmnu;&h79D817FF;&h0;false Class=Example2;Example2.rbbas;&h59332FFF;&h0;false Class=Example4;Example4.rbbas;&h18AF7FF;&h0;false Class=fpdf;fpdf.rbo;&h5FB20FFF;&h0;false Module=zlib;zlib.rbo;&h4AAE27FF;&h0;false BuildSteps=Build Automation;Build Automation.rbbas;&h5759A003;&h0;false DefaultWindow=Window1 AppMenuBar=MenuBar1 MajorVersion=0 MinorVersion=0 SubVersion=4 NonRelease=3 Release=2 InfoVersion= LongVersion= ShortVersion= WinCompanyName= WinInternalName= WinProductName= AutoIncrementVersionInformation=True BuildFlags=&h1890 BuildLanguage=&h0 DebugLanguage=&h0 Region=0 WindowsName=rsFPDF Demo MacCarbonMachName=rsFPDF Demo LinuxX86Name=rsfpdf_demo MacCreator= MDI=0 MDICaption= DefaultEncoding=&h0 AppIcon=rsfpdf.rbres;&h0 OSXBundleID= DebuggerCommandLine= UseGDIPlus=False UseBuildsFolder=True IsWebProject=False \ No newline at end of file +Type=Desktop RBProjectVersion=2011.02 MinIDEVersion=20110100 Class=App;App.rbbas;&h64F77FFF;&h0;false Window=Window1;Window1.rbfrm;&h601087FF;&h0;false MenuBar=MenuBar1;MenuBar1.rbmnu;&h79D817FF;&h0;false Class=Example2;Example2.rbbas;&h59332FFF;&h0;false Class=Example4;Example4.rbbas;&h18AF7FF;&h0;false Module=zlib;zlib.rbo;&h4AAE27FF;&h0;false BuildSteps=Build Automation;Build Automation.rbbas;&h5759A003;&h0;false Class=fpdf;fpdf.rbbas;&h1F0567FF;&h0;false DefaultWindow=Window1 AppMenuBar=MenuBar1 MajorVersion=0 MinorVersion=0 SubVersion=4 NonRelease=3 Release=2 InfoVersion= LongVersion= ShortVersion= WinCompanyName= WinInternalName= WinProductName= AutoIncrementVersionInformation=True BuildFlags=&h1890 BuildLanguage=&h0 DebugLanguage=&h0 Region=0 WindowsName=rsFPDF Demo MacCarbonMachName=rsFPDF Demo LinuxX86Name=rsfpdf_demo MacCreator= MDI=0 MDICaption= DefaultEncoding=&h0 AppIcon=rsfpdf.rbres;&h0 OSXBundleID= DebuggerCommandLine= UseGDIPlus=False UseBuildsFolder=True IsWebProject=False \ No newline at end of file