自分のアプリケーションでアプリケーションからの印刷出力をキャプチャする仮想プリンターを作成しようとしています。
Microsoft PostScript ドライバーを使用して ps ファイルを生成するものを正常に実装しました。 (さまざまなオープン ソース プロジェクトから抽出された多数のコード)
ただし、実稼働サーバーでの GhostScript のライセンスの問題により (ビジネス ソリューションでは無料ではありません)、XPS ファイルまたはテキストの抽出、PDF への変換に使用できるその他の形式を生成する別のドライバーを実装したいと考えています。各ページの画像などを抽出します。
Postscript ドライバーで使用しているコードは、実際には次のようにうまく動作します。
// Declare the AddPrinterDriver as extern.
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool AddPrinterDriver(String pName, UInt32 Level, ref DRIVER_INFO_3 pDriverInfo);
// Create a function to call it.
public void AddPrinterDriver(string driverName, string driverPath, string dataPath, string configPath, string helpPath)
{
DRIVER_INFO_3 di = new DRIVER_INFO_3();
di.cVersion = 3;
di.pName = driverName;
di.pEnvironment = null;
di.pDriverPath = driverPath;
di.pDataFile = dataPath;
di.pConfigFile = configPath;
di.pHelpFile = helpPath;
di.pDependentFiles = "";
di.pMonitorName = null;
di.pDefaultDataType = "RAW";
if (!AddPrinterDriver(null, 3, ref di))
{
Exception exc = new Win32Exception(Marshal.GetLastWin32Error());
throw exc;
}
}
プリンターの方法をインストールします (適切な検証とログなし):
public void InstallVirtualPrinter()
{
// Declare file names for PostScript printer driver. (Preinstalled in Vista and Up)
string driverFileName = "PSCRIPT5.DLL";
string configFileName = "PS5UI.DLL";
string helpFileName = "PSCRIPT.HLP";
string dataFileName = "MyCustomConfig.PPD";
string driverPath = null;
string dataPath = null;
string configPath = null;
string helpPath = null;
try
{
//Set Printer Driver Path and Files.
string printerDriverPath = Path.Combine(GetPrinterDirectory(), "3");
// Set the path for the driver files.
if (!String.IsNullOrWhiteSpace(printerDriverPath))
{
driverPath = string.Format("{0}\\{1}", printerDriverPath, driverFileName);
dataPath = string.Format("{0}\\{1}", printerDriverPath, dataFileName);
configPath = string.Format("{0}\\{1}", printerDriverPath, configFileName);
helpPath = string.Format("{0}\\{1}", printerDriverPath, helpFileName);
}
// Add Printer Monitor
if (!DoesMonitorExist(PrinterMonitorName))
{
AddPrinterMonitor(PrinterMonitorName);
}
// Add Printer Port
if (!DoesPrinterPortExist(PrinterPortName))
{
AddPrinterPort(PrinterPortName, PrinterMonitorName);
}
// Add Printer Driver
if (!DoesPrinterDriverExist(PrinterDriverName))
{
//
//
//
//
// This references the above method in this SO question.
AddPrinterDriver(PrinterDriverName, driverPath, dataPath, configPath, helpPath);
//
// This fails when trying with a driver different than PScript.
//
}
// Add Printer
if (!DoesPrinterExist(PrinterName))
{
InstallPrinter(PrinterName, PrinterPortName, PrinterDriverName);
}
// Configure Virtual Port
ConfigureVirtualPort(PrinterMonitorName, PrinterPortName);
// Restart Spool Service
RestartSpoolService();
log.Info("Virtual printer installation completed successfully");
return;
}
catch (Exception exc)
{
log.ErrorFormat("An exception has been raise when attempting to install the printer \n{0}", exc);
}
}
だからここに質問があります:
UniDrv や XPS などの別のドライバーを使用して、仮想プリンター/モニターを実装するにはどうすればよいですか? .
上記のコードの次の行を置き換えて、UniDrv を試してみました。
string driverFileName = "unidrv.dll";
string dataFileName = "sample.GPD";
string configFileName = "unidrvui.dll";
string helpFileName = "unidrv.hlp";
メソッドを実行するAddPrinterDriver
と、 を示す例外が発生します"The system cannot find the file specified"
。
どのファイルが欠落しているかはわかりません。いくつかの依存関係が欠落している可能性があるか、見つけた sample.GPD ファイルが適切ではない可能性があると思います。
どんな助けでも大歓迎です。