【问题标题】:how to generate PDF from .aspx page如何从 .aspx 页面生成 PDF
【发布时间】:2014-02-20 11:21:31
【问题描述】:

我想从当前正在运行的 .aspx 页面创建 PDF,并且我成功地做到了这一点。但问题是,当我通过登录页面登录并创建报告页面的 PDF 时(我只能在成功登录时访问此报告页面)并单击按钮生成当前正在运行的报告页面的 PDF,然后这里 PDF 正在生成登录页面而不是report_page。 在这里我有另一个report_page,当我通过这个report_page(不需要登录)生成报告时不需要登录来生成报告并尝试将其转换为PDF然后它工作正常意味着这里PDF是由report_page生成的。

我在这里粘贴我的代码,请检查并给我解决方案:

 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)
    {

    }

【问题讨论】:

    标签: c# asp.net pdf


    【解决方案1】:

    问题是您在单独的请求中请求要生成的页面,该请求不包括您的登录 cookie/会话。它正在请求它,就好像它是一个完全独立的浏览器一样。

    我能想到的唯一方法是,如果您在 IIS 中打开了基本身份验证,您可以将 url 更改为:http://myThumbnailUser:myThumbnailPassw0rd@www.mydomain.com/path/to/page/to/be/rendered.aspx

    您可以尝试将执行所有生成的方法附加到页面卸载事件,以允许您获取响应流,将其泵入WebBrowser 控件,然后使用它来生成您的 PDF。

    protected void btn_print_Click(object sender, EventArgs e)
    {
        try
        {
            int width = 850;
            int height = 550;
    
            this.Page.Unload += delegate {
                Thumbnail1 thumbnail = new Thumbnail1(this.Page, 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;
        }
    }
    
    ...
    
    public Thumbnail1(Page page, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
        {
            this.Page = page;
            this.BrowserWidth = BrowserWidth;
            this.BrowserHeight = BrowserHeight;
            this.Height = ThumbnailHeight;
            this.Width = ThumbnailWidth;
        }
    
    ...
    
    private void GenerateThumbnailInteral()
        {
            WebBrowser webBrowser = new WebBrowser();
            webBrowser.ScrollBarsEnabled = false;
            webBrowser.Navigate(this.Url);
            webBrowser.DocumentStream = this.Page.Response.GetResponseStream()
            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);
        }
    

    这也可能有效..

    【讨论】:

    • 它不起作用并在 webBrowser.DocumentStream = this.Page.Response.GetResponseStream(); 行中显示错误这里错误显示在 GetResponseStream() 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2011-03-22
    • 2016-12-20
    • 2021-07-05
    相关资源
    最近更新 更多