【问题标题】:UWP Generating a PDF - best approachUWP 生成 PDF - 最佳方法
【发布时间】:2017-08-03 23:59:54
【问题描述】:

我正在开发一个 UWP 应用,作为我需要动态生成 PDF 文件的要求之一。

我需要考虑一些限制/要求:

  • 需要能够从 UWP 应用直接/离线场景生成 PDF
  • 可能需要能够在服务器上生成报告 - 最好使用相同的源模板
  • 报告需要有点动态(即不编译到它自己的应用程序中,并且在不重新编译应用程序的情况下可编辑格式)
  • 理想情况下 - 不依赖于闭源专有库/组件

我对如何解决这个问题有几个想法:

  1. 拥有一个 XAML 页面并通过隐藏的打印对话框将该 XAML 视图打印为 PDF 将其转换为 PDF - 受限于需要将 XAML 编译到应用程序中 + 可能无法使用相同的方法在服务器端生成报告。
  2. 对 WebView 和 HTML 执行类似操作 - 但这需要执行 JavaScript 逻辑 - 我不确定在 UWP 应用中是否可以。

过去有没有人取得过类似的成就,如果有,您采取了什么方法?

【问题讨论】:

    标签: xaml pdf uwp


    【解决方案1】:

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

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

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

    用 WebView 和 HTML 做类似的事情

    开放的jsPDF 库可以帮助您通过JavaScript 生成HTML 到PDF。并且您可以通过InvokeScriptAsyncWebView 获取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文件格式。 Here 是windows phone 的文档,但您仍然可以参考。

    【讨论】:

    • 如果我们也想在该 pdf 中插入图像文件怎么办?
    • 最终选择了 Syncfusion 组件。
    • @SunteenWu 您的代码看起来很有希望,但它会在本地文件夹中创建大小为0kbtest.pdf。我什至在test.html 文件中添加了大量测试,使其大小为8kb。但是生成的test.pdf 文件仍然是空的(0kb 大小)。
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2011-07-31
    • 1970-01-01
    • 2011-05-18
    • 2013-09-26
    • 2011-04-20
    相关资源
    最近更新 更多