2012-05-28 172 views
2

使用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; 
+0

這段時間以來,我一直在這方面工作,但如果您直接與後臺打印程序交談,那麼您發送它的文件是最終的打印機準備好的內容,並且與打印機的默認設置完全沒有關係。如果您正在假脫機數據文件 - 一致性,這是一件好事。如果你想像Word一樣打印,那麼你需要用print shell動詞來運行應用程序(類似於「%1/Print」)。 – mj2008

+0

這對我沒有意義。無論XPS文件如何渲染爲文件,用戶可能都希望使用不同的紙盤,或更改紙張大小等。 –

+0

感謝關於shell命令的指針。我會調查他們。 –

回答

0

就像我知道你不能改變.xps文件的外觀。

XPS代表XML紙張規範,它實際上是一個「電子紙」,屏幕上的文檔和打印的方式完全是作者的意圖。任何有經驗的人都知道,由於不同的默認打印機,共享計算機上的Office文檔的頁面佈局如何變化,非常感謝。

編輯

測試

1)默認的黑白打印機設置。打開。 xps文件打印。

  • 使用IE ==彩色輸出。
  • 使用XPS Viewer EP ==彩色輸出。

默認打印機設置==忽略。

2.)對話框:手動打印設置打印黑白套裝。

  • IE ==黑白輸出。
  • XPS Viewer EP ==黑白輸出。
+0

啊。最後我明白了。那麼,這是三個星期浪費在試圖做不可能的事情上。接下來我將嘗試@ mj2008建議的shell命令。 –

相關問題