2017-08-03 95 views
0

我正在研究UWP應用程序,並將其作爲我需要動態生成PDF文件的一項要求。UWP生成PDF - 最佳方法

有一些約束上/我需要的海外商品會有要求:

  • 需要從UWP應用程序直接/離線情景
  • 生成PDF的能力的潛在需要生成的報告的能力服務器 - 最好是來自同一來源的模板
  • 報告需要有些動態的(即不是編譯到應用它的自我和格式編輯,沒有應用程式重新編譯)
  • 理想 - 不依賴於閉源propetiary庫/組件

我有幾個想法對如何處理這樣的:

  1. 有一個XAML頁面,並通過打印XAML視圖爲PDF通過一個隱藏的打印對話框將其轉換PDF - 通過限制事實上,需要將XAML編譯到應用程序+中,可能難以使用相同的方法在服務器端生成報告。
  2. 對WebView和HTML做類似的事情 - 但這需要執行JavaScript邏輯 - 並且我不確定在UWP應用程序中是否可行。

有沒有人在過去取得類似的成就,如果是的話 - 你採取了哪些方法?

回答

1

目前,在UWP中有很多用於生成PDF的第三方付費軟件包,例如SyncfusionXFinium。對於在UWP中不可用的免費圖書館,如PDFSharp。既然你不想付費,你可以考慮用免費庫創建經典應用程序,然後創建一個AppService來處理它。詳情請參考AppServiceBridgeSample

有一個XAML網頁和PDF通過打印

生成由printing功能的PDF可以很好地工作轉換。但是由於您的要求「通過隱藏的打印對話框」是不可能的,打印用戶界面無法隱藏打印。

不要用的WebView和HTML類似的東西

開放jsPDF庫可以幫助你的JavaScript生成HTML到PDF。您可以從WebView獲得InvokeScriptAsync返回的PDF結果。例如:

的JavaScript

<html> 
<head> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.4/jspdf.debug.js"></script> 
    <script type='text/javascript'> 
     function print() { 
      var doc = new jsPDF() 
      doc.text('Hello world!', 10, 10); 
      doc.circle(50, 50, 50); 
      var pdfresult = doc.output(); 
      document.getElementById('myDiv').innerText = pdfresult; 
      //doc.save('a4.pdf'); 
      return pdfresult; 
     } 
    </script> 
</head> 
<body> 
    <div id='myDiv'>Hello</div> 
</body> 
</html> 

的WebView

Webview.Navigate(new Uri("ms-appx-web:///Assets/test.html")); 
string pdfresult = await Webview.InvokeScriptAsync("eval", new string[] { "print()" }); 
StorageFile pdf = await ApplicationData.Current.LocalFolder.CreateFileAsync("test.pdf"); 
await FileIO.WriteTextAsync(pdf, pdfresult); 

畢竟,你可以考慮自己寫的PDF文件格式。 Here是Windows Phone的文檔,但您仍可參考。