diff --git a/App.rbbas b/App.rbbas index 932fa60..4b7d02a 100644 --- a/App.rbbas +++ b/App.rbbas @@ -1 +1,22 @@ -#tag Class Protected Class App Inherits Application #tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \"&Delete", Scope = Public #Tag Instance, Platform = Windows, Language = Default, Definition = \"&Delete" #Tag Instance, Platform = Linux, Language = Default, Definition = \"&Delete" #tag EndConstant #tag Constant, Name = kFileQuit, Type = String, Dynamic = False, Default = \"&Quit", Scope = Public #Tag Instance, Platform = Windows, Language = Default, Definition = \"E&xit" #tag EndConstant #tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \"", Scope = Public #Tag Instance, Platform = Mac OS, Language = Default, Definition = \"Cmd+Q" #Tag Instance, Platform = Linux, Language = Default, Definition = \"Ctrl+Q" #tag EndConstant #tag ViewBehavior #tag EndViewBehavior End Class #tag EndClass \ No newline at end of file +#tag Class +Protected Class App +Inherits Application + #tag Constant, Name = kEditClear, Type = String, Dynamic = False, Default = \"&Delete", Scope = Public + #Tag Instance, Platform = Windows, Language = Default, Definition = \"&Delete" + #Tag Instance, Platform = Linux, Language = Default, Definition = \"&Delete" + #tag EndConstant + + #tag Constant, Name = kFileQuit, Type = String, Dynamic = False, Default = \"&Quit", Scope = Public + #Tag Instance, Platform = Windows, Language = Default, Definition = \"E&xit" + #tag EndConstant + + #tag Constant, Name = kFileQuitShortcut, Type = String, Dynamic = False, Default = \"", Scope = Public + #Tag Instance, Platform = Mac OS, Language = Default, Definition = \"Cmd+Q" + #Tag Instance, Platform = Linux, Language = Default, Definition = \"Ctrl+Q" + #tag EndConstant + + + #tag ViewBehavior + #tag EndViewBehavior +End Class +#tag EndClass diff --git a/Build Automation.rbbas b/Build Automation.rbbas index f75999a..f9b6aee 100644 --- a/Build Automation.rbbas +++ b/Build Automation.rbbas @@ -1 +1,14 @@ -#tag BuildAutomation Begin BuildStepList Linux Begin BuildProjectStep Build End End Begin BuildStepList Mac OS X Begin BuildProjectStep Build End End Begin BuildStepList Windows Begin BuildProjectStep Build End End #tag EndBuildAutomation \ No newline at end of file +#tag BuildAutomation + Begin BuildStepList Linux + Begin BuildProjectStep Build + End + End + Begin BuildStepList Mac OS X + Begin BuildProjectStep Build + End + End + Begin BuildStepList Windows + Begin BuildProjectStep Build + End + End +#tag EndBuildAutomation diff --git a/Example2.rbbas b/Example2.rbbas index 24070d5..72095c7 100644 --- a/Example2.rbbas +++ b/Example2.rbbas @@ -1 +1,77 @@ -#tag Class Protected Class Example2 Inherits fpdf #tag Method, Flags = &h1 Protected Sub Footer() //Posición: a 1,5 cm del final self.SetY(-15) //Arial italic 8 self.SetFont("Arial","I",8) //Número de página self.Cell(0,10,"Page " + str(self.PageNo()) + "/{nb}",0,0,"C") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub Header() //Logo - must be the full absolute path to the image file. Dim logopath As String logopath = GetFolderItem("").Child("demoinfo").Child("logo_rpdf.png").ShellPath self.Image(logopath,10,8) //Arial bold 15 self.SetFont("Arial","B",15) //Movernos a la derecha self.Cell(80) //Título self.Cell(30,10,"Title",1,0,"C") //Salto de línea self.Ln(20) End Sub #tag EndMethod #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 +#tag Class +Protected Class Example2 +Inherits fpdf + #tag Method, Flags = &h1 + Protected Sub Footer() + //Posición: a 1,5 cm del final + self.SetY(-15) + + //Arial italic 8 + self.SetFont("Arial","I",8) + + //Número de página + self.Cell(0,10,"Page " + str(self.PageNo()) + "/{nb}",0,0,"C") + + End Sub + #tag EndMethod + + #tag Method, Flags = &h1 + Protected Sub Header() + + //Logo - must be the full absolute path to the image file. + Dim logopath As String + logopath = GetFolderItem("").Child("demoinfo").Child("logo_rpdf.png").ShellPath + self.Image(logopath,10,8) + + //Arial bold 15 + self.SetFont("Arial","B",15) + + //Movernos a la derecha + self.Cell(80) + + //Título + self.Cell(30,10,"Title",1,0,"C") + + //Salto de línea + self.Ln(20) + End Sub + #tag EndMethod + + + #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 diff --git a/Example4.rbbas b/Example4.rbbas index d0d2fc2..fc32f03 100644 --- a/Example4.rbbas +++ b/Example4.rbbas @@ -1 +1,202 @@ -#tag Class Protected Class Example4 Inherits fpdf #tag Method, Flags = &h1 Protected Function AcceptPageBreak() As boolean //Método que acepta o no el salto automático de página if(me.col < 2) then //Go to next column me.SetCol(me.col+1) //reset Y0 me.SetY(me.y0) //go to the next page return false else //Back to first column me.SetCol(0) //Page Break return true end if End Function #tag EndMethod #tag Method, Flags = &h1 Protected Sub ChapterBody(charfile as string) //Abrir fichero de texto Dim f As FolderItem Dim t As TextInputStream dim txt as string f = new FolderItem f = GetFolderItem("demoinfo").child(charfile) if f = nil then return // Could not locate file t = f.OpenAsTextFile t.Encoding = Encodings.ASCII txt = t.readall t.close //Font me.SetFont("Times","",12) //Print text in 6cm column me.MultiCell(60,5,txt) me.Ln() //Cita en itálica me.SetFont("","I") me.Cell(0,5,"(end of file)") //Volver a la primera columna me.SetCol(0) End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub ChapterTitle(num as integer, label as string) dim title as string title = "Chapter " + str(num) + " : " + label //Title me.SetFont("Arial","",12) me.SetFillColor(200,220,255) me.Cell(0,6,title,0,1,"L",1) me.Ln(4) //Guardar ordenada me.y0=me.GetY() End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub Footer() //Pie de página me.SetY(-15) me.SetFont("Arial","I",8) me.SetTextColor(128) me.Cell(0,10,"Page " + str(me.PageNo), 0, 0,"C") End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub Header() dim w as double me.SetFont("Arial","B",15) w = me.GetStringWidth(me.title) + 6 me.SetX( (210 - w) / 2) me.SetDrawColor(0,80,180) me.SetFillColor(230,230,0) me.SetTextColor(220,50,50) me.SetLineWidth(1) me.Cell(w,9,me.title, 1, 1,"C", 1) me.Ln(10) //Guardar ordenada me.y0 = me.GetY() End Sub #tag EndMethod #tag Method, Flags = &h0 Sub PrintChapter(num as integer, title as string, file as string) //Add Chapter me.AddPage() me.ChapterTitle(num,title) me.ChapterBody(file) End Sub #tag EndMethod #tag Method, Flags = &h1 Protected Sub SetCol(col as integer) dim x as double //Establecer la posición de una columna dada me.col = col x = 10 + col * 65 me.SetLeftMargin(x) me.SetX(x) End Sub #tag EndMethod #tag Property, Flags = &h21 #tag Note //Current Column #tag EndNote Private col As Integer #tag EndProperty #tag Property, Flags = &h21 #tag Note //Ordenada de Comienzo de Columna #tag EndNote Private y0 As Integer #tag EndProperty #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 +#tag Class +Protected Class Example4 +Inherits fpdf + #tag Method, Flags = &h1 + Protected Function AcceptPageBreak() As boolean + //Método que acepta o no el salto automático de página + + if(me.col < 2) then + + //Go to next column + me.SetCol(me.col+1) + + //reset Y0 + me.SetY(me.y0) + + //go to the next page + return false + + else + + //Back to first column + me.SetCol(0) + + //Page Break + return true + + end if + + End Function + #tag EndMethod + + #tag Method, Flags = &h1 + Protected Sub ChapterBody(charfile as string) + //Abrir fichero de texto + Dim f As FolderItem + Dim t As TextInputStream + dim txt as string + + f = new FolderItem + f = GetFolderItem("demoinfo").child(charfile) + + if f = nil then return // Could not locate file + + t = f.OpenAsTextFile + t.Encoding = Encodings.ASCII + txt = t.readall + t.close + + //Font + me.SetFont("Times","",12) + + //Print text in 6cm column + me.MultiCell(60,5,txt) + me.Ln() + + //Cita en itálica + me.SetFont("","I") + me.Cell(0,5,"(end of file)") + + //Volver a la primera columna + me.SetCol(0) + + + End Sub + #tag EndMethod + + #tag Method, Flags = &h1 + Protected Sub ChapterTitle(num as integer, label as string) + dim title as string + + title = "Chapter " + str(num) + " : " + label + + //Title + me.SetFont("Arial","",12) + me.SetFillColor(200,220,255) + me.Cell(0,6,title,0,1,"L",1) + me.Ln(4) + + //Guardar ordenada + me.y0=me.GetY() + End Sub + #tag EndMethod + + #tag Method, Flags = &h1 + Protected Sub Footer() + //Pie de página + + me.SetY(-15) + me.SetFont("Arial","I",8) + me.SetTextColor(128) + me.Cell(0,10,"Page " + str(me.PageNo), 0, 0,"C") + + End Sub + #tag EndMethod + + #tag Method, Flags = &h1 + Protected Sub Header() + dim w as double + + me.SetFont("Arial","B",15) + + w = me.GetStringWidth(me.title) + 6 + + me.SetX( (210 - w) / 2) + + me.SetDrawColor(0,80,180) + + me.SetFillColor(230,230,0) + + me.SetTextColor(220,50,50) + + me.SetLineWidth(1) + + me.Cell(w,9,me.title, 1, 1,"C", 1) + + me.Ln(10) + + //Guardar ordenada + me.y0 = me.GetY() + + + End Sub + #tag EndMethod + + #tag Method, Flags = &h0 + Sub PrintChapter(num as integer, title as string, file as string) + //Add Chapter + + me.AddPage() + me.ChapterTitle(num,title) + me.ChapterBody(file) + + End Sub + #tag EndMethod + + #tag Method, Flags = &h1 + Protected Sub SetCol(col as integer) + dim x as double + + //Establecer la posición de una columna dada + me.col = col + x = 10 + col * 65 + me.SetLeftMargin(x) + me.SetX(x) + + + End Sub + #tag EndMethod + + + #tag Property, Flags = &h21 + #tag Note + //Current Column + #tag EndNote + Private col As Integer + #tag EndProperty + + #tag Property, Flags = &h21 + #tag Note + //Ordenada de Comienzo de Columna + #tag EndNote + Private y0 As Integer + #tag EndProperty + + + #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 diff --git a/MenuBar1.rbmnu b/MenuBar1.rbmnu index 252bf3e..d3b0c11 100644 --- a/MenuBar1.rbmnu +++ b/MenuBar1.rbmnu @@ -1 +1,87 @@ -#tag Menu Begin Menu MenuBar1 Begin MenuItem FileMenu SpecialMenu = 0 Text = "&File" Index = -2147483648 AutoEnable = True Begin QuitMenuItem FileQuit SpecialMenu = 0 Text = "#App.kFileQuit" Index = -2147483648 ShortcutKey = "#App.kFileQuitShortcut" Shortcut = "#App.kFileQuitShortcut" AutoEnable = True End End Begin MenuItem EditMenu SpecialMenu = 0 Text = "&Edit" Index = -2147483648 AutoEnable = True Begin MenuItem EditUndo SpecialMenu = 0 Text = "&Undo" Index = -2147483648 ShortcutKey = "Z" Shortcut = "Cmd+Z" MenuModifier = True AutoEnable = True End Begin MenuItem UntitledMenu1 SpecialMenu = 0 Text = "-" Index = -2147483648 AutoEnable = True End Begin MenuItem EditCut SpecialMenu = 0 Text = "Cu&t" Index = -2147483648 ShortcutKey = "X" Shortcut = "Cmd+X" MenuModifier = True AutoEnable = True End Begin MenuItem EditCopy SpecialMenu = 0 Text = "&Copy" Index = -2147483648 ShortcutKey = "C" Shortcut = "Cmd+C" MenuModifier = True AutoEnable = True End Begin MenuItem EditPaste SpecialMenu = 0 Text = "&Paste" Index = -2147483648 ShortcutKey = "V" Shortcut = "Cmd+V" MenuModifier = True AutoEnable = True End Begin MenuItem EditClear SpecialMenu = 0 Text = "#App.kEditClear" Index = -2147483648 AutoEnable = True End Begin MenuItem UntitledMenu0 SpecialMenu = 0 Text = "-" Index = -2147483648 AutoEnable = True End Begin MenuItem EditSelectAll SpecialMenu = 0 Text = "Select &All" Index = -2147483648 ShortcutKey = "A" Shortcut = "Cmd+A" MenuModifier = True AutoEnable = True End End End #tag EndMenu \ No newline at end of file +#tag Menu +Begin Menu MenuBar1 + Begin MenuItem FileMenu + SpecialMenu = 0 + Text = "&File" + Index = -2147483648 + AutoEnable = True + Begin QuitMenuItem FileQuit + SpecialMenu = 0 + Text = "#App.kFileQuit" + Index = -2147483648 + ShortcutKey = "#App.kFileQuitShortcut" + Shortcut = "#App.kFileQuitShortcut" + AutoEnable = True + End + End + Begin MenuItem EditMenu + SpecialMenu = 0 + Text = "&Edit" + Index = -2147483648 + AutoEnable = True + Begin MenuItem EditUndo + SpecialMenu = 0 + Text = "&Undo" + Index = -2147483648 + ShortcutKey = "Z" + Shortcut = "Cmd+Z" + MenuModifier = True + AutoEnable = True + End + Begin MenuItem UntitledMenu1 + SpecialMenu = 0 + Text = "-" + Index = -2147483648 + AutoEnable = True + End + Begin MenuItem EditCut + SpecialMenu = 0 + Text = "Cu&t" + Index = -2147483648 + ShortcutKey = "X" + Shortcut = "Cmd+X" + MenuModifier = True + AutoEnable = True + End + Begin MenuItem EditCopy + SpecialMenu = 0 + Text = "&Copy" + Index = -2147483648 + ShortcutKey = "C" + Shortcut = "Cmd+C" + MenuModifier = True + AutoEnable = True + End + Begin MenuItem EditPaste + SpecialMenu = 0 + Text = "&Paste" + Index = -2147483648 + ShortcutKey = "V" + Shortcut = "Cmd+V" + MenuModifier = True + AutoEnable = True + End + Begin MenuItem EditClear + SpecialMenu = 0 + Text = "#App.kEditClear" + Index = -2147483648 + AutoEnable = True + End + Begin MenuItem UntitledMenu0 + SpecialMenu = 0 + Text = "-" + Index = -2147483648 + AutoEnable = True + End + Begin MenuItem EditSelectAll + SpecialMenu = 0 + Text = "Select &All" + Index = -2147483648 + ShortcutKey = "A" + Shortcut = "Cmd+A" + MenuModifier = True + AutoEnable = True + End + End +End +#tag EndMenu diff --git a/Window1.rbfrm b/Window1.rbfrm index 5d0f0f2..a1d9d93 100644 --- a/Window1.rbfrm +++ b/Window1.rbfrm @@ -1 +1,573 @@ -#tag Window Begin Window Window1 BackColor = 16777215 Backdrop = "" CloseButton = True Composite = False Frame = 0 FullScreen = False HasBackColor = False Height = 2.38e+2 ImplicitInstance= True LiveResize = False MacProcID = 0 MaxHeight = 32000 MaximizeButton = False MaxWidth = 32000 MenuBar = 2044205055 MenuBarVisible = True MinHeight = 238 MinimizeButton = False MinWidth = 420 Placement = 0 Resizeable = False Title = "rsFPDF Examples" Visible = True Width = 4.53e+2 Begin TextField EditField1 AcceptTabs = "" Alignment = 0 AutoDeactivate = True AutomaticallyCheckSpelling= False BackColor = 16777215 Bold = "" Border = True CueText = "" DataField = "" DataSource = "" Enabled = True Format = "" Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 20 LimitText = 0 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = True LockTop = "" Mask = "" Password = "" ReadOnly = "" Scope = 0 TabIndex = 0 TabPanelIndex = 0 TabStop = True Text = "Hello Word!" TextColor = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 26 Underline = "" UseFocusRing = True Visible = True Width = 413 End Begin PushButton Example3 AutoDeactivate = True Bold = "" ButtonStyle = 0 Cancel = "" Caption = "DEMO3" Default = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 20 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = False LockTop = True Scope = 0 TabIndex = 1 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 128 Underline = "" Visible = True Width = 80 End Begin PushButton Example2 AutoDeactivate = True Bold = "" ButtonStyle = 0 Cancel = "" Caption = "DEMO2" Default = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 20 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = False LockTop = True Scope = 0 TabIndex = 2 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 94 Underline = "" Visible = True Width = 80 End Begin PushButton Example1 AutoDeactivate = True Bold = "" ButtonStyle = 0 Cancel = "" Caption = "DEMO1" Default = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 20 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = False LockTop = True Scope = 0 TabIndex = 3 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 60 Underline = "" Visible = True Width = 80 End Begin Label StaticText1 AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 112 LockBottom = "" LockedInPosition= False LockLeft = "" LockRight = "" LockTop = "" Multiline = False Scope = 0 Selectable = False TabIndex = 4 TabPanelIndex = 0 Text = "Generate Letter Page and insert EditField text in it." TextAlign = 0 TextColor = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 60 Transparent = False Underline = "" Visible = True Width = 328 End Begin Label StaticText2 AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 112 LockBottom = "" LockedInPosition= False LockLeft = "" LockRight = "" LockTop = "" Multiline = False Scope = 0 Selectable = False TabIndex = 5 TabPanelIndex = 0 Text = "Insert a Header and Footer with a page count." TextAlign = 0 TextColor = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 94 Transparent = False Underline = "" Visible = True Width = 309 End Begin Label StaticText3 AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 112 LockBottom = "" LockedInPosition= False LockLeft = "" LockRight = "" LockTop = "" Multiline = False Scope = 0 Selectable = False TabIndex = 6 TabPanelIndex = 0 Text = "Simple Table" TextAlign = 0 TextColor = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 128 Transparent = False Underline = "" Visible = True Width = 309 End Begin PushButton Example4 AutoDeactivate = True Bold = "" ButtonStyle = 0 Cancel = "" Caption = "DEMO4" Default = False Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 20 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = False LockTop = True Scope = 0 TabIndex = 7 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 162 Underline = "" Visible = True Width = 80 End Begin Label StaticText4 AutoDeactivate = True Bold = "" DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 112 LockBottom = "" LockedInPosition= False LockLeft = "" LockRight = "" LockTop = "" Multiline = False Scope = 0 Selectable = False TabIndex = 8 TabPanelIndex = 0 Text = "Multiple Columns" TextAlign = 0 TextColor = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 162 Transparent = False Underline = "" Visible = True Width = 309 End Begin GroupBox GroupBox1 AutoDeactivate = True Bold = "" Caption = "Untitled" Enabled = True Height = 100 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = -315 LockBottom = "" LockedInPosition= False LockLeft = "" LockRight = "" LockTop = "" Scope = 0 TabIndex = 9 TabPanelIndex = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 255 Underline = "" Visible = True Width = 100 End Begin PushButton Example5 AutoDeactivate = True Bold = "" ButtonStyle = 0 Cancel = "" Caption = "DEMO5" Default = False Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 20 LockBottom = "" LockedInPosition= False LockLeft = True LockRight = False LockTop = True Scope = 0 TabIndex = 11 TabPanelIndex = 0 TabStop = True TextFont = "System" TextSize = 0 TextUnit = 0 Top = 196 Underline = "" Visible = True Width = 80 End Begin Label StaticText5 AutoDeactivate = True Bold = False DataField = "" DataSource = "" Enabled = True Height = 22 HelpTag = "" Index = -2147483648 InitialParent = "" Italic = "" Left = 112 LockBottom = "" LockedInPosition= False LockLeft = "" LockRight = "" LockTop = "" Multiline = False Scope = 0 Selectable = False TabIndex = 12 TabPanelIndex = 0 Text = "JPG Inclusion and Hyperlink" TextAlign = 0 TextColor = 0 TextFont = "System" TextSize = 0 TextUnit = 0 Top = 196 Transparent = False Underline = "" Visible = True Width = 267 End End #tag EndWindow #tag WindowCode #tag EndWindowCode #tag Events Example3 #tag Event Sub Action() dim pdf as fpdf dim j,i as integer me.Enabled = False pdf = new FPDF("P") pdf.AddPage() pdf.SetFont("Courier","",8) //Cabecera for i = 1 to 4 pdf.Cell(40,7,"Cabecera " + str(i),1) next i pdf.Ln() //Datos for j = 1 to 10 for i = 1 to 4 pdf.cell(40,6,"Item " + str(i),1) next i pdf.ln() next j pdf.Output(me.Name + ".pdf") me.Enabled = true End Sub #tag EndEvent #tag EndEvents #tag Events Example2 #tag Event Sub Action() dim pdf as Example2 dim j,i as integer me.Enabled = False pdf = new Example2("P" ) pdf.AliasNbPages() pdf.AddPage() pdf.SetFont("Times","",12) for i = 1 to 40 pdf.cell(0,10,"Imprimiendo linea numero " + str(i),0,1) next i pdf.Output(me.Name + ".pdf") me.Enabled = true End Sub #tag EndEvent #tag EndEvents #tag Events Example1 #tag Event Sub Action() dim pdf as fpdf dim j,i as integer me.Enabled = False if EditField1.Text = "" then MsgBox "You must write some text" EditField1.SetFocus return end if pdf = new FPDF("P","mm","letter") pdf.AddPage() pdf.SetFont("Arial","B",16) pdf.Cell(40,10,EditField1.Text) pdf.Output(me.Name + ".pdf") me.Enabled = true End Sub #tag EndEvent #tag EndEvents #tag Events Example4 #tag Event Sub Action() dim pdf as Example4 me.Enabled = False pdf = new Example4("P") pdf.SetTitle("20,000 Leagues Under The Sea") pdf.SetAuthor("Jules Verne") pdf.PrintChapter(1,"A Shifting Reef","20k_c1.txt") pdf.PrintChapter(2,"Pro and Con","20k_c2.txt") pdf.Output(me.Name + ".pdf") me.Enabled = true End Sub #tag EndEvent #tag EndEvents #tag Events Example5 #tag Event Sub Action() dim pdf as fpdf dim link as string me.Enabled = False pdf = new fpdf("P") pdf.SetEnconding(Encodings.WindowsLatin1) //Primera página pdf.AddPage() pdf.SetFont("Arial","",20) pdf.Write(5,"Para saber qué hay de nuevo en este tutorial, pulse ") pdf.SetFont("","U") link = pdf.AddLink() pdf.Write(5,"aqui",link) pdf.SetFont("") //Segunda página pdf.AddPage() pdf.SetLink(link) // pass the absolute shell path as a string to image method Dim chartpath As String chartpath = GetFolderItem("").Child("demoinfo").Child("pie_chart.jpg").ShellPath pdf.Image(chartpath,10,10,150,0,"","https://github.com/roblthegreat/rsfpdf") pdf.Output(me.Name + ".pdf") me.Enabled = true End Sub #tag EndEvent #tag EndEvents \ No newline at end of file +#tag Window +Begin Window Window1 + BackColor = 16777215 + Backdrop = "" + CloseButton = True + Composite = False + Frame = 0 + FullScreen = False + HasBackColor = False + Height = 2.38e+2 + ImplicitInstance= True + LiveResize = False + MacProcID = 0 + MaxHeight = 32000 + MaximizeButton = False + MaxWidth = 32000 + MenuBar = 2044205055 + MenuBarVisible = True + MinHeight = 238 + MinimizeButton = False + MinWidth = 420 + Placement = 0 + Resizeable = False + Title = "rsFPDF Examples" + Visible = True + Width = 4.53e+2 + Begin TextField EditField1 + AcceptTabs = "" + Alignment = 0 + AutoDeactivate = True + AutomaticallyCheckSpelling= False + BackColor = 16777215 + Bold = "" + Border = True + CueText = "" + DataField = "" + DataSource = "" + Enabled = True + Format = "" + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 20 + LimitText = 0 + LockBottom = "" + LockedInPosition= False + LockLeft = True + LockRight = True + LockTop = "" + Mask = "" + Password = "" + ReadOnly = "" + Scope = 0 + TabIndex = 0 + TabPanelIndex = 0 + TabStop = True + Text = "Hello Word!" + TextColor = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 26 + Underline = "" + UseFocusRing = True + Visible = True + Width = 413 + End + Begin PushButton Example3 + AutoDeactivate = True + Bold = "" + ButtonStyle = 0 + Cancel = "" + Caption = "DEMO3" + Default = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 20 + LockBottom = "" + LockedInPosition= False + LockLeft = True + LockRight = False + LockTop = True + Scope = 0 + TabIndex = 1 + TabPanelIndex = 0 + TabStop = True + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 128 + Underline = "" + Visible = True + Width = 80 + End + Begin PushButton Example2 + AutoDeactivate = True + Bold = "" + ButtonStyle = 0 + Cancel = "" + Caption = "DEMO2" + Default = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 20 + LockBottom = "" + LockedInPosition= False + LockLeft = True + LockRight = False + LockTop = True + Scope = 0 + TabIndex = 2 + TabPanelIndex = 0 + TabStop = True + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 94 + Underline = "" + Visible = True + Width = 80 + End + Begin PushButton Example1 + AutoDeactivate = True + Bold = "" + ButtonStyle = 0 + Cancel = "" + Caption = "DEMO1" + Default = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 20 + LockBottom = "" + LockedInPosition= False + LockLeft = True + LockRight = False + LockTop = True + Scope = 0 + TabIndex = 3 + TabPanelIndex = 0 + TabStop = True + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 60 + Underline = "" + Visible = True + Width = 80 + End + Begin Label StaticText1 + AutoDeactivate = True + Bold = "" + DataField = "" + DataSource = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 112 + LockBottom = "" + LockedInPosition= False + LockLeft = "" + LockRight = "" + LockTop = "" + Multiline = False + Scope = 0 + Selectable = False + TabIndex = 4 + TabPanelIndex = 0 + Text = "Generate Letter Page and insert EditField text in it." + TextAlign = 0 + TextColor = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 60 + Transparent = False + Underline = "" + Visible = True + Width = 328 + End + Begin Label StaticText2 + AutoDeactivate = True + Bold = "" + DataField = "" + DataSource = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 112 + LockBottom = "" + LockedInPosition= False + LockLeft = "" + LockRight = "" + LockTop = "" + Multiline = False + Scope = 0 + Selectable = False + TabIndex = 5 + TabPanelIndex = 0 + Text = "Insert a Header and Footer with a page count." + TextAlign = 0 + TextColor = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 94 + Transparent = False + Underline = "" + Visible = True + Width = 309 + End + Begin Label StaticText3 + AutoDeactivate = True + Bold = "" + DataField = "" + DataSource = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 112 + LockBottom = "" + LockedInPosition= False + LockLeft = "" + LockRight = "" + LockTop = "" + Multiline = False + Scope = 0 + Selectable = False + TabIndex = 6 + TabPanelIndex = 0 + Text = "Simple Table" + TextAlign = 0 + TextColor = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 128 + Transparent = False + Underline = "" + Visible = True + Width = 309 + End + Begin PushButton Example4 + AutoDeactivate = True + Bold = "" + ButtonStyle = 0 + Cancel = "" + Caption = "DEMO4" + Default = False + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 20 + LockBottom = "" + LockedInPosition= False + LockLeft = True + LockRight = False + LockTop = True + Scope = 0 + TabIndex = 7 + TabPanelIndex = 0 + TabStop = True + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 162 + Underline = "" + Visible = True + Width = 80 + End + Begin Label StaticText4 + AutoDeactivate = True + Bold = "" + DataField = "" + DataSource = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 112 + LockBottom = "" + LockedInPosition= False + LockLeft = "" + LockRight = "" + LockTop = "" + Multiline = False + Scope = 0 + Selectable = False + TabIndex = 8 + TabPanelIndex = 0 + Text = "Multiple Columns" + TextAlign = 0 + TextColor = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 162 + Transparent = False + Underline = "" + Visible = True + Width = 309 + End + Begin GroupBox GroupBox1 + AutoDeactivate = True + Bold = "" + Caption = "Untitled" + Enabled = True + Height = 100 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = -315 + LockBottom = "" + LockedInPosition= False + LockLeft = "" + LockRight = "" + LockTop = "" + Scope = 0 + TabIndex = 9 + TabPanelIndex = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 255 + Underline = "" + Visible = True + Width = 100 + End + Begin PushButton Example5 + AutoDeactivate = True + Bold = "" + ButtonStyle = 0 + Cancel = "" + Caption = "DEMO5" + Default = False + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 20 + LockBottom = "" + LockedInPosition= False + LockLeft = True + LockRight = False + LockTop = True + Scope = 0 + TabIndex = 11 + TabPanelIndex = 0 + TabStop = True + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 196 + Underline = "" + Visible = True + Width = 80 + End + Begin Label StaticText5 + AutoDeactivate = True + Bold = False + DataField = "" + DataSource = "" + Enabled = True + Height = 22 + HelpTag = "" + Index = -2147483648 + InitialParent = "" + Italic = "" + Left = 112 + LockBottom = "" + LockedInPosition= False + LockLeft = "" + LockRight = "" + LockTop = "" + Multiline = False + Scope = 0 + Selectable = False + TabIndex = 12 + TabPanelIndex = 0 + Text = "JPG Inclusion and Hyperlink" + TextAlign = 0 + TextColor = 0 + TextFont = "System" + TextSize = 0 + TextUnit = 0 + Top = 196 + Transparent = False + Underline = "" + Visible = True + Width = 267 + End +End +#tag EndWindow + +#tag WindowCode +#tag EndWindowCode + +#tag Events Example3 + #tag Event + Sub Action() + dim pdf as fpdf + dim j,i as integer + + me.Enabled = False + + pdf = new FPDF("P") + pdf.AddPage() + + pdf.SetFont("Courier","",8) + + //Cabecera + for i = 1 to 4 + pdf.Cell(40,7,"Cabecera " + str(i),1) + next i + + pdf.Ln() + + //Datos + for j = 1 to 10 + + for i = 1 to 4 + pdf.cell(40,6,"Item " + str(i),1) + next i + + pdf.ln() + + next j + + pdf.Output(me.Name + ".pdf") + + me.Enabled = true + + End Sub + #tag EndEvent +#tag EndEvents +#tag Events Example2 + #tag Event + Sub Action() + dim pdf as Example2 + dim j,i as integer + + me.Enabled = False + + pdf = new Example2("P" ) + + pdf.AliasNbPages() + pdf.AddPage() + pdf.SetFont("Times","",12) + + for i = 1 to 40 + pdf.cell(0,10,"Imprimiendo linea numero " + str(i),0,1) + next i + + pdf.Output(me.Name + ".pdf") + + me.Enabled = true + + End Sub + #tag EndEvent +#tag EndEvents +#tag Events Example1 + #tag Event + Sub Action() + dim pdf as fpdf + dim j,i as integer + + me.Enabled = False + + if EditField1.Text = "" then + MsgBox "You must write some text" + EditField1.SetFocus + return + end if + + pdf = new FPDF("P","mm","letter") + pdf.AddPage() + pdf.SetFont("Arial","B",16) + pdf.Cell(40,10,EditField1.Text) + pdf.Output(me.Name + ".pdf") + + me.Enabled = true + + End Sub + #tag EndEvent +#tag EndEvents +#tag Events Example4 + #tag Event + Sub Action() + dim pdf as Example4 + + me.Enabled = False + + pdf = new Example4("P") + + pdf.SetTitle("20,000 Leagues Under The Sea") + pdf.SetAuthor("Jules Verne") + pdf.PrintChapter(1,"A Shifting Reef","20k_c1.txt") + pdf.PrintChapter(2,"Pro and Con","20k_c2.txt") + + pdf.Output(me.Name + ".pdf") + + me.Enabled = true + + End Sub + #tag EndEvent +#tag EndEvents +#tag Events Example5 + #tag Event + Sub Action() + dim pdf as fpdf + dim link as string + + me.Enabled = False + + pdf = new fpdf("P") + pdf.SetEnconding(Encodings.WindowsLatin1) + + //Primera página + pdf.AddPage() + pdf.SetFont("Arial","",20) + pdf.Write(5,"Para saber qué hay de nuevo en este tutorial, pulse ") + pdf.SetFont("","U") + + link = pdf.AddLink() + pdf.Write(5,"aqui",link) + pdf.SetFont("") + + //Segunda página + pdf.AddPage() + pdf.SetLink(link) + + // pass the absolute shell path as a string to image method + Dim chartpath As String + chartpath = GetFolderItem("").Child("demoinfo").Child("pie_chart.jpg").ShellPath + pdf.Image(chartpath,10,10,150,0,"","https://github.com/roblthegreat/rsfpdf") + + pdf.Output(me.Name + ".pdf") + + me.Enabled = true + + End Sub + #tag EndEvent +#tag EndEvents diff --git a/fpdf.rbbas b/fpdf.rbbas index 47b8de6..1581e44 100644 --- a/fpdf.rbbas +++ b/fpdf.rbbas @@ -1 +1,2971 @@ -#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.31" #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 +#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.31" + #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 diff --git a/rsfpdf.rbvcp b/rsfpdf.rbvcp index 4435f26..0c54cad 100644 --- a/rsfpdf.rbvcp +++ b/rsfpdf.rbvcp @@ -1 +1,42 @@ -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 BuildSteps=Build Automation;Build Automation.rbbas;&h5759A003;&h0;false Class=fpdf;fpdf.rbbas;&h1F0567FF;&h0;false Module=zlib;zlib.rbo;&h77DD4121;&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 +BuildSteps=Build Automation;Build Automation.rbbas;&h5759A003;&h0;false +Class=fpdf;fpdf.rbbas;&h1F0567FF;&h0;false +Module=zlib;zlib.rbo;&h77DD4121;&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