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 内部缓冲区的许多字节...)