2013-07-10 2 views
0

abcpdf의 한 페이지 안에 html 중심을 배치하는 코드가 있습니다. 이것은 abcpdf를 만든 websupergoo 회사의 저에게 제공되었습니다. 그러나 내 응용 프로그램 풀이 계속 종료되고 성능 문제가 있다고 생각합니다. 나는 심지어 캐싱을 가능하게했다. 어쨌든이 코드를 최적화 할 수 있습니까? 근본적으로 무슨 일이 일어나고 있는가? 코드는 html 페이지를 호출하고 브라우저 크기를 설정하여 PDF 크기 내에 맞출 수 있도록 경계 치수를 계산합니다. 이렇게하면 html 페이지를 계속 호출 할 수 있지만 캐시 된 경우 실제 요청을하지는 않지만 캐시를 읽는다는 메시지가 나타납니다. 렌더링하는 데 약간의 시간이 걸리기 때문에 더 쉽게이 작업을 수행 할 수 있습니다. 이 문제는 abcpdf를 한 번에 사용하는 url에 대한 여러 요청이 발생할 때 발생합니다.센터 웹 사이트 ABCPDF의 한 페이지에

  using (var doc = new Doc()) 
      { 
       doc.HtmlOptions.Timeout = 60000; 
       doc.HtmlOptions.PageCacheEnabled = true; 
       doc.HtmlOptions.PageCacheExpiry = 600000; 

       doc.HtmlOptions.Engine = Engine; 
       doc.Rect.Inset(PageInsetHorizontal, PageInsetVertical); 
       doc.Color.String = "255, 255, 255"; 

       const double heightTolerance = 18; // in points, the max allowed space at the bottom 
       const int widthIncrement = 96; // in pixels, just an appropriate initial browser width increment 
       var tallWidth = 0; // the lower browser width 
       var wideWidth = 0; // the upper browser width 
       Debug.WriteLine("Adding Url: " + Url); 
       var id = doc.AddImageUrl(Url); 
       var scrollWidth = doc.GetInfoInt(id, "ScrollWidth"); 
       var contentWidth = doc.GetInfoInt(id, "ContentWidth"); 
       var toContentWidth = contentWidth - scrollWidth; 

       while (true) 
       { 
        var width = doc.GetInfoInt(id, "ContentWidth"); 
        var height = doc.GetInfoInt(id, "ContentHeight"); 

        Debug.WriteLine("Initial Content Width: " + width); 
        Debug.WriteLine("Initial Content Height: " + height); 

        var tooTall = false; 
        var docScrollWidth = doc.GetInfoInt(id, "ScrollWidth"); 

        Debug.WriteLine("Scroll Width: " + docScrollWidth); 

        if (docScrollWidth < scrollWidth) 
        { 
         scrollWidth = docScrollWidth; 
         contentWidth = scrollWidth + toContentWidth; 

         Debug.WriteLine("New Scroll Width: " + scrollWidth); 
         Debug.WriteLine("New Content Width: " + contentWidth); 
        } 

        Debug.WriteLine("Width: " + width); 

        if (width + 1 < contentWidth) 
        { 
         Debug.WriteLine("Too Tall: " + Url); 
         tooTall = true; 
        } 
        // assuming doc.Rect originally specifies the maximum bounding area 
        if (tooTall || doc.Rect.Width * height > doc.Rect.Height * width) 
        { 
         Debug.WriteLine("TOO TALL"); 
         Debug.WriteLine("Delete Html: " + id); 

         // too tall 
         doc.Delete(id); 

         Debug.WriteLine("Browser Width: " + doc.HtmlOptions.BrowserWidth); 

         if (doc.HtmlOptions.BrowserWidth == 0) 
         { 
          doc.HtmlOptions.BrowserWidth = Convert.ToInt32(height*doc.Rect.Width/doc.Rect.Height); 
          Debug.WriteLine("New BrowserWidth: " + doc.HtmlOptions.BrowserWidth); 
         } 
         else 
         { 
          tallWidth = doc.HtmlOptions.BrowserWidth; 

          Debug.WriteLine("Tall Width: " + tallWidth); 
          Debug.WriteLine("Wide Width: " + wideWidth); 

          if (wideWidth == 0) 
          { 
           doc.HtmlOptions.BrowserWidth = tallWidth + widthIncrement; 
           Debug.WriteLine("New Browser Width: " + doc.HtmlOptions.BrowserWidth); 
          } 
          else if (tallWidth + 1 < wideWidth) 
          { 
           doc.HtmlOptions.BrowserWidth = (tallWidth + wideWidth)/2; 
           Debug.WriteLine("New Browser Width: " + doc.HtmlOptions.BrowserWidth); 
          } 
          else 
          { 
           doc.HtmlOptions.BrowserWidth = wideWidth; 
           Debug.WriteLine("New Browser Width: " + doc.HtmlOptions.BrowserWidth); 
           Debug.WriteLine("Adding Url: " + Url); 
           Debug.WriteLine("Found Fit"); 
           doc.AddImageUrl(Url); 
           break; 
          } 
         } 
        } 
        else if (doc.Rect.Width * height < (doc.Rect.Height - heightTolerance) * width) 
        { 
         Debug.WriteLine("TOO WIDE"); 
         Debug.WriteLine("Browser Width: " + doc.HtmlOptions.BrowserWidth); 

         // too wide 
         if (doc.HtmlOptions.BrowserWidth == 0) 
         { 
          doc.HtmlOptions.BrowserWidth = Convert.ToInt32(height * doc.Rect.Width/doc.Rect.Height); 
          Debug.WriteLine("New Browser Width: " + doc.HtmlOptions.BrowserWidth); 
         } 
         else 
         { 
          wideWidth = doc.HtmlOptions.BrowserWidth; 

          Debug.WriteLine("Tall Width: " + tallWidth); 
          Debug.WriteLine("Wide Width: " + wideWidth); 

          if (tallWidth == 0) 
          { 
           doc.HtmlOptions.BrowserWidth = wideWidth >= 2 * widthIncrement ? wideWidth - widthIncrement : wideWidth/2; 
           Debug.WriteLine("New Browser Width: " + doc.HtmlOptions.BrowserWidth); 
          } 
          else if (tallWidth + 1 < wideWidth) 
          { 
           doc.HtmlOptions.BrowserWidth = (tallWidth + wideWidth)/2; 
           Debug.WriteLine("New Browser Width: " + doc.HtmlOptions.BrowserWidth); 
          } 
          else 
          { 
           Debug.WriteLine("Found Fit"); 

           break; 
          } 
         } 

         Debug.WriteLine("Delete Html: " + id); 

         doc.Delete(id); 
        } 
        else 
         break; 

        Debug.WriteLine("Adding Url: " + Url); 

        id = doc.AddImageUrl(Url); 
       } 

       using (var ms = new MemoryStream()) 
       { 
        doc.Save(ms); 
        if (ms.CanSeek) 
        { 
         ms.Seek(0, SeekOrigin.Begin); 
        } 
        return ms.GetBuffer(); 
       } 
      } 

답변

0

나는 다른 코드를 발견했는데, 나는이 코드를 수정했다.

using (var doc = new Doc()) 
{ 
    if(!EnableCache) 
    doc.HtmlOptions.PageCacheClear(); 

    if (MakeLandscape) 
    { 
     var w = doc.MediaBox.Width; 
     var h = doc.MediaBox.Height; 
     var l = doc.MediaBox.Left; 
     var b = doc.MediaBox.Bottom; 

     doc.Transform.Rotate(90, l, b); 
     doc.Transform.Translate(w, 0); 

     doc.Rect.Width = h; 
     doc.Rect.Height = w; 
    } 

    doc.HtmlOptions.Timeout = 60000; 
    doc.HtmlOptions.PageCacheEnabled = EnableCache; 
    doc.HtmlOptions.PageCacheExpiry = 600000; 

    doc.HtmlOptions.Engine = Engine; 
    doc.Rect.Inset(PageInsetHorizontal, PageInsetVertical); 
    doc.Color.String = "255, 255, 255"; 

    doc.HtmlOptions.Paged = false; 
    doc.HtmlOptions.BrowserWidth = (MakeLandscape ? PageWidth + PageInsetHorizontal : PageHeight + PageInsetVertical) * Convert.ToInt32(doc.Rect.Width/doc.Rect.Height); 

    var id = doc.AddImageUrl(Url); 

    if (MakeLandscape) 
    { 
     var scrollWidth = doc.GetInfoInt(id, "ScrollWidth"); 
     var contentWidth = doc.GetInfoInt(id, "ContentWidth"); 

     if (scrollWidth > contentWidth) 
     { 
     var scrollHeight = doc.GetInfoInt(id, "ScrollHeight"); 
     doc.Delete(id); 
     doc.HtmlOptions.BrowserWidth = Convert.ToInt32(scrollHeight * doc.Rect.Width/doc.Rect.Height); 

     id = doc.AddImageUrl(Url); 
     } 
    } 
    else 
    { 
     var scrollHeight = doc.GetInfoInt(id, "ScrollHeight"); 
     var contentHeight = doc.GetInfoInt(id, "ContentHeight"); 

     if (scrollHeight > contentHeight + (PageInsetVertical *2)) 
     { 
     var scrollWidth = doc.GetInfoInt(id, "ScrollWidth"); 
     doc.Delete(id); 
     doc.HtmlOptions.BrowserWidth = Convert.ToInt32(((double)scrollHeight/contentHeight) * scrollWidth); 
     id = doc.AddImageUrl(Url); 
     } 
    } 

    if (MakeLandscape) 
    { 
     doc.SetInfo(doc.GetInfoInt(doc.Root, "Pages"), "/Rotate", "90"); 
    } 

    using (var ms = new MemoryStream()) 
    { 
     doc.Save(ms); 
     if (ms.CanSeek) 
     { 
     ms.Seek(0, SeekOrigin.Begin); 
     } 
     return ms.GetBuffer(); 
    } 
    } 
+0

브라우저 너비를 동적으로 계산하는 것에 대해 알고 계신가요? 테이블 내용에 따라 다른 값을 설정해야합니다. – SivaRajini