2011-08-04 82 views
9

我試圖創建一個我在模型窗口(我的圖表是javascript和css在.aspx視圖中的組合)的javascript圖表的PDF。呈現的PDF文件中唯一的東西是來自窗口的靜態內容,實際的javascript圖表不在那裏。用wkhtmltopdf創建pdf並呈現javascript

我呼籲創建PDF如下:

public byte[] WKHtmlToPdf(string url) 
    { 
     var fileName = " - "; 
     var wkhtmlDir = "C:\\Temp\\wkhtml"; 
     var wkhtml = "C:\\Temp\\wkhtml\\wkhtmltopdf.exe"; 
     var p = new Process(); 

     p.StartInfo.CreateNoWindow = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = wkhtml; 
     p.StartInfo.WorkingDirectory = wkhtmlDir; 

     string switches = ""; 
     switches += "--print-media-type "; 
     switches += "--margin-top 0mm --margin-bottom 0mm --margin-right 0mm --margin-left 0mm "; 
     switches += "--page-size Letter "; 
     p.StartInfo.Arguments = switches + " " + url + " " + fileName; 
     p.Start(); 

     //read output 
     byte[] buffer = new byte[32768]; 
     byte[] file; 
     using (var ms = new MemoryStream()) 
     { 
      while (true) 
      { 
       int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length); 

       if (read <= 0) 
       { 
        break; 
       } 
       ms.Write(buffer, 0, read); 
      } 
      file = ms.ToArray(); 
     } 

     // wait or exit 
     p.WaitForExit(60000); 

     // read the exit code, close process 
     int returnCode = p.ExitCode; 
     p.Close(); 

     return returnCode == 0 ? file : null; 
    } 

對我怎麼能搶的JavaScript圖表任何想法? .Net版本可能更合適,或者我必須將生成的頁面保存到文件並將其傳遞到工具中。

謝謝。

+0

我有這個問題,並確保我使用wkhtmltopdf 0.9.9修復它。 「寶石安裝」版本(0.8.3)並沒有削減它。 – dfrankow

回答

9

在我們的項目中,我們做了一些相似的事情,並取得了成功。目前我們使用wkhtmltopdf 0.9.9和Highcharts。使用jQuery flot,我們在調整一下之後也獲得了成功。在我們的項目中,我們首先將視圖渲染爲一個字符串,並使用stdin將其傳遞給wkhtml。然後,我們捕獲wkhtml的stdout並將其傳遞迴瀏覽器。

您的wkhtml設置似乎是正確的,除了我們使用stdin和stdout。不知道這是否會成爲問題。

如果您使用其中一個圖表,我想我可以幫助您。你使用什麼圖表?

最後一個音符:Wkhtmltopdf 0.10rc2似乎有一些問題,利用端口不同端口號時加載外部資源,從本地主機(JS/CSS)80.

+0

感謝你「最後一個筆記」,我正在搜索如何修復它:) – AgelessEssence

+1

得到它的工作,基本上我打開了一個隱藏的瀏覽器窗口禁用動畫,保存圖表的圖像,然後創建一個圖像的HTML字符串內部呈現爲PDF。 –

+0

你已經提到過把視圖渲染到字符串?怎麼做?我有一個JavaScript和動態趨勢線圖(來自高圖)呈現。但圖表本身並未在pdf上顯示。任何指針? – Dhamayanthi

6

它看起來像你試圖得到一個圖表的輸出,由標籤判斷是從一個Extjs 4腳本。

ext腳本可能使用了一些圖表的動畫,並且肯定會等待javascript事件執行並呈現圖表。這可能因此在默認時間(200毫秒)完成時沒有完成。

速戰速決將是JavaScript的延遲頁面選項添加到命令行:

wkhtmltopdf http://dev.sencha.com/deploy/ext-4.0.2a/examples/charts/Mixed.html --javascript-delay=2000 test.pdf肯定會在* nix工作,類似的事情應該工作在Windows上。

+0

謝謝,好主意。不幸的是,它不會改變我的任何東西。我想這可能是圖表顯示的模型窗口,你的extjs假設是正確的。 –

1

我用wkhtmltopdf 0.9.9和pdfkit紅寶石寶石,並有類似的問題。

我修改了所有標籤以使用絕對地址。看起來wkhtmltopdf不知道該頁面是通過哪個url訪問的,所以相關的資源沒有被加載。我不知道這是pdfkit還是wkhtmltopdf的限制。

我從https://github.com/mileszs/wicked_pdf得到了主意。