我使用Inkscape使用以下代码将图像从PDF转换为SVG:
internal static void ConvertImageWithInkscapeToLocation(string baseImagePath, string newImagePath, bool crop = true)
{
InkscapeAction(string.Format("-f \"{0}\" -l \"{1}\"", baseImagePath, newImagePath));
}
internal static void InkscapeAction(string inkscapeArgs)
{
Process inkscape = null;
try
{
ProcessStartInfo si = new ProcessStartInfo();
inkscape = new Process();
si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
si.FileName = inkscapePath; // the path to Inkscape.exe, defined elsewhere
si.Arguments = inkscapeArgs;
si.CreateNoWindow = true;
inkscape.StartInfo = si;
inkscape.Start();
}
finally
{
inkscape.WaitForExit();
}
}
这是一个相当直接的#34;启动应用程序的参数,等待关闭"设置好,效果很好;唯一的问题是在较慢的机器上,图像转换过程(可能是inkscape.WaitForExit()
)花费的时间太长,并显示此对话框消息:
点击"切换到..."弹出Windows开始菜单(我猜测因为我隐藏了这个过程); "重试"将一遍又一遍地重新发送消息,直到该过程结束。 是否可以完全压制消息框,并自动重试直到它通过?我可以在显示消息之前至少延长超时吗?
答案 0 :(得分:3)
有一些方法可以做到:
1-A脏的廉价方式是等待超时(WaitForExit(超时)),做一个DoEvents(我假设你是在主线程的winforms应用程序中做的),检查进程是否完成并循环直到它:
finally
{
while(!inkScape.HasExited)
{
inkscape.WaitForExit(500);
Application.DoEvents();
}
}
2 - 正确的方法是在另一个线程中执行,然后发出主程序的信号以继续
ThreadPool.QueueUserWorkItem((state) => { ConvertImageWithInkscapeToLocation... });
如果你在另一个线程中执行它,请记住CrossThreadException,不要从线程更新UI。