【发布时间】:2015-11-17 00:57:15
【问题描述】:
我正在制作一个程序,该程序在文件夹中查找受保护的 PDF,并使用 ImageMagick 将它们转换为 PNG 文件。下面是我的代码。
string WorkDir = @"C:\Users\rwong\Desktop\TestFiles";
Directory.SetCurrentDirectory(WorkDir);
String[] SubWorkDir = Directory.GetDirectories(WorkDir);
foreach (string subdir in SubWorkDir)
{
string[] filelist = Directory.GetFiles(subdir);
for(int f = 0; f < filelist.Length; f++)
{
if (filelist[f].ToLower().EndsWith(".pdf") || filelist[f].EndsWith(".PDF"))
{
PDFReader reader = new Pdfreader(filelist[f]);
bool PDFCheck = reader.IsOpenedWithFullPermissions;
reader.CLose();
if(PDFCheck)
{
//do nothing
}
else
{
string PNGPath = Path.ChangeExtension(filelistf], ".png");
string PDFfile = '"' + filelist[f] + '"';
string PNGfile = '"' + PNGPath + '"';
string arguments = string.Format("{0} {1}", PDFfile, PNGfile);
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files\ImageMagick-6.9.2-Q16\convert.exe");
startInfo.Arguments = arguments;
Process.Start(startInfo);
}
}
}
我已经在命令提示符下运行了原始命令并且它有效,所以命令不是问题。下面的示例命令
"C:\Program Files\ImageMagick-6.9.2-Q16\convert.exe" "C:\Users\rwong\Desktop\TestFiles\Test_File File_10.PDF" "C:\Users\rwong\Desktop\TestFiles\Test_File File_10.png"
我环顾四周,有迹象表明我的变量中的空格可能会导致问题,但大多数线程都在谈论硬编码参数名称,他们只谈论 1 个参数。我认为为每个变量添加双引号可以解决问题,但事实并非如此。我还读到使用 ProcessStartInfo 会有所帮助,但同样没有骰子。我猜这是我格式化 2 个参数的方式以及我如何调用命令,或者我使用 ProcessStartInto 错误。有什么想法吗?
编辑:基于下面的 cmets,我通过等待命令窗口退出进行了额外的测试,我发现了以下错误。
旁注:我还不想使用 GhostScript,因为我觉得我真的很接近使用 ImageMagick 的答案。
【问题讨论】:
-
到目前为止您检查了什么?您是否跳过了代码并验证了正确的变量内容?
-
什么是退出代码?你运行的那个exe有什么错误吗?如果您按照my answer here 中所示连接数据接收事件的事件,您可以捕获输出中的内容。
-
您看到的错误是什么?您是否在 C# 程序的 PATH 中安装了 Ghostscript,因为您的 PATH 可能与命令行中的 PATH 不同。
-
@TobiasKnauss 我到目前为止检查的是我传入的变量参数。我的
string arguments变量如下"\"C:\\Users\\rwong\\Desktop\\RoundPoint\\1000965275\\1000965275_157_Credit File_10.PDF\" \"C:\\Users\\rwong\\Desktop\\RoundPoint\\1000965275\\1000965275_157_Credit File_10.png\"" -
尝试不带参数启动进程以查看它是否正在运行。此外,为您的测试使用较短的路径和文件名,不带空格,例如 c:\temp\file.pdf。
标签: c# process imagemagick imagemagick-convert processstartinfo