2012-04-24 3 views
6

можно ли получить поток pdf, созданный wkhtmltopdf из любого html-файла, и всплывающее диалоговое окно загрузки в IE/Firefox/Chrome и т. Д.?wkhtmltopdf outputstream & download - diaglog

На данный момент я получаю свой OutputStream этого кода:

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

Тогда я хочу, чтобы отобразить диалоговое окно:

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

С MemoryStreams созданного из файла PDF это работает хорошо, но здесь Я получаю только пустую страницу. Bytearray имеет 1270 байт.

+0

ли вы решить эту проблему? Помогло ли мое решение? – Nenotlep

ответ

3

Это еще проблема?

Я только что создал новый веб-сайт ASP.net, чтобы проверить это на своем компьютере после установки wkhtmltopdf 0.11.0 rc2, и он отлично работал над созданием PDF-файла. Моя версия немного отличалась;

В моем CSHTML я имел:

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 класс

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

Итак, если у вас возникли проблемы с выходом, вы можете проверить, как вы получаете исходный HTML-код в конвертер, если в нем есть какие-либо проблемы. – Nenotlep

+0

Что такое + "- -"; в конце ваших аргументов? –

+1

@Mvision Я связал это тупо, но это означает, что вместо файлов для ввода и вывода я буду использовать потоки в качестве ввода и вывода. Например, чтобы получить wkhtmltopdf для ввода его из STDIN вместо файла или URL-адреса и вывода в файл, вы должны использовать 'wkhtmltopdf.exe - output.pdf'. Аналогично использованию входного файла и вывода в STDOUT (или, может быть, stderr, не помните), вы должны использовать 'wkhtmltopdf.exe input.html -' – Nenotlep