При использовании виртуального принтера, как я могу проверить, что печать закончена? - PullRequest
2 голосов
/ 12 октября 2010

Я использую виртуальный принтер для печати текстового документа в файл изображения в программе на C #.Пока все идет хорошо, за исключением того, что я не знаю, когда закончится процесс печати, чтобы я мог прочитать содержимое сгенерированного изображения.Вот мой код:

using System;
using Microsoft.Office.Interop.Word;
using Word=Microsoft.Office.Interop.Word;

var app = new ApplicationClass();
object filename = "C:\\ad.doc";
var missing = Type.Missing;
var doc = app.Documents.Open(ref filename, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
var oldPrinter = app.ActivePrinter;
app.ActivePrinter = "Name of printer";
object outputFileName = "c:\\ad.tif";
object trueValue = true;
object falseValue = false;

doc.PrintOut(ref trueValue, ref falseValue, ref missing, ref outputFileName, ref missing, ref missing,
                             ref missing, ref missing, ref missing, ref missing, ref trueValue, ref missing, ref missing,
                             ref missing, ref missing, ref missing, ref missing, ref missing);


app.ActivePrinter=oldPrinter ;                
doc.Close(ref missing, ref missing, ref missing);
app.Quit(ref missing, ref missing, ref missing);

Тогда как я могу быть уверен, что обработка печати завершена, чтобы я мог продолжить и получить содержимое изображения?

1 Ответ

2 голосов
/ 17 октября 2010

К сожалению, единственный способ проверить состояние печати в слове - это одна из двух вещей.

  1. Печатайте синхронно. Не очень хорошо, потому что он может повесить тебя до завершения печати. ​​
  2. Распечатайте документ асинхронно, а затем проверьте Свойство APPLICATION.BACKGROUNDPRINTINGSTATUS в цикле или на фоновый рабочий поток непрерывно, пока не станет 0 (больше не печать) или вы нажали на тайм-аут

Как-то так ...

        Do Until _Doc.Application.BackgroundPrintingStatus = 0
            System.Windows.Forms.Application.DoEvents()
            System.Threading.Thread.Sleep(750)
        Loop

Не идеально, но работает.

Обратите внимание, что об этом вам сообщат только тогда, когда он закончит буферизацию из слова. Если вы говорите о том, когда на самом деле завершена печать документа на принтере, это совсем другая проблема. Вам понадобится идентификатор задания на печать и запросить информацию из диспетчера очереди печати, с чем я не мог вам помочь.

...