C# 使用Windows窗体的PrintDocument将WPF FlowDocument直接保存为PDF文件

C# 使用Windows窗体的PrintDocument将WPF FlowDocument直接保存为PDF文件,c#,wpf,pdf,C#,Wpf,Pdf,我在Windows 10中使用Microsoft Visual Studio 2017和Microsoft Print to PDF 我尝试在没有PrintDialog的情况下制作FlowDocument的PDF文件,我知道这在纯WPF中是不可能的。因此,我将Windows窗体的system.drawing.printing.PrintDocument引用到我的WPF项目中 我被困在将FlowDocument转换为PrintDocument的问题上 PrintDocument _PrintDoc

我在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?我确实应该使用第三方组件吗?

如果可以将默认打印机设置为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);
            }
        }
    }
}

在当前的Windows和WPF版本下,如果没有任何对话框,似乎没有直接保存PDF文件的方法。但我是通过PdfSharp.Xps找到答案的。它相当简单,文件的质量也得到了很好的保存


您可以通过Visual Studio的Nuget Package Manager轻松地使用它。

换句话说,您正在询问如何将流程文档打印为PDF。只要有PDF打印机驱动程序,就可以使用与打印到任何打印机相同的方式。你试过什么,什么不起作用?你能用真正的打印机打印吗?是否安装了PDF打印机驱动程序?如上所述,我希望通过打印机保存直接文件而不是物理文档。谢谢。这就是
打印到PDF
打印到文件
打印到XPS
所要做的<代码>打印文档是一个用于打印而不是生成files@PanagiotisKanavosPrintDocument通过PrinterSettings类生成文件。谢谢。因为这就是“打印到文件”的意思。它通过将输出发送到文件而不是实际打印机的打印机驱动程序来实现。如果您想获得问题的答案,则需要查找PDF打印机驱动器。此代码段打印到默认prinet,但不指定XPS。如果指定了相应的驱动程序,则可以使用它打印到PDF或XPS。如果可以将默认打印机设置为XPS,则可以使用它。您的代码调用PDF文件保存对话框,这不是我所要求的解决方案。谢谢。@SHINJaeGuk你试过Xamimax的代码吗
PrintVisual
@PanagiotisKanavos是的,我绝对做到了。对,它不调用PrintDialog,而是调用PDF文件保存对话框,该对话框询问文件名和文件夹。PrintDialog询问我选择哪种打印设备。PDF有两个对话框。谢谢