Wkhtmltopdf outputstream & download - diaglog

Is it possible to get the pdf stream created by wkhtmltopdf from any html file and open the download dialog in IE / Firefox / Chrome, etc.?

Currently, I am getting my output stream using 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(); 

With MemoryStreams created from a PDF file, this works fine, but here I get only a blank page. Bytearray has 1270 bytes.

+6
source share
1 answer

Is this still a problem?

I just created a new ASP.net website to test this on my computer after installing wkhtmltopdf 0.11.0 rc2, and it worked great on creating a PDF file. My version was a little different:

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(); 

Class my derp

 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); } } } 
+3
source

Source: https://habr.com/ru/post/892932/


All Articles