Настройки принтера по умолчанию игнорируются
Используя Windows Print Spooler API, мы можем распечатать файлы XPS.
Проблема в том, что диспетчер очереди печати игнорирует настройки принтера по умолчанию.
(Мы перестали пытаться применить настройки принтера. Стандартных настроек принтера просто должно хватить.)
Например... распечатки всегда выходят в цвете и по одной бумаге на страницу, независимо от того, какие настройки установлены на панели управления: черно-белые / цветные, дуплексные / недуплексные, несколько страниц на листе / одна страница за лист.
Другие приложения, такие как MS Word и Adobe, уважают настройки принтера по умолчанию.
Мы используем Delphi XE2 и Windows 7 64-bit.
Этот тестовый код самодостаточен, поэтому вы можете просто вставить его, чтобы протестировать...
Заполните поле со списком имен принтеров, используя:
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;
1 ответ
Насколько я знаю, вы не можете изменить внешний вид файла.xps.
XPS расшифровывается как XML Paper Specification, фактически это "электронная бумага", документ на экране и в печати - именно то, что было задумано автором. Любой, кто когда-либо сталкивался с изменением макета страницы документа Office на компьютере с общим доступом из-за другого принтера по умолчанию, оценит это.
РЕДАКТИРОВАТЬ
Тестовое задание
1.) Стандартные настройки черно-белого принтера. Открой. XPS файл Печать.
- С IE == цветной вывод.
- С XPS Viewer EP == цветной вывод.
Настройки принтера по умолчанию == игнорируются.
2.) Диалог: настройки принтера вручную для печати черно-белого набора.
- IE == черно-белый вывод.
- XPS Viewer EP == черно-белый вывод.