让 Javascript 在以 ABC pdf 格式渲染 pdf 之前完成
Letting the Javascript finish before rendering pdf in ABC pdf
我正在尝试制作一个在谷歌地图上显示位置的网页的pdf。唯一的问题是,当ABCpdf渲染pdf时,Javascript还没有完全完成。这是不完整的。我怎样才能让 ABDpdf 等到 javascript 100% 完成,然后再渲染 pdf。这是我到目前为止尝试过的。
Doc theDoc = new Doc();
string theURL = url;
// Set HTML options
theDoc.HtmlOptions.AddLinks = true;
theDoc.HtmlOptions.UseScript = true;
theDoc.HtmlOptions.PageCacheEnabled = false;
//theDoc.HtmlOptions.Engine = EngineType.Gecko;
// JavaScript is used to extract all links from the page
theDoc.HtmlOptions.OnLoadScript = "var hrefCollection = document.all.tags('"a'");" +
"var allLinks = '"'";" +
"for(i = 0; i < hrefCollection.length; ++i) {" +
"if (i > 0)" +
" allLinks += '",'";" +
"allLinks += hrefCollection.item(i).href;" +
"};" +
"document.documentElement.abcpdf = allLinks;";
// Array of links - start with base URL
theDoc.HtmlOptions.OnLoadScript = "(function(){window.ABCpdf_go = false; setTimeout(function(){window.ABCpdf_go = true;}, 1000);})();";
ArrayList links = new ArrayList();
links.Add(theURL);
for (int i = 0; i < links.Count; i++)
{
// Stop if we render more than 20 pages
if (theDoc.PageCount > 20)
break;
// Add page
theDoc.Page = theDoc.AddPage();
int theID = theDoc.AddImageUrl(links[i] as string);
// Links from the rendered page
string allLinks = theDoc.HtmlOptions.GetScriptReturn(theID);
string[] newLinks = allLinks.Split(new char[] { ',' });
foreach (string link in newLinks)
{
// Check to see if we allready rendered this page
if (links.BinarySearch(link) < 0)
{
// Skip links inside the page
int pos = link.IndexOf("#");
if (!(pos > 0 && links.BinarySearch(link.Substring(0, pos)) >= 0))
{
if (link.StartsWith(theURL))
{
links.Add(link);
}
}
}
}
// Add other pages
while (true)
{
theDoc.FrameRect();
if (!theDoc.Chainable(theID))
break;
theDoc.Page = theDoc.AddPage();
theID = theDoc.AddImageToChain(theID);
}
}
// Link pages together
theDoc.HtmlOptions.LinkPages();
// Flatten all pages
for (int i = 1; i <= theDoc.PageCount; i++)
{
theDoc.PageNumber = i;
theDoc.Flatten();
}
byte[] theData = theDoc.GetData();
Response.Buffer = false; //new
Response.Clear();
//Response.ContentEncoding = Encoding.Default;
Response.ClearContent(); //new
Response.ClearHeaders(); //new
Response.ContentType = "application/pdf"; //new
Response.AddHeader("Content-Disposition", "attachment; filename=farts");
Response.AddHeader("content-length", theData.Length.ToString());
//Response.ContentType = "application/pdf";
Response.BinaryWrite(theData);
Response.End();
theDoc.Clear();
我有一个非常相似的问题(将谷歌可视化渲染为PDF),这是我用来部分解决它的技巧:
首先,你的 JavaScript 需要在 DOMContentLoaded
上而不是在 load
上执行(你很快就会明白为什么)。接下来创建一个空页面,该页面将通过计时器提供内容(您可以使用System.Threading.Thread.Sleep
使页面"等待"一定时间)。
然后在要呈现为 PDF 的页面上放置一个隐藏的图像,其中包含在生成 PDF 之前需要执行的 JavaScript。图像的"src"属性必须具有指向计时器页面的URL(在以下示例中,我通过查询字符串指定延迟(以毫秒为单位):
<img src="Timer.aspx?Delay=1000" style="width: 1px; height: 1px; visibility: hidden" />
请注意,我使用 visibility: hidden
而不是 display: none
来隐藏图像。原因是某些浏览器可能不会开始加载图像,直到它可见。
现在将发生的事情是,ABCpdf 将等到图像加载完毕,而您的 JavaScript 将已经在执行(因为DOMContentLoaded
在load
之前触发,直到加载所有图像)。
当然,你无法预测执行JavaScript到底需要多少时间。另一件事是,如果 ABCpdf 无法在 15 秒内加载页面(默认值,但我认为您可以更改它),它将引发异常,因此在选择延迟时要小心。
希望这有帮助。
就我而言,我们正在将 v8 升级到 v9 并生成网页的缩略图,该网页还需要大量的 javascript CSS 操作来进行对象定位。当我们切换到 v9 时,我们注意到对象是重复的(显示在它们的原始位置以及它们应该位于 js 之后的位置)。
我应用的解决方法是使用 RenderDelay 和 OneStageRender 属性将页面渲染处理方式更改为 PDF。500 是毫秒,所以 1/2 秒。更大的罪魁祸首似乎是OneStageRender。必须禁用此功能才能正确处理渲染。
doc.SetInfo(0, "RenderDelay", "500")
doc.SetInfo(0, "OneStageRender", 0)
尝试将脚本块转换为 JavaScript 函数,并从文件顶部的 document.ready()
函数调用该函数。 我假设你正在使用jQuery。ready()
函数将确保所有页面元素在其正文中调用任何函数之前都已稳定。
- 如何使用javascript或html下载PDF格式的填写表单
- 如何使用chart.js导出Excel和PDF格式的图表
- 使用window.print内容以pdf格式下载网页
- 提交了一个PDF格式的PHP脚本只适用于Adobe阅读器XI
- 如何发布到URL并打开一个新窗口以显示pdf格式的响应
- 如何在不强制的情况下添加条件文本?[101,pdf格式]
- 谷歌应用程序将电子邮件表单脚本转换为PDF格式,但希望清除一些单元格
- 下载pdf格式不正确
- 将ng-grid数据导出为angularjs中的CSV和PDF格式
- 让 Javascript 在以 ABC pdf 格式渲染 pdf 之前完成
- 只允许提交pdf格式/图片,而不是空白
- 将flot图表保存为图像或pdf格式
- 以PDF格式下载带有图像和图案的SVG
- 程序验证+以Acrobat PDF格式提交
- 是否可以将javascript添加到pdf格式的图像中
- 使用python或js以pdf格式下载带有动态css的html
- 下载图表和表格的PDF格式
- pdf格式的加载栏
- 以pdf格式下载D3图
- 当打印按钮被点击,它打印整个页面的pdf格式,包括导航栏和一切.如何打印只是报价