Itextsharp 打开新标签 ISSUE
Itextsharp open new tab ISSUE
我需要在新标签页中打开 pdf,它工作正常并且文件显示完美,但是如果我用记事本++打开文件,在 EOF 之后有一些 NULL 字符(见图)。
只有我在新选项卡中打开它并使用 memorystream,EOF 之后的字符串对客户端的解析器造成了一些问题,这是怎么回事?
这是代码:
Dim mswithPage As New MemoryStream()
Dim SessValue As String = Request.QueryString("s")
Dim NOrder As String = Request.QueryString("odv")
mswithPage = CType(Session(SessValue), MemoryStream)
Response.Clear()
Response.ContentType = "Application/pdf"
Response.AddHeader("content-disposition", "inline;filename=" & NOrder & ".pdf")
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.GetBuffer().Length)
Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.End()
问题
这一行有问题:
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.GetBuffer().Length)
更准确地说它的最终参数 mswithPage.GetBuffer().Length
- 您应该使用缓冲区中实际 使用的 字节数,但您使用 完成缓冲区。
一个解决方案
因此,使用 mswithPage.Length
代替:
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.Length)
... 如果 MemoryStream
已经关闭
如果 MemoryStream
已经关闭,上面的解决方案将不再有效,因为它的 Length
属性 只能用于打开的流。
不过,在关闭流上起作用的是 ToArray
方法!因此,您可以改用
Response.OutputStream.Write(mswithPage.ToArray())
(实际上,有趣的是 ToArray
适用于封闭流,但 Length
不适用。毕竟,ToArray
本质上是 returns 第一个 Length
内部缓冲区的许多字节...)
我需要在新标签页中打开 pdf,它工作正常并且文件显示完美,但是如果我用记事本++打开文件,在 EOF 之后有一些 NULL 字符(见图)
这是代码:
Dim mswithPage As New MemoryStream()
Dim SessValue As String = Request.QueryString("s")
Dim NOrder As String = Request.QueryString("odv")
mswithPage = CType(Session(SessValue), MemoryStream)
Response.Clear()
Response.ContentType = "Application/pdf"
Response.AddHeader("content-disposition", "inline;filename=" & NOrder & ".pdf")
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.GetBuffer().Length)
Response.OutputStream.Flush()
Response.OutputStream.Close()
Response.End()
问题
这一行有问题:
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.GetBuffer().Length)
更准确地说它的最终参数 mswithPage.GetBuffer().Length
- 您应该使用缓冲区中实际 使用的 字节数,但您使用 完成缓冲区。
一个解决方案
因此,使用 mswithPage.Length
代替:
Response.OutputStream.Write(mswithPage.GetBuffer(), 0, mswithPage.Length)
... 如果 MemoryStream
已经关闭
如果 MemoryStream
已经关闭,上面的解决方案将不再有效,因为它的 Length
属性 只能用于打开的流。
不过,在关闭流上起作用的是 ToArray
方法!因此,您可以改用
Response.OutputStream.Write(mswithPage.ToArray())
(实际上,有趣的是 ToArray
适用于封闭流,但 Length
不适用。毕竟,ToArray
本质上是 returns 第一个 Length
内部缓冲区的许多字节...)