雁过请留痕...
代码改变世界

调用cmd.exe执行pdf的合并(pdftk.exe)

2016-07-12 16:31  xiashengwang  阅读(2271)  评论(0编辑  收藏  举报

今天调查一个pdf文件的抽取,合并功能,用到下面这个工具(pdftk):

https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

在cmd.exe里执行的很好,但在.net环境下,用程序调用就出问题,调用代码如下:

            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            //p.StandardInput.WriteLine(@"pdftk E:\Temp\pdf\11.pdf E:\Temp\pdf\222.pdf cat output E:\Temp\pdf\3.pdf " + "&exit");
            p.StandardInput.WriteLine(@"pdftk E:\Temp\pdf\11.pdf dump_data|findstr NumberOfPages " + "&exit");
            p.StandardInput.AutoFlush = true;

            string result = p.StandardOutput.ReadToEnd();
            MessageBox.Show("ExitCode:" + p.ExitCode + " result:" + result);
            p.WaitForExit(10000);

不管怎么调试,代码就卡在p.StandardOutput.ReadToEnd()这里,如果我的命令换成类似“ping 127.0.0.1 -n 5” 则可以通过,

ping.exe同样是外部程序,可以正常通过,但pdftk就不行,整了一天,终于解决了。

原来少了这一句:

p.StartInfo.RedirectStandardError = true;

按道理说,我们没有用到错误流,比如:p.StandardError.ReadToEnd(),可以不设置这个属性,但pdftk就是这么怪异,

推测可能是输出流里面使用了错误流?唉,原因就不再细找了,解决问题就好,一般情况下,最好将这三个属性一起设为true,买个教训吧。

            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;