ITEXTSHARP MVC -Ansicht zu PDF
-
26-10-2019 - |
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.
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.