Crear PDFs en ASP.NET
Autor: S3rGy0 | Archivado en: ASP, Recursos el día 6/Abr/2005
La vía “estandar” para crear documentos pdf en asp.net es mediante Crystal Reports, que yo, particularmente, odio hasta la muerte, ya que no he visto nada que falle tanto desde Windows ME. En este post quiero presentar una alternativa gratuita para crear pdfs sin necesidad de pegarse “cornás” con Crystal Reports.
Se trata de Report.NET, un proyecto donde se ha desarrollado una magnífica librería que contiene clases con las que podemos crear fácilmente un pdf desde el código servidor. Trae una ayuda con muchos ejemplos que hace que usarlo sea bastante sencillo. Otra característica resaltable es que permite la inserción de imágenes, opción que puede llegar a ser verdaderamente útil (doy fe de ello).
Aún no lo he investigado a fondo y hasta ahora sólo lo uso para pdfs relativamente sencillos donde no tengo que crear tablas ni realizar consultas muy complicadas, pero me está resultando especialmente útil para crear formularios simples (con simples me refiero a que sólo se obtienen datos de una única tabla y con clave única), ya que para los más complicados sigo usando Crystal Reports, aunque todo esto, por supuesto, depende del gusto de cada uno.
Por cierto, tiene licencia LGPL (creo que es la primera librería para .NET que he visto que no cueste dinero) y está escrita en C#.
S3rGy0.













Genial Sergyo!! Definitivamente, Crystal Reports es odioso, seguro que Simon opina como yo, verdad compi?
Si. CR con la falta de ayuda de depuración que tiene no es la aplicacion mas facil de usar.
Ya no es sólo que dé problemas a la hora de programar, sólo os diré que en mi curro nos tumbó un servidor web porque no le permitía al ISS liberar memoria. Nos tiramos casi 4 meses para averiguar que CR era lo que estaba jodiendo el servidor!! Imaginaos un servidor web que se cae cada 40 minutos, y eso que tiene 2Gb de memoria… :P
Hola Sergio he utilizado la dll y me ha funcionado de maravilla, pero empece a trabajar con imagenes y nada, no me reconoce la imagen el stream siempre queda nulo..
No se si podrias explicarme un poco mas como se hace esto..
Gracias
Perdona que haya tardado en contestar, pero estoy hasta arriba de trabajo.
Si puedes mandarme el código a mi correo intentaré ayudarte, pero cuando usé la DLL para insertar imágenes me guie por el fichero de ayuda que viene con la misma.
Saludos.
Hola sergio, tengo el mismo problema que se le presenta a Jose Luis, he probado todos los ejemplos, pero cuando intento cargar una imagen el error se presenta es una referencia null al objeto stream donde se deberia cargar la imagen, System.IO.Stream stream = GetType().Assembly.GetManifestResourceStream(”Equipo.jpg”); así estoy cargando la imagen, pero creo que el error es que estoy asumiendo que “Equipo.jsp” es la ruta relativa al archivo imagen que estoy intentando abrir, pero el metodo “GetManifestResourceStream” carga un recurso y la verdad no se como montar ese recurso con el archivo de imagen que quiero mostrar, porfa me puedes ayudar es urgente!, te agradesco lo que puedas hacer
Lo que pasa es que el ejemplo que ves en la su web es un poco confuso ya que lo que hacen es cargar la imagen de una dll. En esta dll se encuentran encriptadas las imagenes y la cargan en un Stream. Si buscas GetManifestResourceStream en el MSDN obtendrás esto:
“Loads the specified manifest resource from this assembly.”
Es decir, carga un recurso determinado de un Assembly.
Lo que tú quieres hacer, por lo que me dices, es cargar desde un fichero, así que lo único que tienes que hacer es:
Dim strm As IO.Stream = IO.File.Open(”RUTA IMAGEN”, IO.FileMode.Open)
Simplemente cargas la imagen en un stream y una vez que lo tengas sólo tienes que insertarlo en el PDF.
Espero haberte ayudado.
Saludos.
Hola sergio, probe tu ejemplo y perfecto ya funciona, pero tambien encontre la manera de crear un recurso incrustado, es lo que tu dices hacer que elementos como una imagen se monten en una dll, en este caso lo monte en la dll que se genera con el proyecto donde estoy probando el pdf; la forma de hacerlo es primero dentro del proyecto crear o vincular la imagen, despues le das click derecho propiedades, y buscas la propiedad accion de generacion, cambias esa propiedad a Recurso Incrustado y listo, para llamar ese recurso incrustado lo haces con el nombre del proyecto y la dll que son el mismo y el nombre de la imagen separados por un “.”, en fin la linea que carga la imagen quedaría así :
System.IO.Stream stream = GetType().Assembly.GetManifestResourceStream(”reporteweb.Equipo.jpg”); lo interesante de los recursos incrustados es que los procesos se hacen mas livianos y mejoran el rendimiento.. Bueno sergio muchas gracias por tu colaboración, y espero que con esto aporte algo a tu conocimiento.
Hola sergio probe tu recomendación y funciona bien, tambien encontré la forma de crear un recurso incrustado con una imagen, te voy a pasar el dato por si te interesa, para crear un recurso incrustado debes tener la imagen dentro de tu proyecto, luego desde la ventana Explorador de soluciones le das click derecho propiedades, buscas la propiedad Acción de Generación; y cambiala a Recurso incrustado; con esto haces que la imagen se cargue al dll que se genera con el proyecto y tienes tu recurso incrustado. Para utilizarlo lo llamas con el nombre de la dll y el nombre del recurso asi : nombre_recurso.nombre_imagen.jpg (”reporteweb.Equipo.jpg”); y para que lo puedas cargar en el archivo lo haces como en el ejemplo System.IO.Stream stream = GetType().Assembly.GetManifestResourceStream(”reporteweb.Equipo.jpg”); esto de los recursos incrustados hace los procesos mas rapidos y consume menos recursos; bueno gracias por la colaboración y espero poder aportar algo con esto…
Pues si que parece interesante, sobre todo por el aumento de eficiencia. La próxima vez que tenga que incrustar imagenes en un PDF lo voy a probar.
Te agradezco tu aportación.
Saludos.
Encuentro muy bueno tu aporte con esta libreria, pero cuando la quiero eliminar me acusa error que no se puede eliminar porque otro proceso la esta utilizando, como se puede solucionar esto
lo siento, pero cuando digo la quiero eliminar, me refiero al archivo pdf que se genera.
amigos, este es el ejemplo que realice y ahora puedo borrar los archivos temporales que me genera:
Dim report As New Report(New PdfFormatter())
Dim fd As New FontDef(report, “Helvetica”)
Dim fp As New FontPropMM(fd, 8, System.Drawing.Color.Blue)
Dim page As New Page(report)
page.AddCB_MM(80, New RepString(fp, “4 PRUEBA DE PDFS”))
Response.ClearContent()
Response.ClearHeaders()
Response.ContentType = “application/pdf”
‘If System.IO.File.Exists(”C:\TEMP\Actas” & Session.SessionID & “.pdf”) Then System.IO.File.Delete(”C:\TEMP\Actas” & Session.SessionID & “.pdf”)
‘RT.ViewPDF(report, “C:\TEMP\Actas” & Session(”usr”) & “.pdf”)
‘RT.ResponsePDF(report, Me)
‘grabando el archivo y luego leyendo con response me libera el archivo una vez cerrada la pagina
report.Save(”C:\TEMP\Actas2″ & Session(”usr”) & “.pdf”)
Response.WriteFile(”C:\TEMP\Actas2″ & Session(”usr”) & “.pdf”)
Response.Flush()
Response.Close()
report = Nothing
chaoooo
Estimado Jare, nuestro experto en ASP.NET (S3rGyO) está ahora mismo de vacaciones. En cuanto vuelva, estoy seguro de que responderá gustosamente a tu pregunta.
Un saludo.
hey en donde puedo encontrar documentacion sobre el uso de esta libreria, si alguien me puede ayudar se los agradeceria mucho.
Pues en la misma web oficial puedes encontrarlo. En la sección files, además de estar la DLL, se encuentra un fichero .chm que es de ayuda.
Saludos.
ya he bajado supuestamente la ayuda y he estado modificando los ejemplos pero aun no he podido correr el que han puesto para conexion a base de datos si alguien tiene ejemplos sobre este tema les agradeceria mucho. Mi mail es vic_kry19@hotmail.com
alguien sabe como puedo obtener los datos de un form de una pagina para generar el reporte de acuerdo a los datos que se requieran? he intentado con ajustar los ejemplos para este fin pero al momento de cachar los valores me marca un error en la instruccion request la cual incluyo dentro de la clase que genera el pdf
public class HelloWorld : Report {
protected override void Create() {
NameValueCollection myCollection = Request.QueryString;
string selectedItem = myCollection.Get(”ID”);
FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica);
FontProp fp = new FontPropMM(fd, 20);
new Root.Reports.Page(this);
page_Cur.AddCB_MM(80, new RepString(fp, selectedItem));
fp.rSizeMM = 7;
page_Cur.AddCB_MM(120, new RepString(fp, DateTime.Now.ToString(”g”)));
}
}
void Page_Load() {
RT.ResponsePDF(new HelloWorld(), this);
}
Hola, los codigos que todos usan me da este error: Que puede ser???
Se denegó el acceso a la clave de Registro HKEY_CLASSES_ROOT\AcroExch.Document\shell\Open\command.
O sino me da error cuando esta ejecutando el archivo ieHelp.dll
Donde consigo la librería de Report.net
Lo tienes en el post: http://report.sourceforge.net/
Salu2.
Tengo un problema con la ayuda. Me la descargo, la ejecuto, pero en todas las páginas me aparece el error de “No se puede mostrar la página”.
¿Sabeis porque puede ser?
Saludos y muchas gracias
Javi
Alguien sabe como crear documentos PDF en ASP (no ASP.NET),
o donde se puede encontrar información?
He visto algunos productos, casi todos de pago que tambien son instalables.
Desearía hacer algun sistema que no necesitara de instalación de ningun software.
Muchas gracias a todos.
me gustaria poder generar PDF a partir de una pagina ASP en mi web. Alguien sabe como hacerlo en ASP (NO ASP.NET). Muchas gracias.
Hola a todos, acabo de encontrar este site. Y por lo que contais creo que esa libreria me vendria como anillo al dedo.
Pero no me la puedo descargar, se ve que en SourceForge estan de obras. Solo puedo descargar los ficheros de ayuda, el .DLL no aparece. Alguno podria enviarme, colgar o decirme otro sitio de donde bajarla. Gracias
Hola chicos, ya tengo el codigo descargado, al final lo encontre.
Ahora tengo una nueva duda, ¿alguien ha conseguido hacer que funcione lo de crear tablas en un PDF? Mi aplicacion es ASP.NET y quiero crear un report con una tabla, que contenga el resultado de una busqueda en una Base de Datos(BD). Pero me surgen dos problemas.
Primero si solo quiero mostrar la tabla con datos estaticos, no lo consigo. Eso de llamar al evento para que pinte le tabla no va bien. ¿No hay ninguna forma de pintar la tabla sin llamar a ese evento?
Y lo segundo, cuando voy a crear la tabla y estoy creando las filas (tlm.NewRow()) da error en la reserva. Directamente falla.
Bueno esas son mis dudas saludos.
Hola alguien me puede ayudar es que necesito abrir una imagen en mi reporte de crystal report pero no se como si alquien me puede ayudar se los agradeceria.lo que tengo es una imagen en el disco duro y trato de abrirla con Dim strm As IO.Stream = IO.File.Open(”FONDO.jpg”, IO.FileMode.Open)
pero manda que no encuentra el archivo y ya no se que hacer.gracias
Alguien sabe como pasar un archivo word a pdf con ASP.NET
Grácias
como puedo crear un pdf a partir de un Recorset en asp.net ?????
Alguien me puede decir de donde puedo bajar la librearia y los ejemplos para generar el PDF desde .NET
quiero ocupar esta dll para accesar a datos en oracle alguien tiene algun ejemplo?
Hola, yo logré generar un PDF en C# de ASP.NET llenando tablas, con el report.net, mejor les paso el ejemplo completo, lo guardan y a correrlo
using Root.Reports;
using System;
using System.IO;
using System.Data.OleDb;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Text;
using System.Diagnostics;
namespace CrearPDFFREE
{
///
/// Summary description for icm5.
///
public class icm5 : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
string usuario = Request.QueryString["usuario"];
string partida = Request.QueryString["partida"];
string tipo = Request.QueryString["tipo"];
int gen_sigfe = int.Parse(Request.QueryString["gen_sigfe"]);
DateTime fi = DateTime.Parse(Request.QueryString["fi"]);
DateTime ft = DateTime.Parse(Request.QueryString["ft"]);
RT.ResponsePDF(new SimpleFrame(), Response);
RT.ResponsePDF(new SimpleFrame(), Response);
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
public class SimpleFrame : Report
{
private FontDef fd;
private Double rPosLeft = 20;
private Double rPosRight = 195;
private Double rPosTop = 24;
private Double rPosBottom = 278;
protected override void Create()
{
fd = new FontDef(this, “Arial”);
FontProp fp = new FontPropMM(fd, 1.9);
FontProp fp_Header = new FontPropMM(fd, 1.9);
fp_Header.bBold = true;
Stream stream = GetType().Assembly.GetManifestResourceStream(”ReportSamples.Phone.jpg”);
Random random = new Random(6);
TableLayoutManager tlm = new TableLayoutManager(fp_Header);
tlm.rContainerHeightMM = rPosBottom - rPosTop; // set height of table
tlm.headerCellDef.rAlignV = RepObj.rAlignCenter; // set vertical alignment of all header cells
tlm.cellDef.pp_LineBottom = new PenProp(this, 0.05, Color.LightGray);
tlm.eNewContainer += new TableLayoutManager.NewContainerEventHandler(Tlm_NewContainer);
TableLayoutManager.Column col;
col = new TableLayoutManager.ColumnMM(tlm, “ID”, 13);
col = new TableLayoutManager.ColumnMM(tlm, “Producto”, 100);
col.cellDef.textMode = TableLayoutManager.TextMode.MultiLine;
col = new TableLayoutManager.ColumnMM(tlm, “Cantidad Por Unidad”, 36);
col = new TableLayoutManager.ColumnMM(tlm, “Unidades en Stock”, 16);
col = new TableLayoutManager.ColumnMM(tlm, “Unidades a Ordenar”, 18);
String sConnectionString = @”Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=(local)”;
OleDbConnection oleDbConnection = new OleDbConnection(sConnectionString);
oleDbConnection.Open();
OleDbCommand odc = new OleDbCommand(”SELECT ProductID, ProductName, QuantityPerUnit, UnitsInStock, UnitsOnOrder FROM Products ORDER BY ProductID”, oleDbConnection);
OleDbDataReader oddr = odc.ExecuteReader();
while (oddr.Read())
{
tlm.NewRow();
tlm.Add(0, new RepInt32(fp, oddr.GetInt32(0)));
tlm.Add(1, new RepString(fp, oddr.GetString(1)));
tlm.Add(2, new RepString(fp, oddr.GetString(2)));
tlm.Add(3, new RepInt32(fp, oddr.GetInt16(3)));
tlm.Add(4, new RepInt32(fp, oddr.GetInt16(4)));
}
foreach (Root.Reports.Page page in enum_Page)
{
Double rY = rPosBottom + 1.5;
page.AddLT_MM(rPosLeft, rY, new RepString(fp, DateTime.Now.ToShortDateString() + ” ” + DateTime.Now.ToShortTimeString()));
page.AddRT_MM(rPosRight, rY, new RepString(fp, page.iPageNo.ToString() + ” / ” + iPageCount.ToString()));
}
}
private void Tlm_NewContainer(Object oSender, TableLayoutManager.NewContainerEventArgs ea)
{
new Root.Reports.Page(this);
// first page with heading
if (page_Cur.iPageNo == 1)
{
FontProp fp_Title = new FontPropMM(fd, 7);
fp_Title.bBold = true;
page_Cur.AddCT_MM(rPosLeft + (rPosRight - rPosLeft) / 2, rPosTop, new RepString(fp_Title, “Lista de Productos”));
ea.container.rHeightMM -= fp_Title.rLineFeedMM; // reduce height of table container for the first page
}
// the new container must be added to the current page
page_Cur.AddMM(rPosLeft, rPosBottom - ea.container.rHeightMM, ea.container);
}
}
}
No encuentro las dll en Report.net, si alguien me podria decir
Hola me podrias decir donde consigo las dll, puesto que en el Report.Net no las encuantro. mil gracias
Como puedo abrir una documento pdf con VBNet y las reports.dll, inscrir algo y déspues imprimir este documento.
Es un poco offtopic pero otra librería que NO cuesta dinero, escrita en C# y es castellano es SwfDotnet (www.swfdotnet.com) que permite crear películas SWF dinámicamente desde windowsforms o desde asp.net.
Muy buena, la recomiendo. En la web vienen varios ejemplos de código fuente.
Un saludo
Como puedo hacer funcionar la libreria?? Me he bajado la libreria version debug, eso es correcto? Una vez la tengo, que hago con ella para q el visual me la reconozca al compilar? Gracias.
Estoy probando la libreria con el ejemplo del Hola Mundo y me dice que la referencia a Page es ambigua. He puesto el using System.Web.UI; q es el espacio de nombres donde esta la clase Page. Ayuda please!
Estuve probando la librería con un reporte que tiene tablas y usando TableLayoutManager, la última página queda vacía.
Alguna idea? Gracias.
Buenas, muy buenos los comentarios y los ejemplos. Estuve mirando un poco esta dll pero no logró saber si tengo la posibilidad de convertir un archivo de excel a un pdf, si alguien encontró la forma por favor que la mande. Gracias
Me podrias ayudar estoy exportando crystal a pdf y me da el error:
Query Engine Error: ‘c:\kk\rptEmpleados.rpt’
Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.
Detalles de la excepción: CrystalDecisions.CrystalReports.Engine.DataSourceException: Query Engine Error: ‘c:\kk\rptEmpleados.rpt’
Error de código fuente:
Línea 156: ‘crReportDocument.Export()
Línea 157:
Línea 158: crReportDocument.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, Fname)
Línea 159:
Línea 160:
Te lo agradeceria mucho
gracias
Comment por Luciana — 6/4/2006 @ 8:22 pm
Luciana el problema esta en o siguiente,como el tablelayoutmaneger es unico por lo del contenedor hay que ubicarle un espacio using y listo:)
—————-fragmento del codigo—————-
Stream stream = GetType().Assembly.GetManifestResourceStream(”ReportSamples.Phone.jpg”);
Random random = new Random(6);
//—-debe quedar asi
using(TableLayoutManager tlm = new TableLayoutManager(fp_Header))
{//using
.
.
.
while (oddr.Read())
{
tlm.NewRow();
tlm.Add(0, new RepInt32(fp, oddr.GetInt32(0)));
tlm.Add(1, new RepString(fp, oddr.GetString(1)));
tlm.Add(2, new RepString(fp, oddr.GetString(2)));
tlm.Add(3, new RepInt32(fp, oddr.GetInt16(3)));
tlm.Add(4, new RepInt32(fp, oddr.GetInt16(4)));
}
}//using
Tengo que llenar 2 tablas dinamicamente, pero no se como darle la posicion a la segunda tabla, ya que por los datos de la primera quedan sobrepuestas aveces!
Help!
Hola!
He estado checando los comentarios que me dejan y ojala puedan ayudarme con el problema que tengo:
Necesito crear una tabla utilizando la libreria Report .Net con el codigo publicado se crea una tabla pero yo necesito que dentro de las columnas se inserte una imagen y que la tabla no tenga bordes o sean de color blanco.
Ojala alguien pueda ayudarme con esto. Gracias…
Que tal amigos, estuve probando el Report.net en asp y anda a las mil maravillas, pero quisiera saber si se puede usar en java(eclipse).
Saludos y gracias por todo
Hola amigos, yo otravez , alguien sabe como hacer para que la pagina del pdf se carge apaisada??? osea acostada???
Saludos y gracias
Tengo un problema, hay un ejemplo en la red que indica como incrustar una imagen a una .dll (http://support.microsoft.com/kb/910445/es), sigo los pasos como indica el ejemplo y genero la .DLL, pero a la hora de copiar la dll al proyecto me marca un error cuando lo corro:
Este es el código que uso:
protected void Page_Load(object sender, EventArgs e)
{
RT.ResponsePDF(new CreatePDF(), this);
}
public class CreatePDF : Report
{
protected override void Create()
{
FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica);
FontProp fp = new FontPropMM(fd, 3);
new Root.Reports.Page(this);
System.IO.Stream stream = GetType().Assembly.GetManifestResourceStream (”WebControlLibrary1.logo.jpg”);
page_Cur.AddMM(20, 90, new RepImageMM(stream, 40, Double.NaN)); //
Hola,
quiere generar un documento pdf desde una página aspx. El fichero cs tengo:
protected void Page_Load(object sender, EventArgs e)
{
RT.ResponsePDF(new CreatePDF(), this);
}
public class CreatePDF : Report
{
protected override void Create()
{
Report report = new Report(new PdfFormatter());
FontDef fd = new FontDef(report, FontDef.StandardFont.Helvetica);
FontProp fp = new FontPropMM(fd, 25);
Page page = new Page(report);
page.AddCB_MM(80, new RepString(fp, “Hello World!”));
}
}
Al ejecutar, me sale:
%PDF-1.4 1 0 obj > endobj 2 0 obj > endobj 3 0 obj > endobj 4 0 obj > endobj xref 0 5 0000000000 65535 f 0000000009 00000 n 0000000097 00000 n 0000000203 00000 n 0000000224 00000 n trailer > startxref 277 %%EOF
¿Qué es lo que me falta?
Gracias por vuestra ayuda.
Ana.
existirá algún tutorial step step para saber usarlo, ya que las clases y las funciones no dicen mucho con el nombre que tienen….y trate de correr los ejemplos que trae el zip..ninguno jala…ya referencie la dll, a mi proyecto, no me falta ningun namespace…
que estará ocurriendo?
no se pueden incrustar nuevas fonts :/
alguien a podido con eso?
Esto tambien lo puedo ocupar para winform…¿?
saludos..
Saludos.
Me encontre la herramienta de Report.dll y localmente en mi maquina funciona muy bien. Tengo Windows XP Profesional SP 2 Framework 3.5.
Mi problema es que a la hora de publicar el proyecto en una maquina con Windows 2003 Server SP 2 en Ingles Framework 3.5, me sale el siguiente error:
System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure “Root.Reports.RT.resources” was correctly embedded or linked into assembly “Reports” at compile time, or that all the satellite assemblies required are loadable and fully signed. at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) at System.Resources.ResourceManager.GetString(String name, CultureInfo culture) at System.Resources.ResourceManager.GetString(String name) at Root.Reports.RT.StartAcro(String sFileName, String sArguments, ProcessWindowStyle processWindowStyle) at Root.Reports.RT.ViewPDF(Report report, String sFileName) at com.sis.telecabletepa.caja.Ticket.PrintTicket() at Caja_Recibo.Page_Load(Object sender, EventArgs e)
Soy nueva en esto y la verdad ya he buscado en muchos foros y ninguno me ha ayudado a resolver mi problema.