Xaml UWP生成PDF-best方法

Xaml UWP生成PDF-best方法,xaml,pdf,uwp,Xaml,Pdf,Uwp,我正在开发一个UWP应用程序,作为其中一个需求,我需要动态生成一个PDF文件 我需要澄清以下几个约束/要求: 需要能够直接/离线从UWP应用程序生成PDF 可能需要能够在服务器上生成报告-理想情况下是从同一源模板生成 报告需要具有一定的动态性(即,不编译到应用程序中,并且在不重新编译应用程序的情况下可编辑格式) 理想情况下-不依赖于封闭源属性库/组件 关于如何实现这一点,我有两个想法: 拥有一个XAML页面,并通过一个隐藏的打印对话框将该XAML视图打印为PDF格式,从而将其转换为PDF格式

我正在开发一个UWP应用程序,作为其中一个需求,我需要动态生成一个PDF文件

我需要澄清以下几个约束/要求:

  • 需要能够直接/离线从UWP应用程序生成PDF
  • 可能需要能够在服务器上生成报告-理想情况下是从同一源模板生成
  • 报告需要具有一定的动态性(即,不编译到应用程序中,并且在不重新编译应用程序的情况下可编辑格式)
  • 理想情况下-不依赖于封闭源属性库/组件
关于如何实现这一点,我有两个想法:

  • 拥有一个XAML页面,并通过一个隐藏的打印对话框将该XAML视图打印为PDF格式,从而将其转换为PDF格式-受限于需要将XAML编译到app+中的事实,使用相同的方法在服务器端生成报告可能是不可能的
  • 用WebView和HTML做一些类似的事情——但这需要执行JavaScript逻辑——我不确定UWP应用程序中是否可以这样做

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

    目前,有许多第三方付费软件包用于在UWP中生成PDF,例如和。像这样的免费库在UWP中是不可用的。既然你不想要付费的,你可以考虑用免费的库创建经典的应用程序,然后创建一个AppService来处理它。更多详情请参考

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

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

    对WebView和HTML执行类似的操作

    开放库可以帮助您通过JavaScript将HTML生成为PDF。您可以通过
    WebView
    获取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>
    

    毕竟,你可以考虑自己编写PDF文件格式。是windows phone的文档,但您仍可以引用

    如果我们还想在该pdf中插入一个图像文件,该怎么办?最终使用了Syncfusion组件。@Suntenwu您的代码似乎很有希望,但它在本地文件夹中创建了大小为
    0kb
    test.pdf
    。我甚至在
    test.html
    文件中添加了大量测试,使其大小为8kb。但是生成的
    test.pdf
    文件仍然是空的(
    0kb
    size)。
    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);