zoukankan      html  css  js  c++  java
  • 调用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;
  • 相关阅读:
    Android之普通对话框
    Android之TelephonyManager类的使用案例
    Android之快捷方式一——通过应用程序创建快捷方式
    Android之手机电池电量应用
    Android之TelephonyManager类的方法详解
    Android之菜单二——上下文菜单
    jpa一对多映射案例
    Android之桌面组件App Widget初探
    Android之列表对话框
    Android之快捷方式二——向Launcher添加快捷方式
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/5664003.html
Copyright © 2011-2022 走看看