HTML从数据库到PDF

时间:2014-03-12 08:15:25

标签: html asp.net export-to-pdf

我需要使用asp.net从html动态生成pdf。 HTML存储在数据库中。 HTML有表格和CSS,最多10页。我通过直接传递html尝试了iTextSharp,它产生的pdf没有打开。目标pdf.codeplex.com没有文档,它使用父页面中的样式生成PDF。

任何其他解决方案都会有所帮助。

1 个答案:

答案 0 :(得分:0)

我尝试了很多HTML到PDF的解决方案,包括iTextSharp,wkhtmltopdf和ABCpdf(付费)

我目前已定居在PhantomJS无头,开源,基于WebKit的浏览器上。它可以用javascript API编写脚本,这个文档记录得很清楚。

我发现的唯一缺点是尝试使用stdin将HTML传递到进程中是不成功的,因为REPL仍有一些错误。我还发现使用stdout似乎比简单地允许进程写入磁盘慢得多。

下面的代码通过将javascript输入创建为临时文件,执行PhantomJS,将输出文件复制到stdin并清除临时文件来避免stdoutMemoryStream。端。

    using System.IO;
    using System.Drawing;
    using System.Diagnostics;

    public Stream HTMLtoPDF (string html, Size pageSize) {

        string path = "C:\\dev\\";
        string inputFileName = "tmp.js";
        string outputFileName = "tmp.pdf";

        StringBuilder input = new StringBuilder();

        input.Append("var page = require('webpage').create();");
        input.Append(String.Format("page.viewportSize = {{ width: {0}, height: {1} }};", pageSize.Width, pageSize.Height));
        input.Append("page.paperSize = { format: 'Letter', orientation: 'portrait', margin: '1cm' };");
        input.Append("page.onLoadFinished = function() {");
        input.Append(String.Format("page.render('{0}');", outputFileName));
        input.Append("phantom.exit();");
        input.Append("};");

        // html is being passed into a string literal so make sure any double quotes are properly escaped
        input.Append("page.content = \"" + html.Replace("\"", "\\\"") + "\";");

        File.WriteAllText(path + inputFileName, input.ToString());


        Process p;
        ProcessStartInfo psi = new ProcessStartInfo();

        psi.FileName = path + "phantomjs.exe";
        psi.Arguments = inputFileName;
        psi.WorkingDirectory = Path.GetDirectoryName(psi.FileName);
        psi.UseShellExecute = false;
        psi.CreateNoWindow = true;

        p = Process.Start(psi);
        p.WaitForExit(10000);


        Stream strOut = new MemoryStream();

        Stream fileStream = File.OpenRead(path + outputFileName);
        fileStream.CopyTo(strOut);
        fileStream.Close();

        strOut.Position = 0;

        File.Delete(path + inputFileName);
        File.Delete(path + outputFileName);

        return strOut;
    }