Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / WinForms

Printing a Word Document using Word Automation

4.43/5 (12 votes)
9 Jun 2007CPOL1 min read 1   3.1K  
Shows a simple way to print a Word document

Introduction

I began my journey down Word Automation and found good articles here. Unfortunately, I hit a big road block: I couldn't choose which printer to print to. I could only print to whichever printer was the ActivePrinter when the Word object was created. Everywhere I looked I was told that all you had to do was:

VB.NET
WordApp.ActivePrinter = "Printer name"

This didn't work for me, it would just hang. I believe that this is due to different versions, and some might have never had the problem I did, but if you're like me, then read on and you won't have to deal with all the headache I had. Hope it helps.

Background

Word Automation is simply being able to use another application within another. Sounds simple enough, but it can get ugly pretty fast and I have found very few resources for when you hit a problem.

Using the Code

Attached is a VB.NET project that allows you to print a specified Word document. The code is given here.

Make sure to add a reference to the Word Object Library found in the COM tab. (To add a reference, right-click on project and select Add Reference.)

Declare variables on show file and print dialogs to get user input:

VB.NET
Dim f As New OpenFileDialog
Dim p As New PrintDialog
Dim app As Word.Application
Dim doc As Word.Document

'Open file and print dialogs to get desired document and printer
If f.ShowDialog = Windows.Forms.DialogResult.OK Then
     If p.ShowDialog = Windows.Forms.DialogResult.OK Then

Create a Word application object:

VB.NET
'Create instance of Word Application
               app = New Word.Application

This is where you need to use the WordBasic property to set the active printer.

VB.NET
'Set Printer
 app.WordBasic.FilePrintSetup(Printer:=p.PrinterSettings.PrinterName, _
    DoNotSetAsSysDefault:=1) 

The rest of the code simply opens the document, prints it, and quits the Word application:

VB.NET
        'Set filename to object type
        Dim filename As Object = f.FileName
        Dim m As Object = System.Reflection.Missing.Value

        'Open document
        doc = app.Documents.Open(filename, m, m, m, m, m, m, m, m, m, m, m)

        'Print document
        app.PrintOut()

        'Close document
        app.Documents.Close()

        'Quit word application
        app.Quit()

        'Release 
        app = Nothing
    End If
End If 

The most important line in the above code is this:

VB.NET
'Set Printer
app.WordBasic.FilePrintSetup(Printer:=p.PrinterSettings.PrinterName, _
    DoNotSetAsSysDefault:=1) 

For those who need the above in C#, here it is:

C#
//Set Printer 
object wb = app.WordBasic;

//first arg is a printer name
object[] argValues = new object[] {p.PrinterSettings.PrinterName, 1}; 
String [] argNames = new String [] {"Printer","DoNotSetAsSysDefault"};

wb.GetType().InvokeMember("FilePrintSetup",BindingFlags.InvokeMethod,null, 
    wb,argValues,null,null,argNames);

I hope this helps people, because it really got me out of a bind.

History

  • 9th June, 2007: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)