none
Problema creazione file PDF con dati letti da database RRS feed

  • Domanda

  • Ciao a  tutti,

    vs2013 - sql2014

    devo creare una stampa PDF ed ho seguito il seguente link:

    http://zannino1973.wordpress.com/2011/08/18/generare-un-pdf-in-asp-net-con-itextsharp/?blogsub=pending#blog_subscription-2

    tutto ok funziona.

    Ho provato poi ad adattare il sorgente come serviva a me, con una mia tabella etcc.... ma non funziona è come se dovessi, forse parlo con poca esperienza, ricompilare la pdfAndAspnet.dll

    come faccio a ricompilare una .dll dopo aver cambiato il seguente file .cs?:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.SqlClient;
    using System.Data;
    using System.Configuration;
    
    namespace pdfAndAspnet.DBLogic
    {
        /* ----------------------------------------- */
        /* Classe places che mappa la tabella del DB */
        /* ----------------------------------------- */
    
        public class places
        {
            public int id { get; set; }
            public string nome { get; set; }
            public int copie { get; set; }
            public int arrivo { get; set; }
            public string riferimento { get; set; }
            public int mancecc { get; set; }
    
    
            // Costruttore vuoto
            public places() { }
    
    
            // Costruttore parametrizzato
            public places(int _id, string _nome, int _copie, int _arrivo, string _riferimento, int _mancecc)
            {
                this.id = _id;
                this.nome = _nome;
                this.copie = _copie;
                this.arrivo = _arrivo;
                this.riferimento = _riferimento;
                this.mancecc = _mancecc;
            }
        }
    
        /* ----------------------------------- */
        /* Classe per l'interfacciamento al DB */
        /* ----------------------------------- */
    
        public class DBPlacesLogic
        {
    
            string connString = string.Empty;
            SqlConnection conn = new SqlConnection();
    
    
            //Recupera tutti i records dal database e restituisce una lista di oggetti palces   
            //che verrà usata per popolare il DataGrid nella pagina principale ( Default.aspx ) 
            public List<places> GetAllPlaces()
            {
                List<places> tempPlaces = new List<places>();
    
                InitDBLogic();
                string sqlQueryString = "SELECT * FROM test";
                SqlCommand sqlCmd = new SqlCommand(sqlQueryString, conn);
                sqlCmd.CommandType = CommandType.Text;
                SqlDataReader sqlReader = sqlCmd.ExecuteReader();
    
                while (sqlReader.Read())
                {
                    places result = new places();
                    result.id = (int)sqlReader["id"];
                    result.nome = (string)sqlReader["nome"];
                    result.copie = (int)sqlReader["copie"];
                    result.arrivo = (int)sqlReader["arrivo"];
                    result.riferimento = (string)sqlReader["riferimento"];
                    result.mancecc = (int)sqlReader["mancecc"];
                    tempPlaces.Add(result);
                }
                sqlReader.Close();
                conn.Close();
                return tempPlaces;
            }
    
            // Dato uno specifico id recupera  il record dal database e restituisce un oggetto places 
            public places GetPlaceByID(int id)
            {
                InitDBLogic();
                //string sqlQueryString = "SELECT * FROM places WHERE id='" + id.ToString() + "'";
                string sqlQueryString = "SELECT * FROM test";
                SqlCommand sqlCmd = new SqlCommand(sqlQueryString, conn);
                sqlCmd.CommandType = CommandType.Text;
                SqlDataReader sqlReader = sqlCmd.ExecuteReader();
                places result = new places();
                while (sqlReader.Read())
                {
                    result.id = (int)sqlReader["id"];
                    result.nome = (string)sqlReader["nome"];
                    result.copie = (int)sqlReader["copie"];
                    result.arrivo = (int)sqlReader["arrivo"];
                    result.riferimento = (string)sqlReader["riferimento"];
                    result.mancecc = (int)sqlReader["mancecc"];
    
                }
                sqlReader.Close();
                conn.Close();
                return result;
            }
    
            // Recupera la ConnectionString dal web.config e inizializza la connessione al database
            private void InitDBLogic()
            {
                connString = ConfigurationManager.ConnectionStrings["constr"].ToString();
                conn.ConnectionString = connString;
                conn.Open();
            }
    
        }
    }

    quando vado a richiamarla non eredita i campi che ho definito sopra cioè queryResult."nomemiocampo" non me lo propone, mi propone sempre i nomi dei campi vecchi cioè dell'esempio iniziale del progetto e

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;
    using System.IO;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    using pdfAndAspnet.DBLogic;
    
    namespace pdfAndAspnet
    {
        public partial class GeneraPdf : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
                // Istanza dell'oggetto DBPlacesLogic per il recupero dei dati dal database
                DBPlacesLogic dbLogic = new DBPlacesLogic();
                
                // Recuperiamo i dati dal db andando a caricare nell'oggetto queryResult i dati
                // del record con id uguale al parametro id nella query string
                places queryResult = dbLogic.GetPlaceByID(Convert.ToInt32(Request.QueryString["id"]));
    
                string id = queryResult.id.ToString();
                string autore = queryResult.nome;
                string titolo = queryResult.titolo;
                string descrizione = queryResult.descrizione;
                string link = queryResult.link;
    
                // Creiamo il documento PDF istanziando l'oggetto Document messo a disposzione
                // dalla libreria iTextSharp
                var document = new Document(PageSize.A4, 100, 100, 25, 25);
    
                // Creiamo un oggetto MemoryStream che conterrà in memoria il file pdf che andremo
                // via via creando con i passi successivi
                var output = new MemoryStream();
                var writer = PdfWriter.GetInstance(document, output);
    
                // Aprimao il docmento 
                document.Open();
    
                // Creiamo i vari fonts che utilizzeremo nel nostro pdf 
                //( per maggiori dettagli: http://www.mikesdotnetting.com/Article/81/iTextSharp-Working-with-Fonts )
                var titleFont = FontFactory.GetFont("Arial", 20, Font.BOLD);
                var subTitleFont = FontFactory.GetFont("Arial", 14, Font.BOLD);
                var boldTableFont = FontFactory.GetFont("Arial", 12, Font.BOLD);
                var endingMessageFont = FontFactory.GetFont("Arial", 10, Font.ITALIC);
                var bodyFont = FontFactory.GetFont("Arial", 12, Font.NORMAL);
    
                // Aggiungiamo un paragrafo per la visualizzazione del titolo
                document.Add(new Paragraph("World Places", titleFont));
                // Aggiungiamo un ulteriroe paragafro per il sottotitolo
                document.Add(new Paragraph("Foto e Info dei più belli monumenti del Mondo", bodyFont));
                // Aggiungiamo una linea vuota e andiamo a capo
                document.Add(Chunk.NEWLINE);
    
                // Aggiungiamo un paragrafo che contiene il titolo della risorsa
                string strInfo = "Informazioni riassuntive su : " + titolo;
                document.Add(new Paragraph(strInfo, subTitleFont));
    
                // Creiamo una tabella per visualizzare le informazioni recuperate dal database  
                //( Per maggiori info su come creare una tabela con iTextSharp : http://www.mikesdotnetting.com/Article/86/iTextSharp-Introducing-Tables )
                var infoTable = new PdfPTable(2);
                infoTable.HorizontalAlignment = 0;
                infoTable.SpacingBefore = 10;
                infoTable.SpacingAfter = 10;
                infoTable.DefaultCell.Border = 0;
    
                infoTable.SetWidths(new int[] { 2, 4 });
                infoTable.AddCell(new Phrase("Id:", boldTableFont));
                infoTable.AddCell(id);
                infoTable.AddCell(new Phrase("Autore:", boldTableFont));
                infoTable.AddCell(autore);
                infoTable.AddCell(new Phrase("Descrizione:", boldTableFont));
                infoTable.AddCell(descrizione);
                infoTable.AddCell(new Phrase("Link:", boldTableFont));
                infoTable.AddCell(link);
                document.Add(infoTable);
    
                // Creiamo un ogetto immagine iTextSharp
                var logo = iTextSharp.text.Image.GetInstance(System.Web.HttpContext.Current.Server.MapPath(link));
                // Definiamo le propietà dell'immagine
                logo.ScaleToFit(150f, 150f);
                logo.Alignment = iTextSharp.text.Image.ALIGN_LEFT;
                logo.IndentationLeft = 9f;
                logo.SpacingAfter = 9f;
                logo.Border = Rectangle.BOX;
                logo.BorderColor = Color.BLACK;
                logo.BorderWidth = 5f;
                document.Add(logo);
    
                // Aggiungiamo due linee vuote
                document.Add(Chunk.NEWLINE);
                document.Add(Chunk.NEWLINE);
    
                // Aggiungiamo un paragrafo per il messaggio di chiusura
                var endingMessage = new Paragraph("Questo PDF è stato generato grazie all'utilizzo della libreria iTextSharp", endingMessageFont);
                endingMessage.SetAlignment("Center");
                document.Add(endingMessage);
    
                // Chiudiamo il documento PDF
                document.Close();
    
                // Settiamo l'http header in modo che la risposta del server sia del tipo pdf
                // ( passaggio fondamentale )
                Response.ContentType = "application/pdf";
                // Ed infine mandiamo in output il nostro stream che contiene appunto i dati del nostro pdf
                Response.BinaryWrite(output.GetBuffer());
            }
        }
    }

    spero di essermi spiegato e che qualcuno mi possa aiutare.

    Buon lavoro


    Emanuele


    martedì 22 luglio 2014 14:12

Risposte

Tutte le risposte

  • Ma il file .CS che hai modificato è inserito all'interno del progetto?

    Marco Minerva - MVP Visual C#
    Blog: http://marcominerva.wordpress.com
    Twitter: @marcominerva

    venerdì 25 luglio 2014 15:56
    Moderatore
  • Ciao Emanuele,
    scusa Marco che mi intrometto nella discussione.

    Io ho modificato il file DBPlacesLogic.cs apportando le tue modifiche e
    l'intellisense risponde correttamente alle nuove property (i nuovi queryResult."nomemiocampo").

    Vai col mouse sul nome del progetto, click destro e seleziona "Build".

    Non devi ricompilare la dll, anche perchè la dll contiene la libreria iTextSharp,
    tu stai modificando la tua classe DBPlacesLogic contenuta nella cartella DBLogic.

    Ciao

    Paolo P.

    sabato 26 luglio 2014 13:19
  • Si, ho risolto ricompilando la .dll grazie lo stesso

    Emanuele

    • Contrassegnato come risposta EmanueleVbSql sabato 26 luglio 2014 13:42
    sabato 26 luglio 2014 13:41