如何使用 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 链接

Office 2003 Office 2013 and later

示例中的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,我使用了这种方法。它提供了一个文件,但我无法打开它,因为 Adob​​e 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 实例?

win10安装子系统ubuntu附带图形化界面

Caliburn.Micro开发框架介绍 -- Windows phone

Return to viewmodel 禁用可执行命令 (Caliburn Micro - Windows Phone 8.1)