Question

Je vais avoir un peu de mal avec mon TextReader en essayant d'analyser la chaîne html je veux convertir au format PDF lors de l'utilisation iTextSharp.

Function ViewDeliveryNote(ByVal id As Integer) As FileStreamResult
        'Memory buffer
        Dim ms As MemoryStream = New MemoryStream()

        'the document
        Dim document As Document = New Document(PageSize.A4)

        'the pdf writer
        PdfWriter.GetInstance(document, ms)

        Dim wc As WebClient = New WebClient
        Dim htmlText As String = wc.DownloadString("http://localhost:59800/Warehouse/DeliveryNote/" & id) 'Change to live URL
        Dim worker As html.simpleparser.HTMLWorker = New html.simpleparser.HTMLWorker(document)
        Dim reader As TextReader = New StringReader(htmlText)

        document.Open()

        worker.Open()
        worker.StartDocument()
        worker.Parse(reader)
        worker.EndDocument()
        worker.Close()

        document.Close()

        'ready the file stream
        Response.ContentType = "application/pdf"
        Response.AddHeader("content-disposition", "attachment;filename=DeliveryNote.pdf")
        Response.Buffer = True
        Response.Clear()
        Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer.Length)
        Response.OutputStream.Flush()
        Response.End()

        Return New FileStreamResult(Response.OutputStream, "application/pdf")
 End Function

La ligne s'arrête sur est worker.Parse(reader) avec le Object reference not set to an instance of an object d'erreur, même si StringReader(htmlText) a lu avec succès la page HTML.

Je ne sais pas ce que je fais mal ou ce que je suis absent pour le moment donc je vous serais reconnaissant pour toute aide.

UPDATE Je viens d'essayer Dim reader As New StringReader(htmlText) à la place, mais en vain. Bien que htmlText encore contient certainement une valeur, mais l'objet pense qu'il ne fonctionne pas.

Était-ce utile?

La solution

Je certainement écrire un résultat de l'action sur mesure pour cela pour éviter de polluer mon contrôleur. Aussi toutes les ressources disponibles dans votre code non aliéné doit être pris en charge:

Public Class PdfResult
    Inherits ActionResult

    Private ReadOnly _id As Integer

    Public Sub New(ByVal id As Integer)
        _id = id
    End Sub

    Public Overrides Sub ExecuteResult(context As ControllerContext)
        If context Is Nothing Then
            Throw New ArgumentNullException("context")
        End If

        Dim response = context.HttpContext.Response
        response.Buffer = True
        response.ContentType = "application/pdf"
        response.AddHeader("Content-Disposition", "attachment; filename=DeliveryNote.pdf")

        Using client = New WebClient()
            Dim htmlText As String = client.DownloadString("http://localhost:59800/Warehouse/DeliveryNote/" & _id) 'Change to live URL
            Dim doc = New Document(PageSize.A4)
            PdfWriter.GetInstance(doc, response.OutputStream)
            Dim worker = New HTMLWorker(doc)
            doc.Open()
            worker.Open()
            Using reader = New StringReader(htmlText)
                worker.Parse(reader)
            End Using
            doc.Close()
        End Using
    End Sub
End Class

et simplement:

Function ViewDeliveryNote(ByVal id As Integer) As ActionResult
    Return New PdfResult(id)
End Function

Vous devriez également vous assurer que le serveur a accès à l'URL souhaitée. Ne pas oublier que sa demande exécutera dans le cadre du Compte du réseau qui pourrait ne pas avoir les mêmes privilèges que les comptes normaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top