944 messaggi dal 11 febbraio 2013
ciao a tutti
sto cercando di esportare una listview contenete immagini

<asp:Image ID="myIMG" runat="server" Height="250" Width="250"
ImageUrl='<%# Eval("pathImage")%>' />

dove pathImage è un campo in tabella che porta valori '~/Immagini/foto.jpg'

nella pagina aspx ho un button che genera il pdf ....

Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment;filename=Proposte.pdf")
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Dim sw As New StringWriter()
Dim hw As New HtmlTextWriter(sw)
Me.Page.RenderControl(hw)
Dim sr As New StringReader(sw.ToString())
Dim pdfDoc As New Document(PageSize.A4, 10.0F, 10.0F, 100.0F, 0.0F)
Dim htmlparser As New HTMLWorker(pdfDoc)
PdfWriter.GetInstance(pdfDoc, Response.OutputStream)
pdfDoc.Open()
htmlparser.Parse(sr)
pdfDoc.Close()
Response.Write(pdfDoc)
Response.[End]()
End Sub

...dato che il listview è popolato da immagini (jpg) mi restituisce errore:
Impossibile trovare una parte del percorso C:\Immagini\foto.jpg'.

htmlparser.Parse(sr) ***qui ho l'errore

ho cercato in rete e la cosa migliore che ho trovato è questa:
http://www.dotnetfunda.com/articles/show/2326/converting-web-page-to-pdf-using-itextsharp

solo che replicando l'esempio con un campo image/varchar(max)/binary(max) non funziona..

help
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
il problema è che iTextSharp si aspetta che le immagini siano nel disco locale ma non le sta trovando.
iTextSharp fa del suo meglio quando si trova di fronte ad un percorso relativo come immagini/foto.jpg e lo completa pensando che immagini sia una sottocartella del disco C:

Ovviamente non è così, perché immagini è invece una sottocartella della root del tuo sito web. Devi mettere iTextSharp al corrente di questo fatto.

Mi vengono in mente due cose da provare:
  • O indichi all'HtmlWoker che il percorso base non è C: ma la root del tuo sito (e questo puoi provare a farlo valorizzando una sua proprietà. Vedo dalla documentazione che c'è una proprietà chiamata IMAGE_BASEURL che dovresti provare)
  • Oppure fai in modo che l'html prodotto dalla tua ListView contenga percorsi fisici assoluti. Al posto di <img src="immagini/foto.jpg" />, il rendering del tuo controllo deve produrre <img src="C:\rootdeltuosito\immagini\foto.jpg" />. Ovviamente non mi aspetto che modifichi il template della listview, perché altrimenti non vedresti più le immagini quando visiti la pagina web, ma attuare qualche tipo di post processing. Puoi provare a fare dei replace sulla stringa che ottieni dal rendering, oppure crearti una classe che deriva da HtmlTextWriter e che fa l'override di AddAttribute. Dal corpo di questo metodo, controlla il nome dell'attributo e, quando è "src", modifica il percorso relativo in modo che diventi un percorso fisico assoluto.


ciao,
Moreno
Modificato da BrightSoul il 02 novembre 2014 15.31 -

Enjoy learning and just keep making
3.939 messaggi dal 28 gennaio 2003
Ho provato così:
nel codice che recupera l'html ho, per le immagini, testo del genere:
<img src="./********

perciò sostituisco le ricorrenze di src="./ con src="http://sito/


ho visto che funziona, però, detto fra di noi, preferisco di gran lunga fare tutto da codice. In altre parole, partirei dall'sql che genera il listview e riscriverei il codice iTextSharp per ottenere lo stesso risultato.

ciao
944 messaggi dal 11 febbraio 2013
scusate ragazzi ma ho sempre problemi con la spunta sulle notifiche (io la metto...mha) :
la routine è diventata controllare la posta dove arrivano le risposte.

vi ringrazio perchè mi sono sentito abbandonato!!

ho visto solo ora le vostre risposte.

Domani provo i suggerimenti...ora come ora non vedo nemmeno dove si spegne il pc

cmq anche un esempio semplice per capire è apprezzato

magari lo avete postato e non lo vedo...:)
Modificato da jjchuck il 10 novembre 2014 19.07 -
3.939 messaggi dal 28 gennaio 2003
Beh! tutti sanno qui che le risposte di BrightSoul sono preziose e da tenersi nella giusta considerazione.
Io, più modestamente, ti propongo la mia esperienza.
Con iTextSharp è abbastanza facile fare tabelle native.
Basta seguire sia i consigli del libro proposto, sia seguire gli esempi che il suo sito propone in rete.
Sì, sono in java, ma è così vicino al c#. E poi, se l'ho capito io, che lavoro in basic, capisci che non è difficile.

Come vuoi fare te è una strada in salita, perché questo prodotto non è, purtroppo, ottimizzato per tradurre l'html e gli stili in pdf.

Bada che produce ottimamente una quantità grande di dati, separate in pagine, con intestazione e piede, il tutto con aspetto più che professionale.

Ciao.
944 messaggi dal 11 febbraio 2013
ringrazio entrambi
cmq si i consigli di bright sono sempre eccellenti...

Infatti la curiosità era tanta e sono andato semplicemente a sostituire il percorso fisico in src (he messo sempre la stessa foto) ed in effetti (pur non vedendo le immagini nel'html) quando ho esportato si vedeva benissimo tutto.

Ora non so se sono in grado di seguire i consigli (non tanto per il java che ho studiato...anche se solo le basi un bel tomo me lo sono fatto)
perchè non sono purtroppo un programmatore e conosco poco gli oggetti di lettura scrittura...

proverò a fare del mio meglio
se non dovessi riuscire spero siate cosi gentili da farmi capire

ciao
a presto e grazie ancora
944 messaggi dal 11 febbraio 2013
ho trovato una marea di esempi ed in effetti è piu semplice fare
demo dove si costruisce il report da zero tipo:
http://www.aspsnippets.com/Articles/Create-PDF-Report-from-database-in-ASPNet-using-C-and-VBNet.aspx


però ero incuriosito di provare la strada di bright: fare un replace dell'url
solo che quando provo il metodo findcontrol mi va in conflitto con itextsharp

DirectCast(e.Item.FindControl("img1"), Image).ImageUrl

impossibile convertire il controllo in Itextsharp.text.image

non so come fare...

sono convinto che è la strada che mi da un risultato immediato.

prima che impari tutta quella roba ci vorrà non so quanto
Modificato da jjchuck il 11 novembre 2014 15.45 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
proviamo questa soluzione:

crearti una classe che deriva da HtmlTextWriter e che fa l'override di AddAttribute

Aggiungi una classe al tuo progetto fatta in questo modo:
Imports System.Web
Imports System.IO

Public Class MioHtmlTextWriter
    Inherits HtmlTextWriter

    Sub New(textWriter As TextWriter)
        MyBase.New(textWriter)
    End Sub

    'Faccio l'override di AddAttribute
    Public Overrides Sub AddAttribute(key As HtmlTextWriterAttribute, value As String)
        'Se l'attributo è Src, allora correggo il percorso e lo rendo fisico con Server.MapPath
        If key = HtmlTextWriterAttribute.Src Then
            value = HttpContext.Current.Server.MapPath(value)
        End If

        'invoco il metodo base con il value corretto
        MyBase.AddAttribute(key, value)
    End Sub

End Class

Ora non resta che usare questo nostro HtmlTextWriter al posto di quello originale. Modifica questa riga da così:
Dim hw As New HtmlTextWriter(sw)

A così:
Dim hw As New MioHtmlTextWriter(sw)



ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.