簡體   English   中英

如何從.aspx頁面生成PDF

[英]how to generate PDF from .aspx page

我想從當前運行的.aspx頁面創建PDF,並且我成功地做到了這一點。 但是問題是,當我通過登錄頁面登錄並創建一個report_page的PDF時(只有我成功登錄后才能訪問此report_page),然后單擊按鈕生成當前正在運行的report_page的PDF,然后在這里生成PDF登錄頁面(而不是report_page)。 在這里,我還有另一個report_page,當我通過此report_page生成報告(無需登錄)並嘗試將其轉換為PDF時,無需登錄即可生成報告,然后它可以正常工作,這意味着在此生成了report_page的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)
    {

    }

問題是您在單獨的請求中請求要生成的頁面,其中不包括您的登錄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);
    }

那也可能工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM