[英]Default printer settings are ignored
使用Windows Print Spooler API,我們可以打印出XPS文件。
問題是打印后台處理程序忽略 默認的打印機設置 。
(我們已經放棄嘗試應用打印機設置 。默認打印機設置就足夠了。)
例如......無論控制面板中的設置是什么,打印輸出總是以彩色和每頁一張紙出現:黑白/彩色,雙面/非雙面,每張多頁/單頁每張紙。
其他應用程序(如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;
據我所知,你無法改變.xps文件的外觀。
XPS代表XML Paper Specification,它實際上是一種“電子紙”,屏幕上和印刷品中的文檔完全符合作者的意圖 。 任何曾經歷過的人,由於不同的默認打印機而在共享計算機上的Office文檔的頁面布局如何發生變化,都會感激不盡。
編輯
測試
1.)默認黑白打印機設置。 打開。 xps文件打印。
默認打印機設置==忽略。
2.)對話框:手動打印機設置以打印黑白設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.