wkhtmltopdf 输出到产生 0 字节文件的 html 响应

Posted

技术标签:

【中文标题】wkhtmltopdf 输出到产生 0 字节文件的 html 响应【英文标题】:wkhtmltopdf output to html response producing 0 byte file 【发布时间】:2014-10-21 20:47:23 【问题描述】:

我在我的服务器上使用 wkhtmltopdf.exe 将一些基于 .aspx 页面的报告转换为 pdf,然后下载到客户端计算机。经过广泛的研究,我发现这个blog post 有一个例子,似乎可以达到我想要完成的目标。我试图让它适应我自己的用途,但我无法让它工作。来自页面的响应是一个 .pdf 文件,但它的长度为 0 字节。我一直在研究将呈现的 aspx 页面转换为 .pdf 的解决方案近一天半,但没有运气 - 这个解决方案是我最接近的解决方案,我想我只是缺少一些简单的东西,它会起作用。

请查看下面的代码 - 如果您能提供任何指导来完成这项工作,我将不胜感激!

public partial class PDFOut : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        string args = string.Format("\"0\" - ", Request.Form["url"]);//'http://www.google.com' is what I'm passing for testing
        var startInfo = new ProcessStartInfo(Server.MapPath("\\tools\\wkhtmltopdf.exe"), args)
        
            UseShellExecute = false,
            RedirectStandardOutput = true
        ;
        var proc = new Process  StartInfo = startInfo ;
        proc.Start();

        string output = proc.StandardOutput.ReadToEnd();
        byte[] buffer = proc.StandardOutput.CurrentEncoding.GetBytes(output);
        proc.WaitForExit();
        proc.Close();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
        Response.BinaryWrite(buffer);
        Response.End();
    

【问题讨论】:

我从主提要中阅读了标题中的wkhtmltopdf,我确信它是垃圾邮件。 wkhtmltopdf?我们的名字真的用完了......:P 我一直让它将 PDF 写入临时目录。我不知道它会将pdf写入标准输出。您是否尝试过从实际命令行运行命令? 我不相信 wkhtmltopdf 有任何将结果文件输出到标准输出的示例。 wkhtmltopdf.org/usage/wkhtmltopdf.txt 不过我可能是错的。 【参考方案1】:

这样的东西对你有用吗?将PDF写入临时目录,然后读取PDF并最终删除临时文件?

protected void Page_Load(object sender, EventArgs e)
    
        string outputFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName(), ".pdf");
        string args = string.Format("\"0\" \"1\"", Request.Form["url"], outputFile );
        var startInfo = new ProcessStartInfo(Server.MapPath("\\tools\\wkhtmltopdf.exe"), args)
        
            UseShellExecute = false,
            RedirectStandardOutput = true
        ;
        var proc = new Process  StartInfo = startInfo ;
        proc.Start();

        proc.WaitForExit();
        proc.Close();

        var buffer= File.ReadAllBytes(outputFile);
        File.Delete(outputFile);

        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
        Response.BinaryWrite(buffer);
        Response.End();
    

【讨论】:

我不得不对放置临时文件的位置进行一些调整,否则它就像一个魅力!谢谢!!

以上是关于wkhtmltopdf 输出到产生 0 字节文件的 html 响应的主要内容,如果未能解决你的问题,请参考以下文章

更新后wkhtmltopdf字体大小增加

Base64 字符串编码的图像未加载到输出 PDF (TuesPechkin / Wkhtmltopdf)

wkhtmltopdf 内部链接

帮助安装 wkhtmltopdf 的静态二进制文件

wkhtmltopdf错误解决办法

linux下怎样产生一个指定大小的空文件