如何使用 Windows 10 附带的 Microsoft Print To PDF 打印机以编程方式打印到 PDF 文件而不提示 C# 中的文件名
Posted
技术标签:
【中文标题】如何使用 Windows 10 附带的 Microsoft Print To PDF 打印机以编程方式打印到 PDF 文件而不提示 C# 中的文件名【英文标题】:How to programmatically print to PDF file without prompting for filename in C# using the Microsoft Print To PDF printer that comes with Windows 10 【发布时间】:2015-11-01 00:47:43 【问题描述】:Microsoft Windows 10 附带 Microsoft Print To PDF 打印机,可以将内容打印到 PDF 文件。它会提示下载文件名。
如何从 C# 以编程方式控制它,以不提示输入 PDF 文件名,而是保存到我提供的某个文件夹中的特定文件名?
这用于以编程方式将大量文档或其他类型的文件打印到 PDF 的批处理。
【问题讨论】:
为您发布了一个可行的解决方案。让我知道你的想法:) 如果微软在他们的软件中开箱即用地提供这种选项(自动命名功能),这将是多么简单和巨大的帮助。 查看这个答案:***.com/a/58566537/1469494 【参考方案1】:您可以使用PrintOut
方法并指定第四个输出文件名参数来打印到Windows 10 PDF 打印机,如下例所示:
/// <summary>
/// Convert a file to PDF using office _Document object
/// </summary>
/// <param name="InputFile">Full path and filename with extension of the file you want to convert from</param>
/// <returns></returns>
public void PrintFile(string InputFile)
// convert input filename to new pdf name
object OutputFileName = Path.Combine(
Path.GetDirectoryName(InputFile),
Path.GetFileNameWithoutExtension(InputFile)+".pdf"
);
// Set an object so there is less typing for values not needed
object missing = System.Reflection.Missing.Value;
// `doc` is of type `_Document`
doc.PrintOut(
ref missing, // Background
ref missing, // Append
ref missing, // Range
OutputFileName, // OutputFileName
ref missing, // From
ref missing, // To
ref missing, // Item
ref missing, // Copies
ref missing, // Pages
ref missing, // PageType
ref missing, // PrintToFile
ref missing, // Collate
ref missing, // ActivePrinterMacGX
ref missing, // ManualDuplexPrint
ref missing, // PrintZoomColumn
ref missing, // PrintZoomRow
ref missing, // PrintZoomPaperWidth
ref missing, // PrintZoomPaperHeight
);
OutputFile
是您要转换的输入文档的完整路径字符串,而 doc 是常规文档对象。有关该文档的更多信息,请参阅_Document.PrintOut()
的以下 MSDN 链接
示例中的PrintOut
会导致静默打印,当您通过指定的inputFile
打印到OutputFileName
时,该OutputFileName
将被放置在与原始文档相同的文件夹中,但它将是PDF 格式带有.pdf
扩展名。
【讨论】:
问题中没有迹象表明发布者使用的是 Office 产品。 @KenWhite,我只是通过研究和原始链接发现了这一点。通过添加当前链接来更新它,并重新格式化一些代码,以便无需访问链接即可轻松理解。链接仅供参考。 @SanuelJackson:我没有对链接或您的编辑说任何话。我的观点是,整个答案都是基于 OP 使用 Word、Excel 或自动化的前提,而在问题中没有任何迹象表明这种情况。 @KenWhite - 是的,我注意到了。刚刚发布了一个解决方案来解决 OP 的问题,因为无论如何我都在该地区:)。无论如何都要清理它,因为答案中并不清楚它是针对非办公问题的办公解决方案。由于它仍然与 c# 相关,并且确实有效,因此感觉它可以保留,但需要一点爱来清理它并明确它是用于办公室的。 :) Microsoft.Office.Tools.Word.Document.PrintOut docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:要使用 Microsoft Print to PDF 打印机打印PrintDocument
对象而不提示输入文件名,这里是执行此操作的纯代码方法:
// generate a file name as the current date/time in unix timestamp format
string file = (DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds.ToString();
// the directory to store the output.
string directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
// initialize PrintDocument object
PrintDocument doc = new PrintDocument()
PrinterSettings = new PrinterSettings()
// set the printer to 'Microsoft Print to PDF'
PrinterName = "Microsoft Print to PDF",
// tell the object this document will print to file
PrintToFile = true,
// set the filename to whatever you like (full path)
PrintFileName = Path.Combine(directory, file + ".pdf"),
;
doc.Print();
您也可以将此方法用于其他另存为文件类型的打印机,例如Microsoft XPS打印机
【讨论】:
如何通过 Microsoft Print To PDF 使用它重新打印现有的 PDF,例如在 PDF 中“烘焙”注释? @AndrewTruckle - 原理是一样的。选择 PDF 虚拟打印机,然后正常打印到它,尽管我想在 C++ 中可能有更好的方法来完成相同的任务。虽然上面的代码有效,但我确实觉得它相当慢。 @KraangPrime,我使用了这种方法。它提供了一个文件,但我无法打开它,因为 Adobe Reader 说文件已损坏。但是如果我不使用PrinterSettings,那么它会弹出浏览目标位置和文件名,然后我可以访问该文件。我错过了什么吗..? 这里输入的文件在哪里?除非我们订阅PrintPage
事件并在那里进行图形操作,否则这不起作用,至少对我来说这似乎非常复杂。也许我只是错过了什么?
打印一个空文件?我没有看到您在文件中添加任何内容的位置。以上是关于如何使用 Windows 10 附带的 Microsoft Print To PDF 打印机以编程方式打印到 PDF 文件而不提示 C# 中的文件名的主要内容,如果未能解决你的问题,请参考以下文章
如何从自定义 shell 使用 GitHub for Windows 附带的 posh-git?
如何让Coldfusion 10在Windows 10中与IIS 10一起使用
如何创建 PostgreSQL db-f1-micro 实例?
Caliburn.Micro开发框架介绍 -- Windows phone
Return to viewmodel 禁用可执行命令 (Caliburn Micro - Windows Phone 8.1)