使用wkhtmltopdf和呈现javascript创建pdf
我正在尝试创建一个模型窗口中的javascript图表的PDF(我的图表是.aspx视图中javascript和css的组合)。呈现的PDF文件中唯一的内容是来自窗口的静态内容,而实际的javascript图表不在那里 我创建PDF的要求如下:使用wkhtmltopdf和呈现javascript创建pdf,javascript,asp.net,asp.net-mvc-3,extjs4,wkhtmltopdf,Javascript,Asp.net,Asp.net Mvc 3,Extjs4,Wkhtmltopdf,我正在尝试创建一个模型窗口中的javascript图表的PDF(我的图表是.aspx视图中javascript和css的组合)。呈现的PDF文件中唯一的内容是来自窗口的静态内容,而实际的javascript图表不在那里 我创建PDF的要求如下: public byte[] WKHtmlToPdf(string url) { var fileName = " - "; var wkhtmlDir = "C:\\Temp\\wkhtml"; v
public byte[] WKHtmlToPdf(string url)
{
var fileName = " - ";
var wkhtmlDir = "C:\\Temp\\wkhtml";
var wkhtml = "C:\\Temp\\wkhtml\\wkhtmltopdf.exe";
var p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = wkhtml;
p.StartInfo.WorkingDirectory = wkhtmlDir;
string switches = "";
switches += "--print-media-type ";
switches += "--margin-top 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm ";
switches += "--page-size Letter ";
p.StartInfo.Arguments = switches + " " + url + " " + fileName;
p.Start();
//read output
byte[] buffer = new byte[32768];
byte[] file;
using (var ms = new MemoryStream())
{
while (true)
{
int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
if (read <= 0)
{
break;
}
ms.Write(buffer, 0, read);
}
file = ms.ToArray();
}
// wait or exit
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
return returnCode == 0 ? file : null;
}
public byte[]WKHtmlToPdf(字符串url)
{
var fileName=“-”;
var wkhtmlDir=“C:\\Temp\\wkhtml”;
var wkhtml=“C:\\Temp\\wkhtml\\wkhtmltopf.exe”;
var p=新流程();
p、 StartInfo.CreateNoWindow=true;
p、 StartInfo.RedirectStandardOutput=true;
p、 StartInfo.RedirectStandardError=true;
p、 StartInfo.RedirectStandardInput=true;
p、 StartInfo.UseShellExecute=false;
p、 StartInfo.FileName=wkhtml;
p、 StartInfo.WorkingDirectory=wkhtmlDir;
字符串开关=”;
开关+=“--打印介质类型”;
开关+=“--上边距0毫米--下边距0毫米--右边距0毫米--左边距0毫米”;
开关+=“--页面大小字母”;
p、 StartInfo.Arguments=switches+“”+url+“”+fileName;
p、 Start();
//读取输出
字节[]缓冲区=新字节[32768];
字节[]文件;
使用(var ms=new MemoryStream())
{
while(true)
{
int read=p.StandardOutput.BaseStream.read(缓冲区,0,缓冲区,长度);
如果(read看起来您正在尝试获取图表的输出,根据标签判断,它来自ExtJS4脚本
ext脚本可能正在使用图表的一些动画,并且肯定会等待javascript事件执行并呈现图表。因此,在默认时间(200毫秒)完成之前,它可能尚未完成
快速修复方法是将javascript延迟页面选项添加到命令行:
wkhtmltopdfhttp://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript delay=2000 test.pdf
肯定会在*nix上运行,类似的事情也会在windows上运行。在我们的项目中,我们做了一些类似的事情,并取得了成功。目前我们将wkhtmltopdf 0.9.9与结合使用。通过jQuery flot,我们取得了成功在我们的项目中,我们首先将视图呈现为一个字符串,并使用它的stdin将其传递给wkhtml。然后我们捕获wkhtml的stdout并将其传递回浏览器
您的wkhtml设置似乎是正确的,但我们使用的是stdin和stdout。不知道这是否会成为问题
如果你使用这些图表中的一个,我想我可以帮助你。你使用的是什么图表
最后一点注意:当使用与端口80不同的端口号时,Wkhtmltopdf 0.10rc2似乎在从本地主机加载外部资源(js/css)时遇到一些问题。我使用的是Wkhtmltopdf 0.9.9和pdfkit ruby gem,并且存在类似的问题
我通过将所有标记更改为使用绝对url来修复此问题。wkhtmltopdf似乎不知道通过哪个url访问页面,因此没有加载相关资源。我不知道这是否是pdfkit或wkhtmltopdf的限制
我的想法来自。谢谢,好主意。不幸的是,这对我来说没有任何改变。我想这可能是图表显示的模型窗口,并且您的extjs假设是正确的。谢谢您的“最后一个注意事项”,我正在搜索如何修复它:)基本上,我打开了一个隐藏的浏览器窗口,禁用了动画,保存了一个图表的图像,然后创建了一个html字符串,里面的图像将呈现为PDF。你提到过将视图呈现为字符串吗?怎么做?我有一个javascript和动态趋势线图(来自highchart)渲染。但是图表本身并没有显示在pdf上。有什么提示吗?我遇到了这个问题,并通过确保使用wkhtmltopdf 0.9.9解决了它。“gem安装”版本(0.8.3)没有解决它。