2014-02-23 2 views
1

서버 측에서 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) 
     { 

     } 
+0

오류 로그를 먼저보십시오. 파일에 디스크 쓰기 권한을 부여하지 않았기 때문일 수 있습니다. – Aristos

답변

3

하나의 잠재적 인 문제를이 코드는 것입니다 함께 모든 요청에 ​​대해 동일한 파일에 편지를 쓰고 있습니다. 동시에 여러 요청이있는 경우 일부 요청이 실패 할 수 있습니다.

자원을 해제 using 문을 사용하는 직접 응답 스트림에 쓸 수있는이, 즉

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(); 
} 

편집 수정 대답을 해결합니다.

+0

위의 코드를 시도 할 때 "지정된 메소드가 지원되지 않습니다."라는 오류가 표시됩니다. 줄 "doc.Save (Response.OutputStream);" –

+0

서버에서 클라이언트 시스템으로 pdf 파일을 저장할 수있는 방법에 대한 해결책을 알려주십시오. 내가 서버 컴퓨터에서 프로젝트를 실행하면 잘 작동하고 pdf 파일을 보여주고 다운로드 옵션을 제공하지만 클라이언트 컴퓨터에서 액세스 할 때 다운로드 옵션을 제공하지 않고 pdf 파일을 표시하지 않습니다. –

+0

임시 MemoryStream을 사용하는 수정 된 코드입니다. 아마도 Response.OutputStream은 검색을 지원하지 않습니다. 다시 시도하십시오. – alsed42

관련 문제