Ghostscript是一个开源的软件,用于处理PDF和PostScript文件。在Windows系统中,Ghostscript通常以gswin32c.exe的形式存在,并且需要正确安装才能使用。本文将介绍如何在Windows系统中找到Ghostscript的安装路径,并使用它来打印PDF文件。
为了使用Ghostscript打印PDF文件,首先需要确定Ghostscript程序的安装路径。这可以通过查询Windows注册表来实现。注册表中包含了程序的安装信息,包括Ghostscript的路径。
注册表键池是一个包含Ghostscript安装路径可能性的列表。这个列表将用于查询注册表,以找到Ghostscript的确切位置。
private static void createRegistrationKey()
{
RegistrationKey = new List>();
RegistrationKey.Add(new Tuple("Ghost", @"SOFTWARE\GPL Ghostscript"));
RegistrationKey.Add(new Tuple("Ghost", @"SOFTWARE\AFPL Ghostscript"));
}
使用注册表键池中的数据,程序将检查注册表以找到Ghostscript的路径。Ghostscript的路径通常不在主键下,而是在子键中。
private static Tuple getRegistryApplicationPath(string keyTitle, string applicationKey)
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(applicationKey);
if (key != null)
{
if (key.ValueCount > 0)
{
return new Tuple(keyTitle, key.GetValue("").ToString());
}
else if (key.SubKeyCount > 0)
{
foreach (var item in key.GetSubKeyNames())
{
var inner = key.OpenSubKey(item);
foreach (var valueInner in inner.GetValueNames())
{
string inner1 = inner.GetValue(valueInner).ToString();
if (!inner1.Contains(".exe") && !inner1.Contains(".dll") && inner1.Contains("GPLGS"))
{
return new Tuple(keyTitle, Path.Combine(inner1, "gswin32c.exe"));
}
else if (inner1.Contains(".exe") || inner1.Contains(".dll"))
{
return new Tuple(keyTitle, Path.Combine(inner1));
}
}
}
}
}
return new Tuple(String.Empty, String.Empty);
}
程序将遍历注册表键池中的每个项目,以查看是否有注册表记录。
private static void getInstalledApplicationPath()
{
foreach (var s in RegistrationKey)
{
allocatedPath = getRegistryApplicationPath(s.Item1, s.Item2);
if (!String.IsNullOrEmpty(allocatedPath.Item1))
{
break;
}
}
}
分配控制器方法控制分配逻辑。
public static Tuple Allocate()
{
createRegistrationKey();
getInstalledApplicationPath();
return allocatedPath;
}
使用分配逻辑找到exe路径后,程序将文档发送到打印机,而不会出现任何弹出窗口。
创建ProcessStartInfo对象,以便GhostScript可以打印PDF。
private static void setProcess()
{
startInfo = new ProcessStartInfo();
startInfo.Arguments = String.Format("-dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=mswinpr2 -sOutputFile=\"\\\\spool\\{0}\" \"{1}\"", printerName, printFileName);
startInfo.FileName = applicationPath;
startInfo.UseShellExecute = false;
}
获取Windows中默认打印机的名称。
private static void getPrinterName()
{
PrintDialog pt = new PrintDialog();
printerName = pt.PrinterSettings.PrinterName;
}
创建控制进程,将PDF发送到打印机。
public static void Print(string path, string exePath)
{
var allocation = PDFLibrary.ApplicationEXEPath.Allocate();
printFileName = path;
applicationPath = allocation.Item2;
getPrinterName();
setTracking();
if (!String.IsNullOrEmpty(applicationPath))
{
setProcess();
using (var process = Process.Start(startInfo))
{
Console.WriteLine("Process started");
Console.WriteLine("Process Id: " + process.Id.ToString());
Console.WriteLine("Process Machine name: " + process.MachineName.ToString());
Console.WriteLine("Wait for Process to exit");
process.WaitForExit();
Console.WriteLine("Closing Process");
closeProcess(process);
reJoinThread();
}
}
else
{
MessageBox.Show(LanguageHelper.GetString("dlgPDFViewer.CantFindPDFApplication"), "Health Options®", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
尝试关闭主窗口并终止进程。
private static void closeProcess(Process process)
{
try
{
process.CloseMainWindow();
process.Kill();
}
catch (Exception e)
{
}
}
private static void reJoinThread()
{
try
{
Console.WriteLine("Try and re-join the Tracking thread");
trackingThread.Join();
Console.WriteLine("Thread has ended");
}
catch (Exception e)
{
}
}