Печать документа Word с помощью NetOffice
Сейчас я перехожу к переводу службы на использование NetOffice вместо автоматизации MS Word, чтобы предотвратить несоответствие версий сборки Office при развертывании на системах с более ранней версией Office, чем в системе разработки.
Пока все сложилось хорошо.
Однако у меня возникли некоторые трудности с печатью документа Word. Это работало очень хорошо при автоматизации MS Word, но я получаю ошибки приведения в моем коде, когда я пытаюсь использовать NetOffice.
Вот пример кода того, что я делаю. (appWord является экземпляром NetOffice Word.Application)
object paramFilePath = full_path_to_document;
object falseValue = false;
object missing = Type.Missing;
object wb = appWord.WordBasic;
int copies = 1;
object[] argValues = null;
string[] argNames = null;
// the specific printer for the print job
argValues = new object[] { "printer_name", 1 };
// do not change the default printer
argNames = new String[] { "Printer", "DoNotSetAsSysDefault" };
Word.Document doc = appWord.Documents.Open(paramFilePath, missing, falseValue, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
wb.GetType().InvokeMember("FilePrintSetup", BindingFlags.InvokeMethod, null, wb, argValues, null, null, argNames);
for (int i = 0; i < copies; i++)
{
appWord.PrintOut();
Thread.Sleep(100);
}
Раньше это прекрасно работало с MS Word (за исключением того, что параметры для метода Documents.Open были ссылками), но теперь я получаю ошибку приведения к объекту строки wb = appWord.WordBasic;,
Может кто-нибудь сказать мне, как мне следует распечатать документ Word на определенном принтере (не меняя принтер по умолчанию), используя NetOffice, потому что я не смог перенести этот конкретный метод.
1 ответ
Существует проблема с получением WordBasic-объекта в NetOffice.
Этот C#-Code работает (NetOffice 1.6.0) для установки принтера без изменения системного принтера по умолчанию:
var dialog = appWord.Dialogs[WdWordDialog.wdDialogFilePrintSetup];
var argValues = new object[] { "printer_name" };
dialog.UnderlyingObject.GetType().InvokeMember("Printer", BindingFlags.SetProperty, null, dialog.UnderlyingObject, argValues);
argValues = new object[] { 1 };
dialog.UnderlyingObject.GetType().InvokeMember("DoNotSetAsSysDefault", BindingFlags.SetProperty, null, dialog.UnderlyingObject, argValues);
dialog.Execute();