我一直在研究phantomJS,看起来它可能是一个使用生成PDF的好工具。我想知道是否有人成功地将它用于他们的.NET应用程序。
我的具体问题是:如何在服务器上使用rasterize.js等模块,接收请求并将生成的pdf作为响应发回。
我的一般问题是:在.NET应用程序中使用phantomJS是否有任何最佳实践。实现它的最佳方法是什么?
我在.NET World中相当新,我希望得到更详细的答案。感谢大家。 :)
答案 0 :(得分:13)
我不了解最佳做法,但是,我正在使用phantomJS,并且没有遇到以下代码的问题。
public ActionResult DownloadStatement(int id)
{
string serverPath = HttpContext.Server.MapPath("~/Phantomjs/");
string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf";
new Thread(new ParameterizedThreadStart(x =>
{
ExecuteCommand("cd " + serverPath + @" & phantomjs rasterize.js http://localhost:8080/filetopdf/" + id.ToString() + " " + filename + @" ""A4""");
})).Start();
var filePath = Path.Combine(HttpContext.Server.MapPath("~/Phantomjs/"), filename);
var stream = new MemoryStream();
byte[] bytes = DoWhile(filePath);
return File(bytes, "application/pdf", filename);
}
private void ExecuteCommand(string Command)
{
try
{
ProcessStartInfo ProcessInfo;
Process Process;
ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = false;
Process = Process.Start(ProcessInfo);
}
catch { }
}
public ViewResult FileToPDF(int id)
{
var viewModel = file.Get(id);
return View(viewModel);
}
private byte[] DoWhile(string filePath)
{
byte[] bytes = new byte[0];
bool fail = true;
while (fail)
{
try
{
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
}
fail = false;
}
catch
{
Thread.Sleep(1000);
}
}
System.IO.File.Delete(filePath);
return bytes;
}
以下是行动流程:
用户点击指向DownloadStatement Action
的链接。在其中,创建了一个新的Thread
来调用ExecuteCommand
方法。
ExecuteCommand
方法负责调用phantomJS。作为参数传递的字符串执行以下操作。
转到phantomJS应用程序所在的位置,然后使用URL,要创建的文件名和打印格式调用rasterize.js
。 (More about rasterize here)。
就我而言,我真正想要打印的是action
filetoupload传递的内容。这是一个简单的动作,返回一个简单的视图。 PhantomJS将调用作为参数传递的URL并完成所有魔法。
虽然phantomJS仍在创建文件,但(我猜)我无法返回客户端发出的请求。这就是我使用DoWhile
方法的原因。它将保留请求,直到文件由phantomJS创建并由应用程序加载到请求。
答案 1 :(得分:1)
如果您愿意使用NReco.PhantomJS(为PhantomJS提供.NET包装器),您可以非常简洁地执行此操作。
public async Task<ActionResult> DownloadPdf() {
var phantomJS = new PhantomJS();
try {
var temp = Path.Combine(Path.GetTempPath(),
Path.ChangeExtension(Path.GetRandomFileName(), "pdf")); //must end in .pdf
try {
await phantomJS.RunAsync(HttpContext.Server.MapPath("~/Scripts/rasterize.js"),
new[] { "https://www.google.com", temp });
return File(System.IO.File.ReadAllBytes(temp), "application/pdf");
}
finally {
System.IO.File.Delete(temp);
}
}
finally {
phantomJS.Abort();
}
}
答案 2 :(得分:0)
以下是一些使用Phantom.JS生成PDF的非常基本的代码,但您可以在此处找到更多信息:https://buttercms.com/blog/generating-pdfs-with-node
var webPage = require('webpage');
var page = webPage.create();
page.viewportSize = { width: 1920, height: 1080 };
page.open("http://www.google.com", function start(status) {
page.render('google_home.pdf, {format: 'pdf', quality: '100'});
phantom.exit();
});
答案 3 :(得分:-3)
var page = require('webpage').create();
page.open('http:/www.google.com', function () {
page.render('c:\test.pdf');
phantom.exit();
});