我需要使用asp.net从html动态生成pdf。 HTML存储在数据库中。 HTML有表格和CSS,最多10页。我通过直接传递html尝试了iTextSharp
,它产生的pdf没有打开。目标pdf.codeplex.com
没有文档,它使用父页面中的样式生成PDF。
任何其他解决方案都会有所帮助。
答案 0 :(得分:0)
我尝试了很多HTML到PDF的解决方案,包括iTextSharp,wkhtmltopdf和ABCpdf(付费)
我目前已定居在PhantomJS无头,开源,基于WebKit的浏览器上。它可以用javascript API编写脚本,这个文档记录得很清楚。
我发现的唯一缺点是尝试使用stdin
将HTML传递到进程中是不成功的,因为REPL仍有一些错误。我还发现使用stdout
似乎比简单地允许进程写入磁盘慢得多。
下面的代码通过将javascript输入创建为临时文件,执行PhantomJS,将输出文件复制到stdin
并清除临时文件来避免stdout
和MemoryStream
。端。
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;
}