【问题标题】:HTML to PDF in a Windows universal app (UWP)Windows 通用应用 (UWP) 中的 HTML 到 PDF
【发布时间】:2016-12-24 21:02:48
【问题描述】:

是否可以在 UWP 应用中将 HTML 字符串转换为 PDF 文件? 我已经看到了可以在常规 .NET 应用程序中完成的许多不同方式(似乎有很多第三方库),但我还没有看到可以在 Universal/UWP 应用程序中完成它的方式。有谁知道怎么做?

如果没有纯代码解决方案,也许有一些方法可以连接到“Microsoft Print to PDF”选项?

或者是否有一种迂回的方法,比如在 C# UWP 应用程序中以某种方式使用 Javascript 和 https://github.com/MrRio/jsPDF?我不确定,抓着稻草……

编辑

我已将 Grace Feng - MSFT 提供的解决方案标记为正确,以证明可以通过使用打印对话框中的 Microsoft 打印到 PDF 选项将 HTML 转换为 PDF。谢谢

【问题讨论】:

    标签: c# pdf uwp


    【解决方案1】:

    如果没有纯代码解决方案,也许有一些方法可以连接到“Microsoft Print to PDF”选项?

    是的,但是使用这种方式,您需要首先在RichEditBoxTextBlock等控件中显示您的HTML字符串,只有UIElement可以是可打印的内容。

    您也可以自己创建 PDF 文件,这里是 PDF 中使用的基本语法:

    您可以使用BTET 来创建段落:

    这是 C# 中的示例:

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("BT"); // BT = begin text object, with text-units the same as userspace-units
    sb.AppendLine("/F0 40 Tf"); // Tf = start using the named font "F0" with size "40"
    sb.AppendLine("40 TL"); // TL = set line height to "40"
    sb.AppendLine("230.0 400.0 Td"); // Td = position text point at coordinates "230.0", "400.0"
    sb.AppendLine("(Hello World)'");
    sb.AppendLine("/F2 20 Tf");
    sb.AppendLine("20 TL");
    sb.AppendLine("0.0 0.2 1.0 rg"); // rg = set fill color to  RGB("0.0", "0.2", "1.0")
    sb.AppendLine("(This is StackOverflow)'");
    sb.AppendLine("ET");
    

    然后您可以创建一个 PDF 文件并将其保存到此文件中。但是由于您想将 HTML 转换为 PDF,这可能是一项艰巨的工作,我认为您不想这样做。

    或者是否有一种迂回的方法,比如在 C# UWP 应用程序中以某种方式使用 Javascript 和 https://github.com/MrRio/jsPDF?我不确定,抓着稻草……

    说实话,使用Libs或Web服务将HTML转换为PDF也是一种方法,有很多,我只是搜索了它们,但是我找不到任何可以在WinRT中免费使用的。所以我认为这里最实用的方法是第一个,连接到 Microsoft Print to PDF。具体可以查看官方Printing sample

    更新: 使用@Jerry Nixon - How do I print WebView content in a Windows Store App? 中的 MSFT 代码,这是一个很好的示例。我刚刚在WebViewNavigationCompleted 事件中添加了一些用于添加打印页面的代码:

    private async void webView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
    {
        MyWebViewRectangle.Fill = await GetWebViewBrush(webView);
        MyPrintPages.ItemsSource = await GetWebPages(webView, new Windows.Foundation.Size(842, 595));
    }
    

    然后在printDoc.AddPages += PrintDic_AddPages;事件中(printDoc是PrintDocument的实例):

    private void PrintDic_AddPages(object sender, AddPagesEventArgs e)
    {
        foreach (var item in MyPrintPages.Items)
        {
            var rect = item as Rectangle;
            printDoc.AddPage(rect);
        }
        printDoc.AddPagesComplete();
    }
    

    其他代码可以参考官方打印示例。

    【讨论】:

    • 嗨@Grace Feng - MSFT - 谢谢你的回复。感谢您的 PDF 语法。如果我无法让 Microsoft Print to PDF 选项正常工作,我可能不得不这样做。
    • @b85411,请查看我在答案末尾提供的官方示例,您可以获取HTML字符串并将该字符串写入TextBlock或其他一些控件并打印此控件。如果您在开发 PDF 打印机时遇到问题,可以发布您的代码。
    • 是否必须使用 TextBlock 之类的东西?到目前为止,我所做的是将 webview 转换为一系列 webviewbrushes(FrameworkElements 或更具体地说是Rectangles)。现在我基本上已经将解析后的 H​​TML 绘制到了一个 Rectangle 上,那么打印这些 Rectangle 有多难?我找到了您上周链接到的 Github 示例,并且一直在尝试对其进行调整……这一切都非常依赖于 RichTextBlockOverflow 之类的东西,这就是我遇到问题的地方。我不能每页只打印一个Rectangle 而不必担心溢出吗?谢谢
    • 不,使用TextBlock之类的东西不是必须的,如果我正确理解了您的方法,您将webview转换为画笔并用这些画笔填充Rectangle?我认为这也是可行的。而且使用这种方法应该没有溢出问题吧?很抱歉,我实际上对此不太确定,因为我没有尝试过这种方法,但我认为值得一试。
    • 是的,这是正确的。我倒下的地方是样本似乎非常依赖 RichTextBoxOverflow,目前还不清楚如何使用 Rectangles 来完成。例如 - github.com/Microsoft/Windows-universal-samples/blob/master/… 。谢谢
    猜你喜欢
    • 2017-08-31
    • 2016-01-24
    • 2018-02-04
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2016-01-28
    相关资源
    最近更新 更多