1

我需要打印 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();
}

欢迎任何帮助。谢谢。

4

3 回答 3

2

我无法从这个小例子中完全理解这个问题,但我的猜测是该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();

}

并在该方法中,使用下一个 PDF 文件pd_PrintPageHandler调用此函数。printPage

于 2011-07-04T19:17:12.620 回答
1

ProcessStartInfo 异步运行。所以你开始了 1 个或多个 acrobat32 exe,每个都需要时间来加载和运行它们的打印功能。与此同时,您的 PrintDocument 类正在运行它自己的一组打印程序......所以所有文档都以不可预测的顺序显示。

看到这个:异步进程开始并等待它完成

这个:http: //blogs.msdn.com/b/csharpfaq/archive/2004/06/01/146375.aspx

您需要启动 acrobat,等待它完成。然后启动您的 PrintDocument(无论是什么)并等待它完成。冲洗并重复。

PrintDocument 看起来也是异步的......由于事件处理程序调用,但这很难确定。

于 2011-07-04T19:25:42.203 回答
1

由于您正在使用外部进程来打印 PDF,因此等待该进程退出以保持打印操作同步可能会有所帮助。

即调用异步后:

process.Start();

添加一个调用以process.WaitForExit();保持一切正常运行。

您可能确实需要对 PrintDocument 执行相同的操作。在这种情况下,您应该能够阻塞线程,直到触发OnEndPrint事件: 示例

于 2011-07-04T19:26:43.263 回答