Windows Print Spooler API を使用して、XPS ファイルを印刷できます。
問題は、印刷スプーラーがデフォルトのプリンター設定を無視することです。
(プリンター設定の適用は諦めました。デフォルトのプリンター設定で十分です。)
たとえば、コントロール パネルでの設定に関係なく、印刷物は常にカラーで 1 ページに 1 枚の用紙で出力されます。シートあたり。
MS Word や Adobe などの他のアプリケーションは、デフォルトのプリンター設定を尊重します。
Delphi XE2 と Windows 7 64 ビットを使用しています。
このテスト コードは自己完結型であるため、貼り付けてテストすることができます...
次を使用して、コンボ ボックスにプリンター名を入力します。
uses
Printers
ComboBox1.Items.Assign(Printer.Printers);
印刷手順:
uses
Winapi.WinSpool
procedure PrintXPS(PrinterName, FileNameXPS: string; ParentFormHandle: THandle = 0);
// Printer handle
procedure Printer_Open(out Printer: THandle; Defaults: PPrinterDefaultsW = nil);
begin
if not OpenPrinterW(PWideChar(PrinterName), Printer, Defaults) then
RaiseLastOSError;
end;
procedure Printer_Close(Printer: THandle);
begin
if not ClosePrinter(Printer) then
RaiseLastOSError;
end;
// Print jobs
function JobCreate(Printer: THandle; FileName: string): Cardinal;
var
lBufferSize: Cardinal;
lAddJobInfo: PAddJobInfo1W;
begin
// Create job
AddJobW(Printer, 1, nil, 0, lBufferSize);
GetMem(lAddJobInfo, lBufferSize);
try
if not AddJobW(Printer, 1, lAddJobInfo, lBufferSize, lBufferSize) then
RaiseLastOSError;
Result := lAddJobInfo.JobId;
// Copy the file into place
CopyFile(PWideChar(FileName), lAddJobInfo.Path, True);
finally
FreeMem(lAddJobInfo, lBufferSize);
end;
end;
procedure JobStart(Printer: THandle; JobID: Cardinal);
begin
if not ScheduleJob(Printer, JobID) then
RaiseLastOSError;
end;
var
PrinterA: THandle;
JobID: Cardinal;
begin
if not FileExists(FileNameXPS) then
raise Exception.Create('File not found: ' + FileNameXPS);
Printer_Open(PrinterA, nil);
try
JobID := JobCreate(PrinterA, FileNameXPS);
JobStart(PrinterA, JobID);
finally
Printer_Close(PrinterA);
end;
end;