0

单击gridview的按钮时,我想在新选项卡中显示我的pdf文件。如何显示?请有人帮助我。这是我的代码。

'my gridview button click event
 Protected Sub btnDisplay_Click(sender As Object, e As EventArgs)
        Dim grdrow As GridViewRow = CType((CType(sender, Button)).NamingContainer, GridViewRow)

        'I save pdf with datetime but showing file name without datetime on screen so I need to 
         'combine again when I need to open the file from upload folder

        Dim dtime As DateTime = grdrow.Cells(2).Text 
        Dim fname As String = lblFileName.Text.Split(".").First + "_" + 
                              dtime.ToString("yyyyMMddHHmmss") + ".pdf"

        Dim FilePath As String = Server.MapPath("~/uploads/" & fname)



        Dim User As WebClient = New WebClient()
        Dim FileBuffer As Byte() = User.DownloadData(FilePath)

        If FileBuffer IsNot Nothing Then
            Response.ContentType = "application/pdf"
            Response.AddHeader("content-length", FileBuffer.Length.ToString())
            Response.BinaryWrite(FileBuffer)
        End If
    End Sub

--Edit-- 我有一些想法,它确实对我有用。我添加了一些脚本来打开新标签。

html,网格视图

//javascript
<script type="text/javascript">
        function openInNewTab() {
            window.document.forms[0].target = '_blank';
            setTimeout(function () { window.document.forms[0].target = ''; }, 0);
        }
</script>

<asp:BoundField DataField="FileName" HeaderText="Filename" ItemStyle-Width="200" HtmlEncode="false"><ItemStyle Width="200px"></ItemStyle></asp:BoundField>
<asp:BoundField DataField="Process" HeaderText="Process" ItemStyle-Width="200" HtmlEncode="false"><ItemStyle Width="200px"></ItemStyle></asp:BoundField>
<asp:TemplateField ItemStyle-Width="80px" ItemStyle-HorizontalAlign="Center">
                        <ItemTemplate>                
                            <asp:Button ID="btnDisplay" runat="server" Text="Display" OnClick="btnDisplay_Click" OnClientClick="openInNewTab();" Visible='<%# If(Eval("Process").ToString() = "Uploaded", True, False) %>'></asp:Button>
                        </ItemTemplate>
                    </asp:TemplateField>

主.aspx

Protected Sub btnDisplay_Click(sender As Object, e As EventArgs)

        Dim grdrow As GridViewRow = CType((CType(sender, Button)).NamingContainer, GridViewRow)
        Dim fname As String = grdrow.Cells(2).Text 

        'pdf Display
        Session("pdfname") = fname
        Response.Redirect("GeneratePDF.aspx")

    End Sub

生成PDF.aspx

<form id="form1" runat="server">
        <div style ="Display: Inline-block;float: left;">
        <asp:Literal ID="ltEmbed" runat="server" />
    </div>
    </form>

生成PDF.aspx.vb

Dim pdf_name As String
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Page.Title = "PDF DISPLAY"
        pdf_name = Session("pdfname")
        Dim embed As String = "<object data=""{0}"" type=""application/pdf"" width=""2000px"" height=""1000px"">"
        embed += "If you are unable to view file, you can download from <a href = ""{0}"">here</a>"
        embed += " or download <a target = ""_blank"" href = ""http://get.adobe.com/reader/"">Adobe PDF Reader</a> to view the file."
        embed += "</object>"
        ltEmbed.Text = String.Format(embed, ResolveUrl("~/uploads/" + pdf_name))

    End Sub
4

2 回答 2

1

首先使用超链接而不是 Button 并使目标 =_blank。然后在新 aspx 的页面加载上编写生成 PDF 的代码。

'HTML CODE

<asp:HyperLink ID="btnDisplay" runat="server" Text="Open PDF"  Target ="_blank" NavigateUrl="~/WBP/GeneratePDF.aspx"></asp:HyperLink>


'SERVER CODE


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles Me.Load
    
        Dim dtime As DateTime = DateTime.Now.ToString()

        Dim fname As String = "pdffile_" +
                          dtime.ToString("yyyyMMddHHmmss") + ".pdf"
        Dim FilePath As String = Server.MapPath("writereaddata/" & fname)

        Dim User As WebClient = New WebClient()


        HttpContext.Current.Response.ContentType = "application/pdf"


        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)

        Dim sw As New StringWriter()
        Dim hw As New HtmlTextWriter(sw)
        Dim pdfDoc As New Document(PageSize.A4, 10, 10, 8, 2)

        Dim htmlparser As New HTMLWorker(pdfDoc)
        PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream)
        Dim sr As New StringReader(sw.ToString())

        pdfDoc.Open()
        Dim pthd As Paragraph = New Paragraph("WELCOME TO PDF FILE", New Font(Font.TIMES_ROMAN, 11, Font.BOLD, Color.BLACK))
        pdfDoc.Add(pthd)
        htmlparser.Parse(sr)
        pdfDoc.Close()

        HttpContext.Current.Response.Write(pdfDoc)

        HttpContext.Current.Response.End()

End Sub
于 2021-12-14T07:40:00.087 回答
0

我认为您遗漏了一些东西,请在 if 语句的末尾添加 Response.End()

 If FileBuffer IsNot Nothing Then
        Response.ContentType = "application/pdf"
        Response.AddHeader("content-length", FileBuffer.Length.ToString())
        Response.BinaryWrite(FileBuffer)
        Response.End()
    End If

如果它不起作用,那么Html肯定有问题

于 2021-12-13T08:27:24.033 回答