UWP生成PDF - 最佳方法

时间:2017-08-03 23:59:54

标签: xaml pdf uwp

我正在使用UWP应用程序,这是我动态生成PDF文件所需的一项要求。

我需要一些约束/要求来协调:

  • 需要能够直接/离线场景从UWP应用程序生成PDF
  • 可能需要能够在服务器上生成报告 - 最好是来自相同的源模板
  • 报告需要有些动态(即没有自行编译成应用程序并且可以编辑格式而无需重新编译应用程序)
  • 理想情况下 - 不依赖于封闭源的propetiary库/组件

关于如何处理这个问题我有几点想法:

  1. 拥有一个XAML页面,并通过隐藏的打印对话框将XAML视图打印为PDF,将其转换为PDF - 受XAML需要编译到应用程序+的限制,可能会使用相同的方法在服务器端生成报告。
  2. 使用WebView和HTML执行类似的操作 - 但这需要执行JavaScript逻辑 - 而且我不确定UWP应用程序是否可以使用。
  3. 过去有没有人取得类似的成绩?如果有的话 - 你采取了什么方法?

1 个答案:

答案 0 :(得分:2)

目前,有许多第三方付费软件包用于在UWP中生成PDF,例如SyncfusionXFinium。对于像PDFSharp这样在UWP中不可用的免费库。由于您不想要付费的,您可以考虑使用免费库创建经典应用程序,然后创建一个AppService来处理它。有关详细信息,请参阅AppServiceBridgeSample

  

拥有XAML页面并通过打印将其转换为PDF

通过printing功能生成PDF可以很好地工作。但是根据您的要求"通过隐藏的打印对话框"不可能,打印UI无法隐藏打印。

  

使用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>

web视图

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手机的文档,但您仍可以参考。