UWP生成PDF的最佳方法

3
我正在开发一个UWP应用程序,其中一个要求是需要动态生成PDF文件。
我需要考虑以下几个限制/要求:
- 需要能够直接从UWP应用程序中生成PDF/离线场景。 - 可能需要在服务器上生成报告 - 最好使用相同的源模板。 - 报告需要有一定的动态性(即不是编译到应用程序本身中,格式可编辑而无需重新编译应用程序)。 - 最好不依赖于闭源专有库/组件。
我有几个想法来解决这个问题:
1. 使用XAML页面,并通过打印该XAML视图作为PDF将其转换为PDF - 由于XAML需要编译到应用程序中,因此受到限制。可能无法使用相同的方法在服务器端生成报告。 2. 使用WebView和HTML进行类似的操作 - 但这将需要执行JavaScript逻辑,而我不确定在UWP应用程序中是否可能。
如果有人以前实现过类似的功能,那么你采取了什么方法?
1个回答

4

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

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

通过打印功能生成PDF可以很好地工作。但是对于您的要求“通过隐藏的打印对话框”,不可能隐藏打印UI以进行打印。

使用WebView和HTML进行类似操作

开源的jsPDF库可以帮助您通过JavaScript生成HTML到PDF。您可以通过WebViewInvokeScriptAsync获取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.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文件格式。这里是一个Windows Phone的文档,但你仍然可以参考。

如果我们还想在PDF中插入一个图像文件怎么办? - Muhammad Touseef
最终选择了Syncfusion组件。 - Nick Goloborodko
@SunteenWu 你的代码看起来很有潜力,但它在本地文件夹中创建了一个大小为0kbtest.pdf文件。我甚至在test.html文件中添加了许多测试内容,使其达到了8kb的大小。但生成的test.pdf文件仍然是空的(大小为0kb)。 - nam
我不知道支持是什么时候添加的,但是有一个PdfSharpCore Nuget包。对我来说,它可以正常工作,无需桥接应用程序。 - Ben Jasperson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接