Frage

Ich habe ein wenig Probleme mit meinem TexTreader, wenn ich versuche, die HTML -Zeichenfolge zu analysieren, die ich bei der Verwendung von iTextSharp in PDF konvertieren möchte.

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

Die Linie, die sie stoppt, ist worker.Parse(reader) mit dem Fehler Object reference not set to an instance of an object wenngleich StringReader(htmlText) hat die HTML -Seite erfolgreich gelesen.

Ich bin mir nicht sicher, was ich falsch mache oder was ich im Moment fehlt, also wäre ich dankbar für irgendeine Hilfe.

AKTUALISIEREN Ich habe es versucht Dim reader As New StringReader(htmlText) Stattdessen aber ohne Erfolg. Obwohl HTMLText immer noch definitiv einen Wert enthält, ist das Objekt der Meinung, dass dies nicht der Fall ist.

War es hilfreich?

Lösung

Ich würde definitiv ein benutzerdefiniertes Aktionsergebnis dafür schreiben, um die Verschmutzung meines Controllers zu vermeiden. Auch alle diese unverzichtbaren verfügbaren Ressourcen in Ihrem Code sollten gepflegt werden:

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

Und dann einfach:

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

Sie sollten auch sicherstellen, dass der Server Zugriff auf die gewünschte URL hat. Vergessen Sie nicht, dass seine Anfrage im Kontext des Netzwerkkontos ausgeführt wird, das möglicherweise nicht die gleichen Berechtigungen wie normale Konten hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top