Используя API печати Spooler Windows, мы можем распечатать файлы XPS.Параметры принтера по умолчанию игнорируются
Проблема заключается в том, что печать Спулер игнорирует в настройки принтера по умолчанию.
(Мы отказались от пытаться apply printer settings. По умолчанию параметры принтера просто достаточно.)
Например ... отпечатки всегда выходят в цвете и на одной бумаги на странице, независимо от того, какие настройки установлены на панели управления: черный & белый/цветной, дуплексный/недуплексный, несколько страниц на лист/одна страница на лист.
Другие приложения, такие как MS Word и Adobe, соответствуют настройкам принтера по умолчанию.
Мы используем 64-разрядную версию Delphi XE2 и Windows 7.
Этот тестовый код содержится сам, так что вы можете просто вставить его, чтобы проверить его ...
Заполняем поле со списком с именами принтеров с помощью: процедуры
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 и т. Д., Вам нужно запустить приложение с помощью глагола оболочки печати (что будет «% 1/Печать»). – mj2008
Это не имеет смысла для меня. Пользователь может захотеть использовать другой лоток для бумаги или изменить размер бумаги и т. Д., Независимо от того, как файл XPS был передан в файл. –
Спасибо за указатель команд оболочки. Я исследую их. –