C#调用第三方软件及交互

news/2024/9/21 22:34:00/文章来源:https://www.cnblogs.com/dx5800/p/18393167

C#调用第三方软件及交互

最近有一个功能pdf转epub,网上找到一个解决方案pdf2epubEX,Windows环境只能以docker方式安装,手动执行docker命令是可以的,如下图:

由于pdf数量过多,全部手动转肯定不行,想通过C#调用docker命令,但是这种方法会报错"the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winpty’
",网上查了一下是Windows和docker的交互有关系。后面选择了在Linux上面直接安装软件,然后用C#调用软件并且提供交互。
需要与软件进行交互要用异步,不然streamReader.ReadLine()当输出完以后,有交互的话会卡在这里,一开始这里也琢磨了好久,这也是为什么要写这篇文章的原因吧。

以下是相关代码:

static async Task Main(string[] args)
{string folderPath = Path.Combine("pdf");string[] pdfFiles = Directory.GetFiles(folderPath, "*.pdf");foreach (var item in pdfFiles){try{ProcessStartInfo startInfo = new ProcessStartInfo{FileName = "pdf2epubEX",Arguments = item,RedirectStandardInput = true,RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false,CreateNoWindow = true};var filename = Path.GetFileName(item);Console.WriteLine($"开始处理:{filename}");using (var process = new Process { StartInfo = startInfo }){process.Start();// 处理标准输出流var outputTask = ReadOutputAsync(process.StandardOutput);// 处理标准错误流var errorTask = ReadOutputAsync(process.StandardError);// 写入标准输入流await WriteInputAsync(process.StandardInput);// 等待进程完成await process.WaitForExitAsync();// 等待输出和错误任务完成await Task.WhenAll(outputTask, errorTask);}}catch (Exception ex){}finally{}}}static async Task WriteInputAsync(StreamWriter standardInput)
{using (var writer = standardInput){// 与软件进行交互, 这里可以发送多个输入await writer.WriteLineAsync("n");await writer.WriteLineAsync("svg");await writer.WriteLineAsync();//这里类似于直接敲回车,但是对于默认的参数不加这句好像也可以// 结束输入流writer.Close();}
}static async Task ReadOutputAsync(StreamReader reader)
{using (var streamReader = reader){string line;while ((line = await streamReader.ReadLineAsync()) != null){Console.WriteLine("Output: " + line);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791127.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Winform点击按钮Panle切换页面的实现

一、项目结构 二、主界面 Main.cs Panel Name: panel1 三、代码实现namespace 测试窗口切换 {public partial class Main : Form{// 先定义对应的私有字段private CmmPage _cmmPage;private TwoPage _twoPage;public Main(){InitializeComponent();}// 在主界面点击Load事件创建…

在Windows/Linus中安装Protobuf(转)

原文:https://blog.csdn.net/weixin_74531333/article/details/140469169 一、ProtoBuf 在 Window 下的安装 1、下载 ProtoBuf 编译器 下载地址:github.com 具体的下载根据自己电脑情况选择。 下载之后将压缩包解压到本地目录下。解压后的文件内包含 bin、include 文件,以及…

信息学奥赛初赛天天练-82-NOIP2014普及组-完善程序-机器语言、汇编语言、高级语言、计算机存储、二进制加法、IP地址、整数除法

1 NOIP 2014 普及组 基础题1 1 以下哪个是面向对象的高级语言( ) A 汇编语言 B C++ C Fortran D Basic 2 TB 代表的字节数是( ) A 2 的10 次方 B 2 的20 次方 C 2 的30 次方 D 2 的40 次方 3 二进制数 00100100 和 00010101 的和是( ) A 00101000 B 001…

线性整数规划建模精解

线性整数规划(Linear Integer Programming)是一种优化问题,它的目标是在满足一系列线性约束条件的情况下,最大化或最小化一个线性目标函数。整数规划(Integer Programming)是一类特殊的线性规划问题,其中某些或所有的决策变量必须取整数值。这种限制使得整数规划在某些情…

奥鹏教师教育网刷课脚本-JavaScript编写

脚本 学习网站:奥鹏教师教育网: http://www.ourteacher.com.cn/ 脚本地址:奥鹏教师教育网-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Ta…

【Kafka】binlog kafka并行消费提升小窍门

线上库存Process实例配置详情: 背景:1.业务是通过监听 上游mysql binlog完成的 2.binlog是通过 DDH kafka下发的 3.consumer消费 已经做到了 7ms的单条消息消费性能优化 4.怎样还能再提醒 消费方的消费速率呢? 5.当先consumer实例 蓝绿组共12个实例 2C2G (CPU2核,内存…

oracle 查看表空间

SELECT segment_name,segment_type,sum(bytes) / 1024 / 1024/ 1024 "GB"FROM dba_extentsWHERE segment_name = FABCAPABILITYBANKGROUP BY segment_name, segment_type;

antd-Vue 3.X版本 a-Checkbox 未回显的问题

1.3.X版本要求得value值的而类型为[string],如果是number则不会显示、 <a-form-item label=人员 name="person"><a-checkbox-group v-model:value="person":option="personList" /> </a-form-item>

Kettle 发送Http请求获取数据,并保存到db

布局图 Generate rows:设置请求参数 配置第一个接口(登录) - POST 往请求head中插入数据从响应的head中读取数据 对获取的数据进行处理 配置第二个接口(获取数据) - GET 从响应的结果中,反序列化数据 保存到DBReference: Kettle 连接 Oracle 使用手册 及 问题解决方案…

山财培训网刷课脚本-JavaScript编写

脚本 学习网站:山财培训网首页-会计培训专家: http://training.sdufe.edu.cn/ 脚本地址:山财培训网-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩…

svnhooks--给用户提交权限,实现单次提交

在上一篇文章说到,我们通过getuser的方法向服务器请求到svn配置文件有写权限的用户,下面我们需要把用户显示在前端文件中,简单列一下前端的核心显示代码,具体的css样式就不列出来了<div class="user-container" id="userList" {% if commitSwitch==…

内蒙古巴彦淖尔市事业单位工作人员在线培训网刷课脚本-JavaScript编写

脚本 学习网站:byne.chinahrt.cn 脚本地址:内蒙古巴彦淖尔市事业单位工作人员在线培训网-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Tam…