öffnen Sie byte-array aus dem Speicher-stream in neuen Fenster oder tab

Dies scheint ein häufiges problem zu sein, aber nach einer langen Suche habe ich doch eine Lösung zu finden, die genau meinen Anforderungen. Ich bin mit itextsharp füllen ein pdf-Formular, aus dem ich ein byte-array. (Es sind mehrere Seiten des gleichen Formulars mit den gleichen Informationen, die ich kombinieren in einem einzigen pdf-Dokument). Ich kann dies tun, ohne Probleme, das problem ist, wenn ich die Anzeige der fertigen pdf-Dokument an den Benutzer, die ich brauche, um es zu öffnen in einem neuen Fenster oder tab OHNE erste Aufforderung des Benutzers zu speichern oder öffnen Sie die Datei. Ich will aber auch NICHT zum speichern einer Datei auf dem server, und öffnen Sie ihn mit der filestream. Wenn ich den " content-disposition "inline" das pdf angezeigt wird im gleichen browser-Fenster. Dies schafft Probleme, da der Benutzer muss klicken Sie auf die zurück-Schaltfläche Ihres Browsers zurück navigieren Sie zu der Website, die startet den Formular-Prozess. So wie es momentan sitzt mein code erfolgreich erzeugt die pdf-Datei und Sie werden aufgefordert, zu öffnen oder speichern Sie es. Dies ist der Schritt, den ich entfernen müssen. Ich glaube mich zu erinnern einige java-snippet zum öffnen der pdf-Datei in einem neuen Fenster oder tab, aber ich war nicht erfolgreich bei der Replikation /es zu finden. Ich habe auch gespielt mit verschiedenen überschriften, aber ich habe eine Wand schlagen. Jegliche Hilfe würde sehr geschätzt werden.

(Ich nenne die Methode " go " von meinem nachstehenden code von einer Schaltfläche klicken Sie nach der notwendigen Validierung von Daten.)

private void go()
    {
        List<byte[]> pdfs = new List<byte[]>();

        while (PageNumber <= Convert.ToInt32(PageCountLabel.Text))
        {
            pdfs.Add(PopulatePDF());
        }

        MemoryStream ms = MergePDFs(pdfs);
            //opens pdf in new tab after save/open option
        Response.AddHeader("Content-Disposition", "attachment; filename=TheDocument.pdf");


        Response.ContentType = "application/pdf";            
        Response.BinaryWrite(ms.ToArray());
        Response.End();                             
    }


    //************fills in pdf form****************//

    private byte[] PopulatePDF()
    {         

        MemoryStream ms = new MemoryStream();
        PdfStamper Stamper = null;            
        PdfReader Reader = new PdfReader(Server.MapPath("~/PDFTemplates/template1.pdf"));
        try
        {
            string temp = Profile.ToString().ToUpper();

            PdfCopyFields Copier = new PdfCopyFields(ms);
            Copier.AddDocument(Reader);
            Copier.Close();

            PdfReader docReader = new PdfReader(ms.ToArray());
            ms = new MemoryStream();
            Stamper = new PdfStamper(docReader, ms);
            AcroFields Fields = Stamper.AcroFields;

            //fill form fields here                                         

            PageNumber++;
            Stamper.FormFlattening = true;
        }
        finally
        {
            if (Stamper != null)
            {
                Stamper.Close();
            }
        }
        return ms.ToArray();
    }


    //combines pdf pages into single document
    private MemoryStream MergePDFs(List<byte[]> pdfs)
    {
        MemoryStream ms = new MemoryStream();
        PdfCopyFields Copier = new PdfCopyFields(ms);

        foreach (var pdf in pdfs)
            Copier.AddDocument(new PdfReader(pdf));
        Copier.Close();
        return ms;
    }
Sie können es nicht tun, ohne zuerst fordert den Benutzer auf speichern oder öffnen Sie die Datei. da Response.End beendet die Seite über den Lebenszyklus.

InformationsquelleAutor ovaltein | 2013-01-24

Schreibe einen Kommentar