Вопрос

У меня есть небольшие проблемы с моим Textreader, когда я пытаюсь проанализировать строку HTML, которую я хочу преобразовать в PDF при использовании 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

Линия, на которой он останавливается worker.Parse(reader) с ошибкой Object reference not set to an instance of an object Несмотря на то StringReader(htmlText) успешно прочитал HTML -страницу.

Я не уверен, что я делаю не так или что мне не хватает в данный момент, поэтому я буду благодарен за любую помощь.

ОБНОВИТЬ Я только что попробовал Dim reader As New StringReader(htmlText) вместо этого, но безрезультатно. Хотя htmltext по -прежнему определенно содержит значение, но объект считает, что это не так.

Это было полезно?

Решение

Я определенно напишу для этого результат пользовательского действия, чтобы избежать загрязнения моего контроллера. Также следует позаботиться о всех этих неоспоримых располагаемых ресурсах в вашем коде:

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

а потом просто:

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

Вы также должны убедиться, что сервер имеет доступ к желаемому URL. Не забывайте, что его запрос будет выполняться в контексте сетевой учетной записи, которая может не иметь таких же привилегий, как обычные учетные записи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top