iTextSharp MVC Voir en PDF
-
26-10-2019 - |
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.
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.