ItextSharp MVC View to PDF
-
26-10-2019 - |
Вопрос
У меня есть небольшие проблемы с моим 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. Не забывайте, что его запрос будет выполняться в контексте сетевой учетной записи, которая может не иметь таких же привилегий, как обычные учетные записи.