Microsoft Word Automation clients cannot set the duplex print flag before a print job starts in Microsoft Office Word. Although a parameter in the PrintOut method indicates that there is support for duplex printing, the parameter does not provide true duplex printing. To work around this limitation on Microsoft Windows systems, you must change the duplex flag for the active printer driver before the PrintOut function is called in Word.

This issue and it's workaround is described in KB828638 (http://support.microsoft.com/kb/828638). However the sample code on KB is in VB6 which developers find hard to convert to VB.Net or C#.

Attached with this blog post is a .Net solution with two projects (.Net Console applications), one for C# and another for VB.Net. Each project has a class "DuplexSettings” which expose methods to set (or get) duplex print flag.

 

Here is the sample code to use DuplexSettings class:

 

In C# (DuplexSettings.cs):

MyDuplexSettings.DuplexSettings ds = new MyDuplexSettings.DuplexSettings();
short status = 0;
string errorMessage = string.Empty;
status = ds.GetPrinterDuplex("<<Printer Name>>", out errorMessage);
if (status == 0)
{
//Console.WriteLine("Error occured. Error Message is : " + errorMessage);
//Some error occured, errorMessage is available in string errorMessage
}
else
{
//Console.WriteLine("Current Duplex Setting is : " & status);
//Call successfull, Current duplex flag is set to status
}

status = 2; //set duplex flag to 2
ds.SetPrinterDuplex("<<Printer Name>>", status, out errorMessage);
//Console.ReadKey();

 

 In VB.Net (DuplexSettings.vb):

 Dim ds As New MyDuplexSettings.DuplexSettings()
Dim status As Short
Dim errorMessage As String = String.Empty
status = False
status = ds.GetPrinterDuplex("<<Printer Name>>", errorMessage)
If (status = 0) Then
'Console.WriteLine("Error occured. Error Message is : " + errorMessage)
' Some error occured, errorMessage is available in string errorMessage
Else
'Console.WriteLine("Current Duplex Setting is : " & status)
'Call successfull, Current duplex flag is set to status
End If
status = 2 'set duplex flag to 2
status = ds.SetPrinterDuplex("<<Printer Name>>", status, errorMessage)
'Console.ReadKey()