以编程方式将Microsoft Print中的文件名和path设置为PDF打印机

我有一个C# .net程序来创build各种文档。 这些文件应存放在不同的地点,并有不同的,明确定义的名称。

为此,我使用System.Drawing.Printing.PrintDocument类。 使用以下语句selectMicrosoft Print to PDF作为打印机:

PrintDocument.PrinterSettings.PrinterName = "Microsoft Print to PDF" ;

虽然这样做,我可以打印我的文件在pdf file 。 用户得到一个文件select对话框。 然后,他可以在此对话框中指定pdf文件的名称和存储位置。

由于文件数量很大,而且总是find正确的path和名称,所以很烦人,容易出错,所以我想以编程的方式在这个对话框中设置正确的path和文件名。

我已经testing了这些属性:

PrintDocument.PrinterSettings.PrintFileName PrintDocument.DocumentName

将所需的path和文件名写入这些属性并没有帮助。 有谁知道,如何设置C#中Microsoft Print to PDF打印机的path和文件名的默认值?

注意:我的环境Windows 10,Visual Studio 2010,.net framework 4.5

正如在其他答案中指出的,你可以强制PrinterSettings.PrintToFile = true ,并设置PrinterSettings.PrintFileName ,但是那么你的用户不会弹出保存。 我的解决方案是继续前进,显示另存为对话框,填充我的“建议”文件名[在我的情况下,一个文本文件(.txt),我改变为.pdf],然后将PrintFileName设置为结果。

 DialogResult userResp = printDialog.ShowDialog(); if (userResp == DialogResult.OK) { if (printDialog.PrinterSettings.PrinterName == "Microsoft Print to PDF") { // force a reasonable filename string basename = Path.GetFileNameWithoutExtension(myFileName); string directory = Path.GetDirectoryName(myFileName); prtDoc.PrinterSettings.PrintToFile = true; // confirm the user wants to use that name SaveFileDialog pdfSaveDialog = new SaveFileDialog(); pdfSaveDialog.InitialDirectory = directory; pdfSaveDialog.FileName = basename + ".pdf"; pdfSaveDialog.Filter = "PDF File|*.pdf"; userResp = pdfSaveDialog.ShowDialog(); if (userResp != DialogResult.Cancel) prtDoc.PrinterSettings.PrintFileName = pdfSaveDialog.FileName; } if (userResp != DialogResult.Cancel) // in case they canceled the save as dialog { prtDoc.Print(); } } 

如果PrintToFile属性设置为true ,则似乎将忽略PrintFilename 。 如果PrintToFile设置为true并提供有效的文件名(完整路径),则用户选择文件名的filedialog将不会显示。

提示:设置打印机设置的打印机名称时,可以检查IsValid属性以检查打印机是否真实存在。 有关打印机设置和查找已安装打印机的更多信息, 请查看此帖

我自己做了一些实验,但是像你自己也不能预先填充PrintDialog中的SaveAs对话框,而PrintDocument实例中已经填充了DocumentName或PrinterSettings.PrintFileName。 这似乎违反直觉,所以也许我失去了一些东西

如果你愿意,你可以绕过打印对话框并自动打印,而不需要任何用户的交互。 如果您选择这样做,则必须事先确定要添加文档的目录存在,并且要添加的文档不存在。

 string existingPathName = @"C:\Users\UserName\Documents"; string notExistingFileName = @"C:\Users\UserName\Documents\TestPrinting1.pdf"; if (Directory.Exists(existingPathName) && !File.Exists(notExistingFileName)) { PrintDocument pdoc = new PrintDocument(); pdoc.PrinterSettings.PrinterName = "Microsoft Print to PDF"; pdoc.PrinterSettings.PrintFileName = notExistingFileName; pdoc.PrinterSettings.PrintToFile = true; pdoc.PrintPage += pdoc_PrintPage; pdoc.Print(); }