を例を見ることができます。ここで
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
へのリンクをクリックします。その内部にはExecuteCommand
メソッドを呼び出すための新しいThread
が作成されています。
ExecuteCommand
メソッドは、phantomJSを呼び出す責任があります。引数として渡される文字列は次のようになります。
phantomJSアプリがある場所に移動し、その後、URL、作成するファイル名、および印刷書式でrasterize.js
を呼び出します。 (More about rasterize here)。
私が実際に印刷したいのは、action
ファイルのアップロードによって配信されるコンテンツです。これはシンプルな操作で、簡単なビューを返します。 PhantomJSはパラメータとして渡されたURLを呼び出し、すべての魔法を実行します。
phantomJSは依然としてファイルを作成していますが(私は推測しますが)、クライアントからの要求は返せません。それが私がDoWhile
メソッドを使用した理由です。これは、ファイルがphantomJSによって作成され、アプリケーションによって要求にロードされるまで要求を保持します。
ありがとうフェリペ。これは素晴らしい。 – Balash
do whileループの代わりにProcess.WaitForExitを使用できます。 http://msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx –
アプリケーションがWindows Server 2008以降のIISで実行されている場合、これは機能しません。このソリューションは、Visual Studioからテストするときに機能しますが、IISにデプロイされたときは本番環境では動作しません。http://stackoverflow.com/a/5308011/1062224 –