使用Windows Print Spooler API,我們可以打印出XPS文件。默認打印機設置被忽略
問題是打印假脫機程序忽略默認打印機設置。
(我們已經放棄了試圖apply printer settings。默認的打印機設置將只需要就夠了。)
例如...打印輸出總是出來的顏色和每一個頁紙張,無論控制面板中設置的設置:黑色&白色/彩色,雙面/非雙面,每頁多頁/每頁單頁。
其他應用程序如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;
這段時間以來,我一直在這方面工作,但如果您直接與後臺打印程序交談,那麼您發送它的文件是最終的打印機準備好的內容,並且與打印機的默認設置完全沒有關係。如果您正在假脫機數據文件 - 一致性,這是一件好事。如果你想像Word一樣打印,那麼你需要用print shell動詞來運行應用程序(類似於「%1/Print」)。 – mj2008
這對我沒有意義。無論XPS文件如何渲染爲文件,用戶可能都希望使用不同的紙盤,或更改紙張大小等。 –
感謝關於shell命令的指針。我會調查他們。 –