2013-10-01 62 views
0

我的C#應用​​程序將某些頁面打印到xps文件,但是我發現如果默認打印機是聯網打印機,則創建的xps文件無效「XPS查看器無法打開此文檔」。C#PrintDocument根據默認打印機創建無效的xps文件?

這使我感到困惑,因爲我甚至沒有寫入網絡打印機..但是文件。

如果我沒有將默認打印機設置爲聯網打印機(默認打印機是「發送到OneNote」或「Microsoft XPS Document Writer」),那麼以下代碼在執行時會正確創建一個2頁的XPS文件:

 pageCounter = 0; 
     PrintDocument p = new PrintDocument(); 
     p.PrintPage += delegate(object sender1, PrintPageEventArgs e1) 
     { 
      // 8.5 x 11 paper: 

      float x0 = 25; 
      float xEnd = 850 - x0; 

      float y0 = 25; 
      float yEnd = 1100 * 2 - y0; // bottom of 2ed page 

      Font TitleFont = new Font("Times New Roman", 30); 

      if (pageCounter == 0) // for the first page 
      { 
       e1.Graphics.DrawString("My Title", TitleFont, new  SolidBrush(Color.Black), new RectangleF(300, 15, xEnd, yEnd));     
       e1.HasMorePages = true; // more pages 
       pageCounter++;// next page counter 
      } 
      else // the second page 
      {     
       e1.Graphics.DrawString("Page 2", TitleFont, new SolidBrush(Color.Black), new RectangleF(300, 15, xEnd, yEnd));     
      } 

     }; 

     // now try to print 
     try 
     {    
      p.PrinterSettings.PrintFileName = fileName; // the file name set earlier 
      p.PrinterSettings.PrintToFile = true; // print to a file (i thought this would ignore the default printer)    
      p.Print(); 

     } 
     catch (Exception ex) 
     { 
      // for the Bug I have described, this Exception doesn't happen. 
      // it creates an XPS file, but the file is invalid in the cases mentioned 
      MessageBox.Show("Error", "Printing Error", MessageBoxButton.OK); 
     }  

所以我的問題是......爲什麼會發生這種情況,我做錯了什麼?

回答

1

嗯,這裏沒有具體的問題,但我會告訴你我的知識。您正在使用默認打印機的驅動程序生成正在保存到文件的輸出文檔。某些驅動程序會輸出xps內容,然後由打印機將其用於在頁面上放置墨水/碳粉。其他驅動程序輸出postscript,PCL,PDF或其他一些數據格式。因此,根據默認打印機,您可以將數據保存爲這些格式中的任何一種。

爲確保您實際生產XPS內容,您需要指定「Microsoft XPS Document Writer」作爲要在p.PrinterSettings.PrinterName中使用的打印機。當然,如果該打印隊列已被重命名或刪除,這可能會失敗。您可以跳過PrinterSettings.InstalledPrinters以嘗試確定哪個隊列是XPS Document Writer,但是如果打印機已被刪除,則這將失敗。更可靠的解決方案是直接使用XpsDocumentWriter生成XPS內容,但這需要進行一些實質性更改。

+0

我會研究這個,謝謝你的想法。你有沒有關於XpsDocumentWriter的很好的教程? 到目前爲止,我一直在用打印機做的東西並不是那麼直截了當。 – 00jt

+0

不幸的是,我認爲使用XpsDocumentWriter將至少像使用PrintDocument一樣複雜。對於使用XpsDocumentWriter創建內容,我沒有任何好的資源,因爲我的專業知識更多地放在了驅動程序方面。 – Jon

+0

還沒有機會看到它,但「複雜和工作」仍然比「複雜和破碎」更好, – 00jt

相關問題