我使用WkhtmlToImage将网页呈现给图像。当我从命令行运行它时,一切都很好。但是,当我从我的网络应用程序启动的进程中运行它时,它不会。
我已经确认我使用的参数是相同的。我能看到的唯一区别是,当我从命令行运行它时,我将文件保存到磁盘,当我从Web应用程序执行它时,我使用stdOut并返回字节数组。有谁知道为什么会这样?我正在使用11.0-rc2
//taken from the Rotativa library - https://github.com/webgio/Rotativa/
private static byte[] Convert(string wkhtmltopdfPath, string switches, string html)
{
// switches:
// "-q" - silent output, only errors - no progress messages
// " -" - switch output to stdout
// "- -" - switch input to stdin and output to stdout
switches = "-q " + switches + " -";
// generate PDF from given HTML string, not from URL
if (!string.IsNullOrEmpty(html))
{
switches += " -";
html = SpecialCharsEncode(html);
}
var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = Path.Combine(wkhtmltopdfPath, "wkhtmltoimage.exe"),
Arguments = switches,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
WorkingDirectory = wkhtmltopdfPath,
CreateNoWindow = true
}
};
proc.Start();
// generate PDF from given HTML string, not from URL
if (!string.IsNullOrEmpty(html))
{
using (var sIn = proc.StandardInput)
{
sIn.WriteLine(html);
}
}
var ms = new MemoryStream();
using (var sOut = proc.StandardOutput.BaseStream)
{
byte[] buffer = new byte[4096];
int read;
while ((read = sOut.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
string error = proc.StandardError.ReadToEnd();
if (ms.Length == 0)
{
throw new Exception(error);
}
proc.WaitForExit();
return ms.ToArray();
}
更新我发现在Windows中使用stdOut时,该库是一个已知问题。如果有人有任何想法我都是耳朵。
http://code.google.com/p/wkhtmltopdf/issues/detail?id=335&q=wkhtmltoimage%20stdout http://code.google.com/p/wkhtmltopdf/issues/detail?id=998&q=wkhtmltoimage%20stdout
答案 0 :(得分:3)
您最好使用wkhtmltoimage.exe
进程的I / O文件而不是I / O流:
public static byte[] Convert(string wkhtmltopdfPath, string switches, string html)
{
using (var tempFiles = new TempFileCollection())
{
var input = tempFiles.AddExtension("htm");
var output = tempFiles.AddExtension("jpg");
File.WriteAllText(input, html);
switches += string.Format(" -f jpeg {0} {1}", input, output);
var psi = new ProcessStartInfo(Path.Combine(wkhtmltopdfPath, "wkhtmltoimage.exe"))
{
UseShellExecute = false,
CreateNoWindow = true,
Arguments = switches
};
using (var process = Process.Start(psi))
{
process.WaitForExit((int)TimeSpan.FromSeconds(30).TotalMilliseconds);
}
return File.ReadAllBytes(output);
}
}
然后:
byte[] result = Convert(
@"c:\Program Files (x86)\wkhtmltopdf",
"",
File.ReadAllText("test.htm")
)