Programmatically set filename and path in Microsoft Print to PDF printer

21,400

Solution 1

As noted in other answers, you can force PrinterSettings.PrintToFile = true, and set the PrinterSettings.PrintFileName, but then your user doesn't get the save as popup. My solution is to go ahead and show the Save As dialog myself, populating that with my "suggested" filename [in my case, a text file (.txt) which I change to .pdf], then set the PrintFileName to the result.

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();
    }
}

Solution 2

I did some experimenting myself but like yourself was also not able to prefill the SaveAs dialog in the PrintDialog with the DocumentName or PrinterSettings.PrintFileName already filled in the PrintDocument instance. This seems counterintuitive, so maybe I'm missing something

If you want to, you can however bypass the printdialog and print automatically without any user interaction at all. If you choose to do so, you must make sure beforehand that the directory to which you want to add a document to is in existence and that the document to be added is not in existence.

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();
 }
Share:
21,400
Admin
Author by

Admin

Updated on December 01, 2020

Comments

  • Admin
    Admin over 3 years

    I have a C# .net program that creates various documents. These documents should be stored in different locations and with different, clearly defined names.

    To do so, I use the System.Drawing.Printing.PrintDocument class. I select the Microsoft Print to PDF as printer with this statement:

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

    While doing so I'm able to print my document in a pdf file. The user gets a file select dialog. He can then specify in this dialog box the name of the pdf file and where to store it.

    As the amount of files are large and it is annoying and error-prone to find always the correct path and name, I would like to set the correct path and filename in this dialog box programmatically.

    I have already tested these attributes:

    PrintDocument.PrinterSettings.PrintFileName PrintDocument.DocumentName

    Writing the required path and filename to these attributes didn't help. Does anybody know, how to set the default values for path and filename for the Microsoft Print to PDF printer in C#?

    Note: My environment : Windows 10, Visual Studio 2010, .net framework 4.5