none
Justificacion a la hora de imprimir RRS feed

  • Pregunta

  • Hola señores, me he matado buscando una forma de hacer que un texto a la hora de imprimir me salga Justificado, No alineado a la izquierda ni a la derecha si no Justificado!!! pero no lo he conseguido, he buscado un sinnumero de recursos en la red pero no consigo una pista clara de como hacerlo ni por lo menos un algoritmo flujograma... pues como se darán cuenta soy muy muy nuevo en esto.. y aunque trabajo en visual basic 2013 y es fácil de aprender esta parte si me ha costado un dolor de cabezas.. si alguien me puede ayudar creanme que se ganaría un escalon al cielo
    sábado, 9 de mayo de 2015 15:02

Respuestas

  • bueno yo mismo hice esta pregunta y como nadie me dio una respuesta despue de 5 dias lo he logrado... y esperando que me sirva de respaldo por lo menos el algoritmo que esta dentro de esto para que se pueda aplicar en futuro a casos similares u objetos similares dejo aqui el codigo desarrollado para un objeto printdocuments
        Private Sub Documento_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles Documento.PrintPage
            Dim CUERPO As String = "palabra aqui va el texto que quiero colocar en la maldita sea pero epero que ahora con el conocimiento adquirido si me salgo esgtoy prbando para ver que tal me va con mas lineas porque si no no me esta saliedno del todo bien, AL FIN me ha salido esta huevada despues de tanto luchar al fin lo he conseguido, gracias al cielo dios gracias"
            Dim fuenteCuerpo As Font = New Font("Cambria", 14, FontStyle.Regular, StringUnit.Point)
            Dim palabras() As String
            palabras = CUERPO.Split(New Char() {" "}, StringSplitOptions.RemoveEmptyEntries)
            Dim contador, nlinea, total, npalabrasenlinea(0) As Integer
            Dim linea(0) As Double
            Dim palabra As Double = 0
            Dim totpalabra As String = ""
            contador = 0
            total = palabras.Length - 1
            nlinea = 0
            linea(nlinea) = 0
            npalabrasenlinea(nlinea) = 1
            While contador < total
                Dim tampalbras = e.Graphics.MeasureString(palabras(contador), fuenteCuerpo, 100000, StringFormat.GenericTypographic)
                palabra += tampalbras.Width
                totpalabra = totpalabra & palabras(contador) & " "
                Dim tampafrase = e.Graphics.MeasureString((totpalabra), fuenteCuerpo, 10000, StringFormat.GenericTypographic)
                linea(nlinea) = tampafrase.Width
                If linea(nlinea) > 500 Then
                    linea(nlinea) = palabra - tampalbras.Width
                    npalabrasenlinea(nlinea) -= 1
                    nlinea += 1
                    ReDim Preserve linea(nlinea)
                    ReDim Preserve npalabrasenlinea(nlinea)
                    linea(nlinea) = 0
                    npalabrasenlinea(nlinea) = 1
                    palabra = 0
                    totpalabra = ""
                Else
                    npalabrasenlinea(nlinea) += 1
                    contador += 1
                End If
    
            End While
            Dim posx, posx1, posx2, posy As Double
            posx = 50
            posy = 50
            Dim contador2 As Integer = 0
            For a = 0 To npalabrasenlinea.Length - 1
                If a = 0 Then
                    posx = 50
                    posy = 50
                    posx1 = (600 - linea(a)) / npalabrasenlinea(a)
                Else
                    posx = 50
                    posy = posy + 20
                    posx1 = (600 - linea(a)) / npalabrasenlinea(a)
                End If
    
                For b = 1 To npalabrasenlinea(a)
                    e.Graphics.DrawString(palabras(contador2), fuenteCuerpo, Brushes.Black, posx, posy)
                    Dim anchofrase = e.Graphics.MeasureString(palabras(contador2), fuenteCuerpo, 10000, StringFormat.GenericTypographic)
                    posx += anchofrase.Width + posx1
                    contador2 += 1
                Next
                Dim residuo As Double = 600 - posx + posx1
            Next
            e.Graphics.DrawLine(Pens.Black, New Point(600, 600), New Point(600, 50))
            e.Graphics.DrawLine(Pens.Black, New Point(50, 50), New Point(50, 600))
        End Sub
    


    jueves, 14 de mayo de 2015 21:10

Todas las respuestas

  • bueno yo mismo hice esta pregunta y como nadie me dio una respuesta despue de 5 dias lo he logrado... y esperando que me sirva de respaldo por lo menos el algoritmo que esta dentro de esto para que se pueda aplicar en futuro a casos similares u objetos similares dejo aqui el codigo desarrollado para un objeto printdocuments
        Private Sub Documento_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles Documento.PrintPage
            Dim CUERPO As String = "palabra aqui va el texto que quiero colocar en la maldita sea pero epero que ahora con el conocimiento adquirido si me salgo esgtoy prbando para ver que tal me va con mas lineas porque si no no me esta saliedno del todo bien, AL FIN me ha salido esta huevada despues de tanto luchar al fin lo he conseguido, gracias al cielo dios gracias"
            Dim fuenteCuerpo As Font = New Font("Cambria", 14, FontStyle.Regular, StringUnit.Point)
            Dim palabras() As String
            palabras = CUERPO.Split(New Char() {" "}, StringSplitOptions.RemoveEmptyEntries)
            Dim contador, nlinea, total, npalabrasenlinea(0) As Integer
            Dim linea(0) As Double
            Dim palabra As Double = 0
            Dim totpalabra As String = ""
            contador = 0
            total = palabras.Length - 1
            nlinea = 0
            linea(nlinea) = 0
            npalabrasenlinea(nlinea) = 1
            While contador < total
                Dim tampalbras = e.Graphics.MeasureString(palabras(contador), fuenteCuerpo, 100000, StringFormat.GenericTypographic)
                palabra += tampalbras.Width
                totpalabra = totpalabra & palabras(contador) & " "
                Dim tampafrase = e.Graphics.MeasureString((totpalabra), fuenteCuerpo, 10000, StringFormat.GenericTypographic)
                linea(nlinea) = tampafrase.Width
                If linea(nlinea) > 500 Then
                    linea(nlinea) = palabra - tampalbras.Width
                    npalabrasenlinea(nlinea) -= 1
                    nlinea += 1
                    ReDim Preserve linea(nlinea)
                    ReDim Preserve npalabrasenlinea(nlinea)
                    linea(nlinea) = 0
                    npalabrasenlinea(nlinea) = 1
                    palabra = 0
                    totpalabra = ""
                Else
                    npalabrasenlinea(nlinea) += 1
                    contador += 1
                End If
    
            End While
            Dim posx, posx1, posx2, posy As Double
            posx = 50
            posy = 50
            Dim contador2 As Integer = 0
            For a = 0 To npalabrasenlinea.Length - 1
                If a = 0 Then
                    posx = 50
                    posy = 50
                    posx1 = (600 - linea(a)) / npalabrasenlinea(a)
                Else
                    posx = 50
                    posy = posy + 20
                    posx1 = (600 - linea(a)) / npalabrasenlinea(a)
                End If
    
                For b = 1 To npalabrasenlinea(a)
                    e.Graphics.DrawString(palabras(contador2), fuenteCuerpo, Brushes.Black, posx, posy)
                    Dim anchofrase = e.Graphics.MeasureString(palabras(contador2), fuenteCuerpo, 10000, StringFormat.GenericTypographic)
                    posx += anchofrase.Width + posx1
                    contador2 += 1
                Next
                Dim residuo As Double = 600 - posx + posx1
            Next
            e.Graphics.DrawLine(Pens.Black, New Point(600, 600), New Point(600, 50))
            e.Graphics.DrawLine(Pens.Black, New Point(50, 50), New Point(50, 600))
        End Sub
    


    jueves, 14 de mayo de 2015 21:10
  • bueno aun tiene unas falllas, por ejemplo no entiendo porque si cambio el tamaño de letra cambia el efecto del cuadro.
    jueves, 14 de mayo de 2015 21:10
  • Dim palabras() As String
            palabras = CUERPO.Split(New Char() {" "}, StringSplitOptions.RemoveEmptyEntries)
            Dim contador, nlinea, total, npalabrasenlinea(0) As Integer
            Dim linea(0) As Double
            Dim palabra As Double = 0
            Dim totpalabra As String =
            contador = 0
            total = palabras.Length - 1
            nlinea = 0
            linea(nlinea) = 0
            npalabrasenlinea(nlinea) = 1
            While contador < total
                Dim tampalbras = e.Graphics.MeasureString(palabras(contador), fuenteCuerpo, 100000, StringFormat.GenericTypographic)
                palabra += tampalbras.Width
                If totpalabra = Nothing Then
                    totpalabra = palabras(contador) & " "
                Else
                    totpalabra = totpalabra & palabras(contador) & " "
                End If
                Dim tampafrase = e.Graphics.MeasureString(Trim(totpalabra), fuenteCuerpo, 10000, StringFormat.GenericTypographic)
                linea(nlinea) = tampafrase.Width
                If palabra > 450 Then
                    linea(nlinea) = palabra - tampalbras.Width
                    npalabrasenlinea(nlinea) -= 1
                    nlinea += 1
                    ReDim Preserve linea(nlinea)
                    ReDim Preserve npalabrasenlinea(nlinea)
                    linea(nlinea) = 0
                    npalabrasenlinea(nlinea) = 1
                    palabra = 0
                    totpalabra = Nothing
                Else
                    npalabrasenlinea(nlinea) += 1
                    contador += 1
                End If
    
            End While
            Dim posx, posx1, posx2, posy As Double
            posx = 50
            posy = 50
            Dim contador2 As Integer = 0
            For a = 0 To npalabrasenlinea.Length - 1
                If a = 0 Then
                    posx = 50
                    posy = 50
                    posx1 = (600 - linea(a)) / (npalabrasenlinea(a) - 1)
                Else
                    posx = 50
                    posy = posy + 20
                    posx1 = (600 - linea(a)) / (npalabrasenlinea(a) - 1)
                End If
    
                For b = 1 To npalabrasenlinea(a)
                    e.Graphics.DrawString(palabras(contador2), fuenteCuerpo, Brushes.Black, posx, posy)
                    Dim anchofrase = e.Graphics.MeasureString(palabras(contador2), fuenteCuerpo, 10000, StringFormat.GenericTypographic)
                    posx += anchofrase.Width + posx1
                    posx2 = anchofrase.Width
                    contador2 += 1
                Next
    
            Next

    jueves, 14 de mayo de 2015 22:16
  • este ultimo esta mejorado.. si alguien tiene mejor forma de hacerlo agradecere comente... obviamente usando las mismas herramientas.
    jueves, 14 de mayo de 2015 22:16
  • mejora: la ultima linea ya no causa problemas ni los espacios muy estrechos que se ven en la anterior.
        Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim cuerpo As String = "esta es la pureba que voy a hacer para que el texto se me alinie como yo quiero, me canse de preguntar en foros y no encontrar nada, asi que puso todo de mi parte para poder desarrollar algo de lo que conozco poco o nada espero que me funcione bien caso que si lo hago lo compartire para dar mi aportacion, lo que no creo que le haga mal a nadie porquesies."
            Dim palabras() As String = Split(cuerpo)
    
            Dim contador, nlineas As Integer
            Dim npalbrasenLinea() As Integer
            Dim palabra, frase As String
            Dim anchofrase() As Double
            Dim anchototal = e.Graphics.MeasureString(Trim(cuerpo), New Font("cambria", 12))
            Dim tamaño = e.Graphics.MeasureString(palabras(0), New Font("cambria", 12))
            contador = 0
            nlineas = 0
            palabra = ""
            frase = ""
            ReDim Preserve npalbrasenLinea(nlineas)
            ReDim Preserve anchofrase(nlineas)
            While contador < palabras.Length
                npalbrasenLinea(nlineas) += 1
                palabra &= palabras(contador)
                frase &= palabras(contador) & " "
                Dim anchoreal = e.Graphics.MeasureString(Trim(frase), New Font("cambria", 12), 10000, StringFormat.GenericTypographic)
                Dim ancholinea = e.Graphics.MeasureString(Trim(palabra), New Font("cambria", 12), 10000, StringFormat.GenericTypographic)
                Dim qpalabra = e.Graphics.MeasureString(palabras(contador), New Font("cambria", 12), 10000, StringFormat.GenericTypographic)
    
                If anchoreal.Width > 650 Then
                    anchofrase(nlineas) = ancholinea.Width - qpalabra.Width
                    npalbrasenLinea(nlineas) -= 1
                    nlineas += 1
                    anchototal -= anchoreal
                    ReDim Preserve npalbrasenLinea(nlineas)
                    ReDim Preserve anchofrase(nlineas)
                    npalbrasenLinea(nlineas) = 0
                    anchofrase(nlineas) = 0
                    frase = ""
                    palabra = ""
                    contador -= 1
                End If
                contador += 1
            End While
    
            Dim posx, espacio, posy As Double
            Dim formador As Integer = 0
            espacio = 0.0
            For a = 0 To npalbrasenLinea.Length - 2
                espacio = (650 - anchofrase(a)) / (npalbrasenLinea(a) - 1)
                If a = 0 Then
                    posx = 40
                    posy = 40
                Else
                    posx = 40
                    posy += tamaño.Height
                End If
                For b = 0 To npalbrasenLinea(a) - 1
                    If b = 0 Then
                        e.Graphics.DrawString(palabras(formador), New Font("cambria", 12), Brushes.Black, posx, posy)
                        formador += 1
                    Else
                        Dim ultpalabra = e.Graphics.MeasureString(palabras(formador - 1), New Font("cambria", 12), 10000, StringFormat.GenericTypographic)
                        posx += espacio
                        posx += ultpalabra.Width
                        e.Graphics.DrawString(palabras(formador), New Font("cambria", 12), Brushes.Black, posx, posy)
                        formador += 1
                    End If
                Next
            Next
    
            Dim FraseFinal As String = ""
            While formador < palabras.Length
                FraseFinal &= palabras(formador) & " "
                formador += 1
            End While
            e.Graphics.DrawString(FraseFinal, New Font("cambria", 12), Brushes.Black, 40, posy + tamaño.Height)
    
            e.Graphics.DrawLine(Pens.Black, New Point(690, 40), New Point(690, 500))
        End Sub


    martes, 2 de junio de 2015 22:38