sábado, 16 de julio de 2011

ASP.NET: Control para editar texto.

Unificando reportes en un único PDF - 1


Esta entrada estará dividida en varias partes.

La intención en esta aplicación web es reportar mediante un único informe en pdf diferentes gráficos, tablas de resultados y el análisis de los resultados, además de alguna documentación que desea incluir el cliente en tiempo de ejecución. Teniendo en cuenta que el presupuesto para el desarrollo es cero, por lo que no se han utilizado soluciones de pago que harían esto de una forma más sencilla.

Lamentablemente no enlazaré los múltiples sitios consultados pues en ninguno de ellos he encontrado toda la información que he necesitado y he perdido la cuenta de los que me han servido de algo.

Al final, como Frankenstein, esto está hecho a retales. Es posible que hayan formas más sencillas de hacerlo, esta simplemente ha sido la mía.


Se realiza un proyecto web con ASP.NET programando en vb.net y c# utilizando visual studio 2008 (Framework 3.5) y SQL Server 2005 para gestionar los datos.

Básicamente, al inicio los objetivos eran los siguientes:

- Utilizar una caja de texto en la que el usuario pueda insertar texto con formato, modificar la fuente, tamaño, alineación etc.
- Crear diferentes gráficos, tablas... 6 reportes en 1, sin pagar licencias de software especifico para esto, por lo que se ha utilizado report viewer y sub reports.
- Generar pdf de los reportes
- Generar pdf del texto introducido en tiempo de ejecución.
- Unificar los diferentes pdf en un único archivo.

Para cubrir el primer objetivo, hacemos servir CKeditor un potente editor de texto Open Source.

El funcionamiento es sencillo:
- Se descarga CKeditor desde aquí.
- Se agregan las referencias al proyecto. Podemos comprobar la .dll en el directorio /bin del proyecto.
- Colocamos en el diseño el código del componente. Configuramos las propiedades de éste según gustos, en este caso he modificado la Toolbar básica que viene por defecto ya que algunas funcionalidades del complemento no funcionaban correctamente.





<CKEditor:CKEditorControl ID="CKEditor1" UseBROnCarriageReturn="true" runat="server" Width="877px" Toolbar="Basic" EnableXHTML="true" ToolbarBasic="Bold|Italic|Underline|Strike|-|
JustifyLeft|JustifyCenter|JustifyRight|JustifyBlock|-||-||PageBreak|
Link|Unlink|Anchor
Styles|Format|Font|FontSize|-|TextColor|BGColor" Height="342px"></CKEditor:CKEditorControl>


Una vez tengo el editor de texto funcionando, creo un reporte mediante el control report viewer y trato de pasarle el texto de ckeditor con CKeditor.text por parámetros del reporte.
Pero no funciona correctamente pues me pasa el texto con formato HTML.
Revisando en la web como solucionarlo, veo que report viewer no permite decodificar el texto en HTML, por lo que recurro a iTextSharp para crear un primer reporte en pdf de este texto.

Desde la source forge, descargo iTextSharp.

- Añadimos la libreria al proyecto, agregando una vez más la referencia y comprobando que se encuentra en el directorio /bin.

Para su uso, en el código añadimos las diferentes implementaciones necesarias:


'imports para el uso de itextsharp
Imports iTextSharp
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.text.Image


Añadimos un procedimiento que nos convierta html a un archivo pdf.


Private Sub añadeTextoHTML()

Try

Dim Documento As New Document

Dim pagina As New Page

PdfWriter.GetInstance(Documento, New

'Indicamos una ruta y nombre del archivo

FileStream(Server.MapPath(".\Pdf\") + "Prueba-text.pdf", FileMode.Append))

Documento.Open() 'Abrimos el documento
Dim parrafo As New Paragraph
Documento.Add(parrafo) 'Agrega el parrafo al documento
parrafo.Clear()

Dim htmlText As String = CKEditor1.Text
Dim xx As iTextSharp.text.html.simpleparser.StyleSheet = Nothing
Dim htmlarraylist As New List(Of IElement)

htmlarraylist = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(New StringReader(htmlText), xx)

For k = 0 To htmlarraylist.Count - 1

Documento.Add(DirectCast(htmlarraylist(k), IElement))

Next

Documento.Close()

'System.Diagnostics.Process.Start(Server.MapPath(".\Pdf\") + "Prueba-text.pdf") 'Abre el archivo creado

Catch exx As Exception

lblError.Text = "<script>alert('Ha ocurrido un error al crear el documento de texto')</script>"

End Try

End Sub


Evidentemente, antes de pasar el texto del editor, realizaremos un filtrado del mismo, por lo que pudieran entrar los usuarios, mediante una función que nos retorne el texto filtrado.
Para ello he utilizado "replace" de todo lo que se ha considerado sospechoso conveniente.

Es interesante leer el post minimizando riesgos de pdf.

En la segunda parte trataré como hacer reports y subreports mediante un control report viewer y como unir los diferentes archivos generados en un único pdf.

Se agradecen vuestras críticas sugerencias.


Un saludo desde mi reino,

LeGNa

No hay comentarios: