PDF generato da iTextSharp: come inviare il pdf al client e aggiungere un prompt?

Ho generato un pdf utilizzando iTextSharp, quando viene creato lo salva automaticamente nella posizione fornita nel mio codice sul server non sul lato client e, naturalmente, senza dire nulla all’utente.

Ho bisogno di inviarlo al client e ho bisogno di richiedere una finestra di dialogo per chiedere all’utente dove vuole salvare il suo pdf ..

come posso fare questo per favore?

questo è il mio codice pdf:

using (MemoryStream myMemoryStream = new MemoryStream()) { Document document = new Document(); PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream); document.AddHeader("header1", "HEADER1"); document.Open(); //.......... document.Close(); byte[] content = myMemoryStream.ToArray(); // Write out PDF from memory stream. using (FileStream fs = File.Create(HttpContext.Current.Server.MapPath("~\\report.pdf"))) { fs.Write(content, 0, (int)content.Length); } 

MODIFICARE

    questo è un esempio del risultato che voglio http://examples.extjs.eu/?ex=download

    grazie alle tue risposte, ho modificato il mio codice per questo:

     HttpContext.Current.Response.ContentType = "application/pdf"; HttpContext.Current.Response.AppendHeader( "Content-Disposition", "attachment; filename=test.pdf"); using (MemoryStream myMemoryStream = new MemoryStream()) { Document document = new Document(); PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream); document.AddHeader("Content-Disposition", "attachment; filename=wissalReport.pdf"); document.Open(); //.......... document.Close(); byte[] content = myMemoryStream.ToArray(); HttpContext.Current.Response.Buffer = false; HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.AppendHeader("content-disposition","attachment;filename=" + "my_report.pdf"); HttpContext.Current.Response.ContentType = "Application/pdf"; //Write the file content directly to the HTTP content output stream. HttpContext.Current.Response.BinaryWrite(content); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); 

    ma ottengo questo errore:

     Uncaught Ext.Error: You're trying to decode an invalid JSON String: %PDF-1.4 %     3 0 obj <>stream x   |E  ........... 

    Sono assolutamente sicuro che il mio itextsharp per creare pdf sia corretto perché posso salvarlo sul server, ma non è quello che devo fare, quando provo a inviarlo al client ho ricevuto l’errore sopra

    Grazie in anticipo

    Nel caso di un’applicazione Web, probabilmente si desidera eseguire lo streaming del pdf come file binario per l’utente, ovvero aprire il pdf o richiedere all’utente di salvare il file.

    Ricorda che la generazione di PDF sta accadendo sul server, anche se l’utente fornisce il percorso non sarà di alcuna utilità sul server. Vedi i seguenti link –

    • Come scrivere file binari nel browser utilizzando ASP.NET e Visual C # .NET

    Nel tuo caso stai generando il file e quindi avresti già un stream binario invece di un file, quindi puoi utilizzare direttamente Response.BinaryWrite invece di Response.WriteFile .

    Campione modificato:

     Response.Buffer = false; Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); //Set the appropriate ContentType. Response.ContentType = "Application/pdf"; //Write the file content directly to the HTTP content output stream. Response.BinaryWrite(content); Response.Flush(); Response.End(); 

    È necessario inviare un’intestazione di disposizione del contenuto al browser degli utenti. Dalla memoria il codice è qualcosa del genere:

     Response.ContentType = "application/pdf"; Response.AppendHeader("Content-Disposition","attachment; filename=nameofthefile.pdf"); 

    Attualmente stai salvando il tuo file sul file server, sovrascrivendo lo stesso pdf ad ogni richiesta. E probabilmente causando errori se ricevi due richieste per un PDF allo stesso tempo.

    Utilizzare Response per restituire il PDF (dal memorystream) all’utente e saltare la scrittura del PDF in un file localmente sul proprio server.

    Il browser chiederà all’utente dove deve essere salvato il file. Qualcosa di simile a:

      Response.ContentType = "Application/pdf"; myMemoryStream.CopyTo(Response.OutputStream); 

    Guarda anche la risposta di Alun , usando content-disposition puoi proporre un nome file all’utente.

    RISOLTO

    L’errore deriva dall’operazione di invio che tenta di interpretare la risposta che non è ansible in quanto non è in un formato noto.

    Ho appena impostato window.location per scaricare i file e questo funziona bene.

     { xtype:'button', text: 'Generate PDF', handler: function () { window.location = '/AddData.ashx?action=pdf'; } } 

    Invece di impostare la posizione, puoi anche fare window.open ().

    Se il file verrà scaricato o aperto dipende dalle impostazioni del browser.

    Non è necessario utilizzare MemoryStream . Utilizzare invece Response.OutputStream . Ecco a cosa serve. Non è necessario utilizzare Response.BinaryWrite() o qualsiasi altra chiamata per scrivere esplicitamente il documento; iTextSharp si occupa della scrittura nello stream quando si utilizza Response.OutputStream .

    Ecco un semplice esempio di lavoro:

     Response.ContentType = "application/pdf"; Response.AppendHeader( "Content-Disposition", "attachment; filename=test.pdf" ); using (Document document = new Document()) { PdfWriter.GetInstance(document, Response.OutputStream); document.Open(); document.Add(new Paragraph("This is a paragraph")); } 

    Ecco come aggiungere le intestazioni HTTP appropriate . (ottenendo il prompt per salvare il file) E se il codice è in un web form , (gestore di clic del pulsante), aggiungere Response.End() all’esempio di codice precedente dopo l’istruzione using modo che l’output HTML del modulo Web non sia aggiunto il documento PDF.