Non ho il codice a portata di mano adesso, ma ho provato e funziona.
Devi dividere la tua procedura in due procedure. La prima crea lo stream (o filestream o memorystream), e la seconda crea il documento pdf.
In basic è più o meno così
codice:
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
Using fs As New FileStream("c:\tmp\Chap0101.pdf", FileMode.Create)
Dim doc As t.Document = Nothing
Try
doc = New t.Document()
p.PdfWriter.GetInstance(doc, fs)
doc.Open()
CreateDoc(doc)
Response.Redirect("/tmp/Chap0101.pdf")
Catch ex As Exception
l.PrintLn(ex.Message) : Return
Finally
Try
If doc IsNot Nothing AndAlso doc.IsOpen Then doc.Close()
Catch ex As Exception
End Try
End Try
End Using
End Sub
Nella procedura CreateDoc usi le tue istruzioni (attento che qui dove scrivo non ho controllato, ma ho provato in uffcio e va)
string strQuery = "select * from tbl_abc";
OdbcCommand Sqlcmd = new OdbcCommand(strQuery);
DataTable dt = GetData(Sqlcmd);
GridView GridView1 = new GridView();
GridView1.AllowPaging = false;
GridView1.DataSource = dt;
GridView1.DataBind();
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
GridView1.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
htmlparser.Parse(sr);
dove pdfDoc è il documento che passi alla procedura.
L'altro modo è quello di lavorare con la memoria. Si usa il Memorystream e, alla fine si decide se salvare nel flusso di uscita o in file (fai una ricerca con "memorystream to file"