iTextSharp MVC Просмотреть в PDF - PullRequest
       20

iTextSharp MVC Просмотреть в PDF

0 голосов
/ 05 сентября 2011

У меня небольшая проблема с моим 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 все еще определенно содержит значение, но объект думает, что это не так.

1 Ответ

0 голосов
/ 05 сентября 2011

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

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. Не забывайте, что его запрос будет выполняться в контексте сетевой учетной записи, которая может не иметь тех же привилегий, что и обычные учетные записи.

...