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();
}
}
브라우저 너비를 동적으로 계산하는 것에 대해 알고 계신가요? 테이블 내용에 따라 다른 값을 설정해야합니다. – SivaRajini