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


    今天调查一个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:Temppdf11.pdf E:Temppdf222.pdf cat output E:Temppdf3.pdf " + "&exit");
                p.StandardInput.WriteLine(@"pdftk E:Temppdf11.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;
  • 相关阅读:
    iptables
    linux时间同步
    iftop使用
    linux目录结构及定时任务
    awk基本用法
    二、Java面向对象(6)_深入变量
    二、Java面向对象(5)_static修饰符
    二、Java面向对象(4)_构造函数
    二、Java面向对象(3)_类和对象
    二、Java面向对象(2)_软件开发方式
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/5664003.html
Copyright © 2020-2023  润新知