Itextsharp открыть новую вкладку ПРОБЛЕМА

Мне нужно открыть pdf на новой вкладке, он работает, и файл отображается идеально, но если я открою файл с помощью notepadd ++, после EOF появятся некоторые символы NULL (см. рис.) введите здесь описание изображения. Это происходит, только я открываю его в новой вкладке и использую поток памяти, строка после 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()

person user3699954    schedule 24.06.2019    source источник
comment
проблема, кажется, Response.OutputStream.... Мне нужно открыть файл pdf в новой вкладке.   -  person user3699954    schedule 25.06.2019


Ответы (1)


Проблема

Проблема в этой строке:

 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 по сути возвращает копию первых Length байтов внутреннего буфера...)

person mkl    schedule 24.06.2019
comment
Я получил исключение Не могу получить доступ к закрытому потоку - person user3699954; 25.06.2019
comment
Затем не закрывайте MemoryStream до получения его содержимого! (Поскольку вы пометили свой вопрос itext, вы можете изменить свойство writer.CloseStream вашего PdfWriter или PdfStamper.Writer, см. этот ответ.) - person mkl; 25.06.2019
comment
Я использую эту страницу, чтобы открыть новую вкладку pdf, и, как вы можете видеть, я перехожу на эту страницу только в поток памяти, и у меня нет wirter. - person user3699954; 25.06.2019
comment
Тогда зачем тег itext, если вы не используете iText? Тем не менее, если вы получаете Невозможно получить доступ к закрытому потоку, то у вас есть закрытый MemoryStream, который не подходит, если вы хотите получить доступ к внутреннему буферу потока и используемому размеру буфера. Однако, если вы не обязаны использовать внутренний буфер, используйте вместо него ToArray. - person mkl; 25.06.2019
comment
Вы правы, это моя ошибка не в itext, а в itextsharp, я исправляю прямо сейчас. Итак, я пытаюсь возобновить: я создаю pdf с itextsharp, затем конвертирую pdfdoc в поток памяти, передаю поток памяти в качестве переменной сеанса на другую страницу и в конце я показываю его на новой вкладке с кодом, который вы можете увидеть выше. Итак, что вы предлагаете использовать ToArray, можете ли вы предоставить код, пожалуйста. - person user3699954; 25.06.2019
comment
это не itext, а itextsharpiTextSharp — это старое название iText для .Net; таким образом, теги являются синонимами. потом конвертирую pdfdoc в memorystream - скорее всего именно здесь вы неявно закрываете объект MemoryStream. Смотрите комментарий выше, чтобы узнать, как это предотвратить. Итак, что вы предлагаете использовать ToArray - см. мой отредактированный ответ. - person mkl; 25.06.2019
comment
Response.OutputStream.Write(mswithPage.ToArray(), 0, mswithPage.ToArray().Length) Это работает!! - person user3699954; 25.06.2019