Синхронизируйте печать PDF и стандартную печать - PullRequest
1 голос
/ 04 июля 2011

Мне нужно распечатать файл PDF, стандартную печать, другой файл PDF, другую стандартную печать и так далее. Но когда я отправляю на принтер листы смешиваются.

Я желаю:

   PDF
   PrintPage
   PDF
   PrintPage
   PDF
   PrintPage

но я получил (например):

   PDF
   PDF
   PrintPage
   PrintPage
   PrintPage
   PDF

Я использую следующий код для выполнения задачи:

while( ... ) {
    ProcessStartInfo starter = new ProcessStartInfo("path to acrobt32.exe", "/t mypdf001.pdf");
    starter.CreateNoWindow = true;
    starter.RedirectStandardOutput = true;
    starter.UseShellExecute = false;
    Process process = new Process();
    process.StartInfo = starter;
    process.Start();


    PrintDocument pd = new PrintDocument();
    pd.DocumentName = "Work";
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPageHandler);
    pd.Print();
}

Любая помощь будет приветствоваться. спасибо.

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

Я не могу полностью понять проблему из этого небольшого примера, но я предполагаю, что метод pd.Print() является асинхронным.

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

Быстрый пример, чтобы показать, что я имею в виду,

function printPage(pdfFilePath)
{
    ProcessStartInfo starter = new ProcessStartInfo("path to acrobt32.exe", pdfFilePath);
    starter.CreateNoWindow = true;
    starter.RedirectStandardOutput = true;
    starter.UseShellExecute = false;
    Process process = new Process();
    process.StartInfo = starter;
    process.Start();


    PrintDocument pd = new PrintDocument();
    pd.DocumentName = "Work";
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPageHandler);
    pd.Print();

}

и в методе pd_PrintPageHandler вызовите эту функцию printPage со следующим файлом PDF.

1 голос
/ 04 июля 2011

Поскольку вы используете внешний процесс для печати PDF-файлов, может помочь дождаться завершения этого процесса, чтобы синхронизировать операции печати. ​​

т.е. после вызова асинхронного:

process.Start();

Добавьте вызов к process.WaitForExit();, чтобы все работало в порядке.

Возможно, вам нужно сделать то же самое для PrintDocument.В этом случае вы сможете блокировать поток до тех пор, пока не будет запущено событие OnEndPrint : пример

1 голос
/ 04 июля 2011

ProcessStartInfo работает асинхронно.Таким образом, вы запускаете одну или несколько версий acrobat32, каждая из которых требует времени для загрузки и запуска своей функции печати.В то же время ваш класс PrintDocument выполняет собственный набор процедур печати ... Итак, все документы отображаются в непредсказуемом порядке.

См. Это: Асинхронный процесс запускается и ожидает егофиниш

и это: http://blogs.msdn.com/b/csharpfaq/archive/2004/06/01/146375.aspx

Вам нужно запустить акробат, дождаться его окончания.Затем запустите свой PrintDocument (что бы это ни было) и дождитесь его завершения.Ополаскивание и повторение.

PrintDocument также выглядит асинхронным ... из-за вызова обработчика событий, но точно сказать сложно.

...