Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,856

    Libreria iTextSharp non crea correttamente PDF

    ...o meglio lo fa ma poi il pdf risulta corrotto o comunque non risulta leggibile.... here's the code
    codice:
      Protected Function generapdf() As String
            Dim pathpdf As String = ""
            Dim dblDataOra As String = Replace(Now.ToOADate.ToString, ",", "")
    
            Dim nomefile As String = IDtestata.Value & "_" & dblDataOra
    
            Dim titleFont = iTextSharp.text.FontFactory.GetFont("Arial", 20, iTextSharp.text.Font.BOLD)
            Dim subTitleFont = iTextSharp.text.FontFactory.GetFont("Arial", 14, iTextSharp.text.Font.BOLD)
            Dim boldTableFont = iTextSharp.text.FontFactory.GetFont("Arial", 12, iTextSharp.text.Font.BOLD)
            Dim endingMessageFont = iTextSharp.text.FontFactory.GetFont("Arial", 10, iTextSharp.text.Font.ITALIC)
            Dim bodyFont = iTextSharp.text.FontFactory.GetFont("Arial", 12, iTextSharp.text.Font.NORMAL)
            Dim smallfont = iTextSharp.text.FontFactory.GetFont("Arial", 7, iTextSharp.text.Font.ITALIC)
    
            ' Creiamo il documento PDF istanziando l'oggetto Document messo a disposzione
            ' dalla libreria iTextSharp
            Dim Document = New iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 100, 100, 25, 25)
            'Creiamo un oggetto MemoryStream che conterrà in memoria il file pd che andremo
            'via via creando con i passi successivi
            Dim output = New MemoryStream()
            Dim writer = iTextSharp.text.pdf.PdfWriter.GetInstance(Document, output)
            ' Apriamo il documento
            Document.Open()
    
            Document.Add(New iTextSharp.text.Paragraph("cippalippa", subTitleFont))
    
    
            ' Creiamo un ogetto immagine iTextSharp
            Dim logopath As String = ConfigurationManager.AppSettings("rootpath") & "img\mac_warning.png"
            Dim logo = iTextSharp.text.Image.GetInstance(logopath)
            ' Definiamo le propietà dell'immagine
            logo.ScaleToFit(150.0F, 150.0F)
            logo.Alignment = iTextSharp.text.Image.ALIGN_LEFT
            logo.IndentationLeft = 9.0F
            logo.SpacingAfter = 9.0F
            logo.Border = iTextSharp.text.Rectangle.BOX
            'logo.BorderColor = Color.BLACK
            logo.BorderWidth = 5.0F
            Document.Add(logo)
    
            Dim infoTable = New iTextSharp.text.pdf.PdfPTable(3)
            infoTable.HorizontalAlignment = 0
            infoTable.SpacingBefore = 10
            infoTable.SpacingAfter = 10
            infoTable.DefaultCell.Border = 0
            Dim larghezze() As Integer
            larghezze = {3, 3, 3}
            infoTable.SetWidths(larghezze)
    
            'cella1
            infoTable.AddCell(logo)
            'cella2
            infoTable.AddCell(New iTextSharp.text.Phrase("contenuto cella2", smallfont))
            'cella3
            infoTable.AddCell(New iTextSharp.text.Phrase("contenuto cella3", smallfont))
            Document.Add(infoTable)
    
    
            'creo fisicamente il file dal memorystream
            Dim OutStream As FileStream
            Try
                pathpdf = ConfigurationManager.AppSettings("docpath") & nomefile & ".pdf"
                OutStream = New FileStream(pathpdf, FileMode.OpenOrCreate, FileAccess.Write)
                StreamToStream(output, OutStream)
                pathpdf = "/public/documents/" & nomefile & ".pdf"
    
            Catch ex As Exception
                'TODO: aggiungere la gestione degli errori
                pathpdf = ""
            Finally
                If Not (OutStream Is Nothing) Then
                    OutStream.Close()
                End If
            End Try
    
            Document.Close()
          
            Return pathpdf
        End Function
    
        'converte memorystream in stream 
        Public Sub StreamToStream(ByVal InStream As Stream, ByVal OutStream As Stream, Optional ByVal BufSize As Integer = 4096)
            Dim readBytes As Integer
            If BufSize < 1 Then
                Throw New ArgumentOutOfRangeException("BufSize", BufSize, "The buffer size must be greater than zero.")
            End If
            Dim buffer(BufSize - 1) As Byte
            While True
                readBytes = InStream.Read(buffer, 0, BufSize)
                If readBytes = 0 Then Exit While
                OutStream.Write(buffer, 0, readBytes)
            End While
        End Sub
    What's wrong?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,856
    ok come non detto
    è il passaggio da memorystream che rompe... well, scrivo direttamente nel file
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da supermac Visualizza il messaggio
    ok come non detto
    è il passaggio da memorystream che rompe... well, scrivo direttamente nel file
    no, conviene usare il memorystream. Tu hai dimenticato di chiudere il documento.
    codice:
            'creo fisicamente il file dal memorystream
            Dim OutStream As FileStream
            Try
                Document.Close()
                Dim buffer As Byte() = output.ToArray()
                output.Flush()
                pathpdf = ConfigurationManager.AppSettings("docpath") & nomefile & ".pdf"
                pathpdf = "c:\tmp\" & nomefile & ".pdf"
                File.WriteAllBytes(pathpdf, buffer)
    Pietro

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    ...o meglio, lo hai fatto al posto sbagliato

  5. #5
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,856
    se comprendo bene il memorystream dovrebbe essere tutto in memoria del server fino a che non decido di scaricarlo sul file, right?
    Quindi più veloce in esecuzione perchè non devo scrivere ogni volta fisicamente sul file ma lo faccio una volta sola alla fine.
    Impegno di più la ram del server immagino...
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da supermac Visualizza il messaggio
    se comprendo bene il memorystream dovrebbe essere tutto in memoria del server fino a che non decido di scaricarlo sul file, right?
    Quindi più veloce in esecuzione perchè non devo scrivere ogni volta fisicamente sul file ma lo faccio una volta sola alla fine.
    Impegno di più la ram del server immagino...
    Se debbo creare un pdf con una pagina aspx, non mi piace salvarlo in un file, leggerlo, restituirlo al chiamante, cancellare il file non più utile. Preferisco scrivere su memorystream e rilasciarla appena finito.
    Non so se sia il modo migliore, ma è come faccio io.

    Stesso discorso se debbo crearmi uno zip da più file. O se debbo crearmi un file Excel
    Pietro

  7. #7
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,856
    Al momento sono riuscito a zipparlo, inviarlo via mail e poi eliminarlo.

    Però in effetti mi sarebbe utile parallelamente anche poterlo generare e inviare al browser... c'è modo di generarlo senza salvare il file e aprirlo in un'altra finestra del browser?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.