首页 > 解决方案 > 使用 Windows 窗体的 PrintDocument 直接将 WPF FlowDocument 保存为 PDF 文件

问题描述

我在 Windows 10 中使用 Microsoft Visual Studio 2017 和 Microsoft Print to PDF。

我尝试在没有 PrintDialog 的情况下制作 FlowDocument 的 PDF 文件,我知道这在纯 WPF 中是不可能的。所以我将 Windows 窗体的 system.drawing.printing.PrintDocument 引用到我的 WPF 项目中。

我被困在将 FlowDocument 转换为 PrintDocument 的问题上。

PrintDocument _PrintDocument = (PrintDocument)FlowDocument1;

IDocumentPaginatorSource _DocumentPaginatorSource = FlowDocument1;
PrintDocument _PrintDocument = FlowDocument1;

它们都不起作用。

通过使用代码分配文件夹和文件名来制作PDF是否有可能或有任何侧面?我一定要使用 3rd 方组件吗?

标签: c#wpfpdf

解决方案


如果您可以将默认打印机设置为 PDF 或 XPS,那么您可以使用此代码段。它将使用默认打印机,然后打印您想要的视觉效果。请记住,如果您需要与横向不同的方向,则应更改它。
编辑:
为了完整起见,您可以像这样搜索 PDF 打印的打印机队列:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Printing;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;

namespace Services.Printing
{
    public static class PrintingService
    {
        public static void Print(Visual elementToPrint, string description)
        {
            using (var printServer = new LocalPrintServer())
            {
                var dialog = new PrintDialog();
                //Find the PDF printer
                var qs = printServer.GetPrintQueues();
                var queue = qs.FirstOrDefault(q => q.Name.Contains("PDF"));
                if(queue == null) {/*handle what you want to do here (possibly use XPS?)*/}
                dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
                dialog.PrintQueue = queue;
                dialog.PrintVisual(elementToPrint, description);
            }
        }
    }
}

推荐阅读