问题描述
是有可能从任何HTML文件中获取由wkhtmltopdf创建的PDF流和IE /火狐/铬等弹出一个下载对话框。
is it possible to get a pdf stream created by wkhtmltopdf from any html file and popup a download dialog in IE/Firefox/Chrome etc.?
目前我通过这段代码让我的OutputStream:
At the moment I get my outputstream by this code:
public class Printer
{
public static MemoryStream GeneratePdf(StreamReader Html, MemoryStream pdf, Size pageSize)
{
Process p;
StreamWriter stdin;
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\PROGRA~1\WKHTML~1\wkhtmltopdf.exe";
// run the conversion utility
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
// note that we tell wkhtmltopdf to be quiet and not run scripts
psi.Arguments = "-q -n --disable-smart-shrinking " + (pageSize.IsEmpty ? "" : "--page-width " + pageSize.Width + "mm --page-height " + pageSize.Height + "mm") + " - -";
p = Process.Start(psi);
try
{
stdin = p.StandardInput;
stdin.AutoFlush = true;
stdin.Write(Html.ReadToEnd());
stdin.Dispose();
CopyStream(p.StandardOutput.BaseStream, pdf);
p.StandardOutput.Close();
pdf.Position = 0;
p.WaitForExit(10000);
return pdf;
}
catch
{
return null;
}
finally
{
p.Dispose();
}
}
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
}
然后我想显示对话框:
Then I want to display the dialog:
MemoryStream PDF = Printer.GeneratePdf(Rd, PDFStream, Size);
byte[] byteArray1 = PDF.ToArray();
PDF.Flush();
PDF.Close();
Response.BufferOutput = true;
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=Test.pdf");
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(byteArray1);
Response.End();
通过从PDF文件这工作正常创建MemoryStreams,但在这里我只得到一个空白页。从ByteArray有1270字节。
With MemoryStreams created from a PDF file this works fine, but here I only get an empty page. The bytearray has 1270 Bytes.
推荐答案
这仍然是一个问题吗?
我刚刚创建了一个新的ASP.net网站上安装wkhtmltopdf 0.11.0 RC2之后测试此我的电脑上,它工作得很好创建PDF。我的版本只是略有不同;
I just created a new ASP.net website to test this on my computer after installing wkhtmltopdf 0.11.0 rc2 and it worked fine creating the PDF. My version was only slightly different;
在我CSHTML我有:
In my CSHTML I had:
MemoryStream PDFStream = new MemoryStream();
MemoryStream PDF = Derp.GeneratePdf(PDFStream);
byte[] byteArray1 = PDF.ToArray();
PDF.Flush();
PDF.Close();
Response.BufferOutput = true;
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=Test.pdf");
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(byteArray1);
Response.End();
我DERP类
My Derp class
public class Derp
{
public static MemoryStream GeneratePdf(MemoryStream pdf)
{
using (StreamReader Html = new StreamReader(@"Z:\HTMLPage.htm"))
{
Process p;
StreamWriter stdin;
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\wkhtmltopdf\wkhtmltopdf.exe";
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.Arguments = "-q -n --disable-smart-shrinking " + " - -";
p = Process.Start(psi);
try
{
stdin = p.StandardInput;
stdin.AutoFlush = true;
stdin.Write(Html.ReadToEnd());
stdin.Dispose();
CopyStream(p.StandardOutput.BaseStream, pdf);
p.StandardOutput.Close();
pdf.Position = 0;
p.WaitForExit(10000);
return pdf;
}
catch
{
return null;
}
finally
{
p.Dispose();
}
}
}
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
}
这篇关于wkhtmltopdf的OutputStream&安培;下载 - diaglog的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!