Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/01/2005, 07:54
Avatar de lexus
lexus
 
Fecha de Ingreso: enero-2002
Ubicación: Cali - Colombia
Mensajes: 2.234
Antigüedad: 23 años, 3 meses
Puntos: 4
Código:
  Class TextArea
	 Public default Property Get ClassName() 'As FontStyles
	  ClassName = "TextArea"
	 End Property
	 Private m_Texts 'As Scripting.Dictionary ' texts To be word wrapped
	 Private m_LineQ 'As Scripting.Dictionary ' word wrapped lines
	 Private m_StartV 'As Integer
	 Private m_widthPDFUnits 'As Integer
	 Public HeightInPDFunits 'As Integer
	 Public StartPDFH 'As Integer
	 Private Sub Class_Initialize()
	  Set m_Texts = CreateObject("Scripting.Dictionary")
	  StartPDFH = 72
	 End Sub
	 Sub CalculateHeight(ByVal width)
	  Dim myText 'As TextObject
	  Dim FontRef 'As String
	  Dim key 'As String
	  Dim sFontRef 'As String
	  Dim found 'As Boolean
	  Dim FontSize 'As Integer
	  Dim sFontSize 'As Integer
	  Dim i 'As Integer
	  Dim lineNo 'As Integer
	  Dim linelen 'As Integer
	  Dim textLine 'As TextObject
	  Dim line 'As String' Text line
	  Dim tmpline 'As String
	  Dim vspace 'As Integer
	  Dim ret 'As String
	  Dim fonto 'As FontObj
	  if width < 1 Then
	  Err.Raise 100,"","Invalid width For TextArea"
	  End if
	  
	  m_widthPDFUnits = width
	  Set m_LineQ = CreateObject("Scripting.Dictionary")
	  ' Split the text up In lines
	  For Each myText In m_Texts
	  line = myText.Text
	  ' Escape PDF special characters ( and )
	  line = ReplaceText(ReplaceText(line, "(", "\("), ")", "\)")
	  line = Trim(line)
	  FontSize = myText.FontSize
	  linelen = myText.FontObj.HorizontalSpace * width / myText.FontSize
	  if Len(line) > linelen Then
	 'word wrap
	 Do While Len(line) > linelen
	 tmpline = Left(line, linelen)
	 For i = Len(tmpline) To Len(tmpline) / 2 Step -1
	  if InStr("*&^%$#,. ;<=>[])}!""", mid(tmpline, i, 1)) Then
	  ' find appropriate End of line
	  tmpline = Left(tmpline, i)
	  Exit For
	  End if
	 Next
	 line = mid(line, Len(tmpline) + 1)
	 Set textLine = New TextObject
	 With textLine
	  .Text = tmpline
	  Set .FontObj = myText.FontObj
	  .FontSize = myText.FontSize
	 End With
	 m_LineQ.Add textLine, ""
	 Loop
	 Set textLine = New TextObject
	 With textLine
	 .Text = line
	 Set .FontObj = myText.FontObj
	 .FontSize = myText.FontSize
	 End With
	 m_LineQ.Add textLine, ""
	  Else
	 Set textLine = New TextObject
	 With textLine
	 .Text = line
	 Set .FontObj = myText.FontObj
	 .FontSize = myText.FontSize
	 End With
	 m_LineQ.Add textLine, ""
	  End if
	  Next
	  HeightInPDFunits = 0
	  For Each myText In m_LineQ
	  FontSize = myText.FontSize
	  HeightInPDFunits = HeightInPDFunits + 1.2 * FontSize
	  Next
	 End Sub
	 function Draw(ByRef StartV, ByVal width, ByRef FontAlias, _
	  ByRef pagenum, ByVal TopStart) 'As PDFObject
	  
	  Dim PDFO 'As PDFObject
	  Dim myText 'As TextObject
	  Dim FontName 'As String
	  Dim TempPdfo 'As PDFObject
	  Dim FontRef 'As String
	  Dim key 'As String
	  Dim sFontRef 'As String
	  Dim found 'As Boolean
	  Dim FontSize 'As Integer
	  Dim sFontSize 'As Integer
	  Dim i 'As Integer
	  Dim lineNo 'As Integer
	  Dim linelen 'As Integer
	  Dim textLine 'As TextObject
	  Dim line 'As String' Text line
	  Dim tmpline 'As String
	  Dim vspace 'As Integer
	  Dim ret 'As String
	  Dim fonto 'As FontObj
	  Dim page 'As PageBreak
	  Dim save 'As String
	  Call CalculateHeight(width)
	  Set PDFO = New PDFObject
	  Set page = New PageBreak
	  ' Process fonts
	  For Each myText In m_Texts
	  ret = myText.Text
	  ' Set if we have this font
	  FontRef = getFontNumber(myText.Font, myText.FontStyle, FontAlias)
	  if FontRef = "" Then
	 'Add a new font
	 FontRef = Trim(CStr(FontAlias.count + 1))
	 Set fonto = New CFontObj
	 With fonto
	 .FontRef = FontRef
	 .Font = myText.Font
	 .FontStyle = myText.FontStyle
	 End With
	 FontAlias.Add FontRef, fonto
	  End if
	  myText.FontObj.FontRef = FontRef
	  found = False
	  For Each key In PDFO.m_fonts
	 if key = FontRef Then found = True
	  Next
	  if found = False Then
	 if Not PDFO.m_fonts.Exists(FontRef) Then
	 PDFO.m_fonts.Add FontRef, ""
	 End if
	  End if
	  Next
	  ' Print the lines To the PDF document
	  lineNo = -1
	  ret = " BT" + vbCr ' Begin text object
	  For Each myText In m_LineQ
	  line = myText.Text
	  FontName = myText.FontObj.FontName()
	  FontRef = myText.FontObj.FontRef
	  FontSize = myText.FontSize
	  vspace = 1.2 * FontSize
	  if (sFontRef <> FontRef) Or sFontSize <> FontSize Then
	 ret = ret + "/F" & FontRef & " " & FontSize & " Tf" & vbCr ' Text and font
	 ret = ret + "1 0 0 1 " & StartPDFH & " " & StartV & " Tm" & vbCr ' Set text matrix
	 ret = ret + CStr(vspace) & " TL" & vbCr ' Set text leading
	 'lineNo = lineNo + 1
	  End if
	  sFontRef = FontRef
	  sFontSize = FontSize
	  ret = ret + "T* (" & line & vbCrLf & ") Tj" & vbCr
	  StartV = StartV - vspace
	  if StartV < 100 Then
	 ' Print footer
	 page.StartPDFH = StartPDFH
	 ret = ret + "ET " + vbCrLf
	 Set TempPdfo = page.Draw(StartV, width, FontAlias, pagenum, TopStart)
	 ret = ret + TempPdfo.getStream()
	 PDFO.addStream (ret)
	 PDFO.PageBreak = True
	 ' Start new page
	 save = ret
	 ret = ""
	 ret = "BT " + vbCrLf
	 sFontRef = ""
	 StartV = TopStart
	  End if
	  Next
	  StartV = StartV - vspace
	  ret = ret + " ET" + vbCr
	  PDFO.addStream (ret)
	  Set Draw = PDFO
	 End function
	 function GetCopy()
	  Dim Text 'As TextArea
	  Dim tobj 'As TextObject
	  Set Text = New TextArea
	  For Each tobj In m_Texts
	  Text.AddText tobj.Text, tobj.Font, tobj.FontSize, tobj.FontStyle
	  Next
	  With Text
	  .StartPDFH = StartPDFH
	  End With
	  Set GetCopy = Text
	 End function
	 function getTexts() 'As Scripting.Dictionary
	  Set getTexts = m_Texts
	 End function
	 Public Sub AddText(ByVal Text, ByVal Font, ByVal FontSize, ByVal style)
	  if Font = "" Then Font = Fonts_Helvetica
	  if FontSize = "" Then FontSize = 10
	  if CStr(style) = "" Then style = FontStyles_Regular
	  
	  Dim myText 'As TextObject
	  Set myText = New TextObject
	  With myText
	  .Font = Font
	  .FontSize = FontSize
	  .Text = Text
	  .FontStyle = style
	  End With
	  m_Texts.Add myText, ""
	 End Sub
	  function toString() 'As String
	  Dim ret 'As String
	  ret = "TextArea: "
	  if m_Texts.count > 0 Then
	  ret = ret + GetDictionaryItem(m_Texts, 1).Text
	  End if
	  toString = ret
	 End function
	 function GetDictionaryItem(dic, ByVal iIndex)
	  Dim oItem, i
	  i = 0
	  For Each oItem In dic
	  i = i + 1
	  if i = iIndex Then
	 if IsObject(oItem) Then
	 Set GetDictionaryItem = oItem
	 Else
	 GetDictionaryItem = oItem
	 End if
	 Exit function
	  End if
	  Next
	 End function
	 Private function getFontNumber(ByVal Font, _
	 ByVal FontStyle, _
	 ByRef Fonts) 'As String
	 
	  Dim i 'As Integer
	  Dim key 'As String
	  Dim fName 'As String
	  Dim fonto 'As FontObj
	  For i = 1 To Fonts.count
	  key = Trim(CStr(i))
	  Set fonto = Fonts(key)
	  if fonto.Font = Font And fonto.FontStyle = FontStyle Then
	 'If Font.equals(fonto) Then
	 getFontNumber = fonto.FontRef
	  End if
	  Next
	 End function
	 Public function ReplaceText(ByRef Text_Renamed, ByRef TextToReplace, ByRef NewText) 'As String
	  Dim mtext 'As String
	  Dim SpacePos 'As Integer
	  mtext = Text_Renamed
	  SpacePos = InStr(mtext, TextToReplace)
	  Do While SpacePos
	  mtext = Left(mtext, SpacePos) & NewText & mid(mtext, SpacePos + Len(TextToReplace))
	  SpacePos = InStr(SpacePos + Len(NewText), mtext, TextToReplace)
	  Loop
	  ReplaceText = mtext
	 End function
	End Class
	'===================
__________________
Control de Visitantes, Control de Accesos, Minutas digitales, Manejo de Correspondencia
http://www.controldevisitantes.com