Как загрузить файл PDF в клиентскую систему?

Я хочу загрузить файл PDF со стороны сервера в клиентскую систему. Страница отчета преобразуется в файл PDF и сохраняется в папке проекта на стороне сервера. Здесь проблема заключается в том, что когда я обращаюсь к нему из клиентской системы и пытаюсь создать PDF-файл, я не уверен, успешно ли он сгенерировал PDF-файл в папку проекта на стороне сервера или нет, и он не загружается автоматически в клиентскую систему. Но когда я запускаю проект из локальной системы, он работает правильно.

Здесь я размещаю свой код, пожалуйста, проверьте его и, пожалуйста, дайте мне решение для этого, мне это очень нужно

Мой код:

protected void btn_print_Click(object sender, EventArgs e)
        {
            try
            {
                string url = HttpContext.Current.Request.Url.AbsoluteUri;
                int width = 850;
                int height = 550;
                Thumbnail1 thumbnail = new Thumbnail1(url, 990, 1000, width, height);
                Bitmap image = thumbnail.GenerateThumbnail();
                image.Save(Server.MapPath("~") + "/Dwnld/Thumbnail.bmp");
                imagepath = Server.MapPath("~").ToString() + "\\Dwnld\\" + "Thumbnail.bmp";
                imagepath1 = Server.MapPath("~").ToString() + "\\Dwnld\\" + "Thumbnail.pdf";
                convetToPdf();
            }
            catch (Exception)
            {

                throw;
            }
        }



    string imagepath = null;
        string imagepath1 = null;
        public void convetToPdf()
        {
            PdfDocument doc = new PdfDocument();
            System.Drawing.Size size = PageSizeConverter.ToSize(PdfSharp.PageSize.A4);
            PdfPage pdfPage = new PdfPage();
            pdfPage.Orientation = PageOrientation.Landscape;
            doc.Pages.Add(pdfPage);
            //  XSize size = PageSizeConverter.ToSize(PdfSharp.PageSize.A4)
            XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
            XImage img = XImage.FromFile(imagepath);
            xgr.DrawImage(img, 0, 0);
            doc.Save(imagepath1);
            xgr.Dispose();
            img.Dispose();
            doc.Close();
            Response.ContentType = "Application/pdf";
            //Get the physical path to the file.
            string FilePath = imagepath1;
            //Write the file directly to the HTTP content output stream.
            Response.WriteFile(FilePath);
            Response.End();
        }
        public class Thumbnail1
        {
            public string Url { get; set; }
            public Bitmap ThumbnailImage { get; set; }
            public int Width { get; set; }
            public int Height { get; set; }
            public int BrowserWidth { get; set; }
            public int BrowserHeight { get; set; }

            public Thumbnail1(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
            {
                this.Url = Url;
                this.BrowserWidth = BrowserWidth;
                this.BrowserHeight = BrowserHeight;
                this.Height = ThumbnailHeight;
                this.Width = ThumbnailWidth;
            }
            public Bitmap GenerateThumbnail()
            {
                Thread thread = new Thread(new ThreadStart(GenerateThumbnailInteral));
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
                thread.Join();
                return ThumbnailImage;
            }
            private void GenerateThumbnailInteral()
            {
                WebBrowser webBrowser = new WebBrowser();
                webBrowser.ScrollBarsEnabled = false;
                webBrowser.Navigate(this.Url);
                webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
                while (webBrowser.ReadyState != WebBrowserReadyState.Complete) System.Windows.Forms.Application.DoEvents();
                webBrowser.Dispose();
            }
            private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser webBrowser = (WebBrowser)sender;
                webBrowser.ClientSize = new Size(this.BrowserWidth, this.BrowserHeight);
                webBrowser.ScrollBarsEnabled = false;
                this.ThumbnailImage = new Bitmap(webBrowser.Bounds.Width, webBrowser.Bounds.Height);
                webBrowser.BringToFront();
                webBrowser.DrawToBitmap(ThumbnailImage, webBrowser.Bounds);
                this.ThumbnailImage = (Bitmap)ThumbnailImage.GetThumbnailImage(Width, Height, null, IntPtr.Zero);
            }
        }
        protected void CreateThumbnailImage(object sender, EventArgs e)
        {

        }

person chitrakant sahu    schedule 23.02.2014    source источник
comment
Сначала посмотрите журнал ошибок. Вероятно, у вас нет прав на запись файла на диск.   -  person Aristos    schedule 23.02.2014


Ответы (1)


Одна потенциальная проблема с этим кодом заключается в том, что вы пишете в одни и те же файлы для каждого запроса. Если есть несколько запросов одновременно, некоторые из них могут завершиться ошибкой.

Чтобы решить эту проблему, вы можете напрямую писать в поток ответов, т.е.

protected void btn_print_Click(object sender, EventArgs e)
{
    string url = HttpContext.Current.Request.Url.AbsoluteUri;
    int width = 850;
    int height = 550;
    Thumbnail1 thumbnail = new Thumbnail1(url, 990, 1000, width, height);
    using (Bitmap image = thumbnail.GenerateThumbnail())
        convertToPdf(image);
}

public void convertToPdf(Image image)
{
    using (PdfDocument doc = new PdfDocument())
    {
        System.Drawing.Size size = PageSizeConverter.ToSize(PdfSharp.PageSize.A4);
        PdfPage pdfPage = new PdfPage();
        pdfPage.Orientation = PageOrientation.Landscape;
        doc.Pages.Add(pdfPage);
        using (XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]))
        {
            using (XImage img = XImage.FromGdiPlusImage(image))
            {
                xgr.DrawImage(img, 0, 0);
                using (MemoryStream stream = new MemoryStream())
                {
                    doc.Save(stream, false);
                    Response.ContentType = "application/pdf";
                    Response.AddHeader("Content-Length", stream.Length.ToString());
                    stream.WriteTo(Response.OutputStream);
                }
            }
        }
    }
    Response.End();
}

Изменить Измененный ответ для использования операторов using для высвобождения ресурсов.

person alsed42    schedule 23.02.2014
comment
когда я пытаюсь выполнить приведенный выше код, отображается ошибка, т.е. указанный метод не поддерживается. в строке doc.Save(Response.OutputStream); - person chitrakant sahu; 23.02.2014
comment
пожалуйста, дайте мне решение, как я могу сохранить файл PDF в клиентской системе с сервера. когда я запускаю проект с серверного компьютера, он работает нормально, показывает файл PDF и предоставляет возможность загрузки, но когда я обращаюсь к нему с клиентского компьютера, он не предоставляет никаких вариантов загрузки и не показывает файл PDF. - person chitrakant sahu; 23.02.2014
comment
Измененный код в ответе для использования временного MemoryStream. Вероятно, Response.OutputStream не поддерживает поиск. Пожалуйста, попробуйте еще раз. - person alsed42; 23.02.2014
comment
comment
@PDFsharpTeam Спасибо, я упустил из виду тот факт, что PdfDocument.Save(Stream) по умолчанию закрывает поток. Отредактированный ответ. - person alsed42; 25.02.2014