这很可能是不容易的,但这里的情况:

我已经写了一个C#命令行程序:

  • 创建一个PDF使用ITextSharp
  • 写入磁盘
  • 使用 Acrord32.exe (这是Acrobat Reader)通过 System.Diagnostics.Process 在以默默的打印本产生PDF

如果我建立我的解决方案和双击 pdfGen.exe, 它的工作的预期。PDF是创造和印刷。

现在,我的应用程序已被部署在一个内部服务器与Windows Vista运行IIS7.这个服务器都有一些PHP网络应用程序的运行。以及它会被称为通过PHP使用 shell_exec() 因此,所得到的PDF格式将上印有打印机连接到服务器。

所以我PHP页看起来基本上是这样的:

shell_exec('/path/to/pdfGen.exe');

但在这里,事情出错。会发生什么情况是根据任务经理等。

  • pdfGen.exe 开始
  • PDF创建
  • Acrord32.exe 开始
  • pdfGen.exe 挂永远(而不PHP script)并没有什么是印刷

我很确定这是一些 权限相关的问题.我已经给了 IIS_IUSRS 访问默认打印机,并向目录 Acrord32.exe 是的位置。但仍然没有印刷。然而,如果我开始我的pdfGen.exe 手动它的工作。

任何想法什么我失踪了?

编辑:

我不能使用Acrobat Reader以打印的PDF。如果有另一个方式了 静静地 印创建PDF服务器端,我不会介意的。

有帮助吗?

解决方案 5

谢谢你的评论意见。不幸的是,这个"php开始printjob"的事情是一个更大的项目的一部分被取消,因为今天的,嗯...我不知道...政治原因。猜该项目是相当多的死亡。

无论如何,我试过我几次在最后的日子并不能得到它的工作与IIS。我的解决方案,我实施和测试已经:删除IIS,安装一个XAMPP或WAMPP包与当地apache and PHP运行 管理访问权.

这样做的诀窍。我用 pclose(popen('...command...', 'r')); 在PHP为了开始 .exe 所以,PHP不会等待直到PDF完成。它的所有工作很大。

这里是我的C#码开始的印刷作业使用Acrobat Reader

public void Print(string pathname, string acrobatDirectory)
{
    var proc = new Process
    {
        StartInfo =
        {
            Arguments               = String.Format("/t \"{0}\"", pathname),
            FileName                = acrobatDirectory,
            UseShellExecute         = false,
            CreateNoWindow          = true,
            RedirectStandardOutput  = false,
            RedirectStandardError   = false,
        }
    };

    proc.Start();  
}  

第一个论点是道路的文件,应该以印刷,第二个参数的绝对路径 AcroRd32.exe.

唯一的问题是左 AcroRd32.exe 是开始的、印刷的和永远不得再次关闭。因此,每printjob开始了一个新的实例 AcroRd32.exe (I am使用Acrobat Reader9.0).所以如果你打印了10次,10acrobat reader实例。

我所做的就是开始打印的工作,然后等待X秒钟,希望打印机是完成,然后杀死所有 AcroRd32.exe 实例:

public void Print(string pathname, string acrobatDirectory)
{
    Debug.WriteLine("Printing...");

    Printer.Print(pathname, acrobatDirectory);

    Thread.Sleep(30000);

    try
    {
        Debug.WriteLine("Trying to kill runnung AcroRd32.exe's ");

        FindAndKillProcess("AcroRd32");
    }
    catch (Exception)
    {
        Debug.WriteLine("AcroRd32.exe could not be killed...");
    }
}

private bool FindAndKillProcess(string name)
{
    foreach (Process clsProcess in Process.GetProcesses())
    {
        if (clsProcess.ProcessName.StartsWith(name))
        {
            clsProcess.Kill();
            return true;
        }
    }

    return false;
}

这个工作很好。


请注意,上述(杀死所有 AcroRd32.exe 和运行PHP与管理privilegs)是唯一可行的,因为: 整件事只是使用的一个用户在一段时间并具有非常有限的区域的使用.

它应该被用来触摸屏上的应用部署在客户POS。一个推销员会使用的PHP应用程序,以配置一个产品,然后PHP会叫我的.exe这将创建和打印PDF格式的背景。印刷文件,然后交给客户。 因此安全等。是不是一个真正的关注,在这种情况。


如果任何人有一个解决方案,以便利用它与IIS,我仍然愿意接受它作为一个答案。

其他提示

为了在检查什么,试图运行 的 过程监视器,从微软 和筛选的事件的adobe acrobat过程。你会看到的系统调的acrobat它会让你知道更多或更少的什么是错误的。

我知道一个小小的改进,以你的解决方案:自sumatrapdf有一个很好的命令行接口可用于自动关闭苏门答腊之后打印。

我用PHP"系统"或"执行"功能执行一批文件开自sumatrapdf:

sumatrapdf.exe -print-to-default -exit-on-print <path_to_PDF_file>

(你也可以指定的名字打印机打印)

这是一个有趣的节目。

IIS_IUSRS 似乎没有打印权限,尝试加入 IIS_IUSRS 印运营商组/授予许可打印的用户。

Shell_exec()几乎是用于壳的命令(ls/dir,cp,等等。) 你试图使用exec()而不是shell_exec()?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top