使用 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;
最佳答案
据我所知,您无法更改 .xps 文件的外观。
XPS 代表 XML Paper Specification,它实际上是一种“电子纸”,屏幕上的文档和打印的方式完全符合作者的意图。任何曾经经历过共享计算机上的 Office 文档的页面布局如何由于不同的默认打印机而发生变化的人,都会感激不已。
编辑
测试
1.) 默认黑白打印机设置。打开。 xps文件打印。
- 使用 IE == 彩色输出。
- 使用 XPS 查看器 EP == 彩色输出。
默认打印机设置 == 忽略。
2.) 对话框:打印机设置手动打印黑白设置。
- IE == 黑白输出。
- XPS 查看器 EP == 黑白输出。
关于windows - 默认打印机设置被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782586/