c# - 使用 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 方组件吗?
解决方案
如果您可以将默认打印机设置为 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);
}
}
}
}
推荐阅读
- python - Python pytest-mock assert_has_calls
- javascript - 如何使用 Javascript 读取 HTML 元素的名称?
- java - 将 byte[] 转换为 MultipartFile
- python - 使用 pivot_table 拆分列
- excel - 从 Private Sub workbook_open() 上的输入声明公共变量
- javascript - 我可以在 nodejs 中模仿全局窗口对象吗?
- php - Laravel,Yajra Datatable,如果 y 那么如何返回 Yes else No
- python - 在多列上使用 GroupBy 创建新的滚动平均列
- asp.net - .NET HttpClient sendAsync() 特别是第二个请求超时
- java - 在 DoFn(apache crunch) 中传递一个映射(或并发哈希映射)