2013-10-01 13 views
0

Приложение My C# печатает некоторые страницы в файле xps, однако я обнаружил, что если принтер по умолчанию является сетевым принтером, тогда созданный файл xps недействителен. «Просмотрщик XPS не может открыть этот документ».C# PrintDocument создает недопустимый файл xps в зависимости от принтера по умолчанию?

Это меня смущает, так как я даже не пишу на сетевой принтер .. но в файл.

Если у меня нет принтера по умолчанию, установленного на сетевом принтере (принтер по умолчанию «отправить в OneNote» или «Microsoft XPS Document Writer»), то следующий код правильно создает файл XPS с 2 страницами при выполнении :

 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, но опять же, это произойдет, если принтер был удален. Более надежным решением было бы сгенерировать контент XPS напрямую с помощью XpsDocumentWriter, однако это потребует значительных изменений.

+0

Я рассмотрю это, спасибо за идею. У вас есть хорошие учебники по XpsDocumentWriter? Материал, который я делал с принтером, до сих пор не был таким прямым. – 00jt

+0

К сожалению, я думаю, что работа с XpsDocumentWriter будет, по крайней мере, такой же сложной, как работа с PrintDocument. У меня нет хороших ресурсов для создания контента с помощью XpsDocumentWriter, так как мой опыт больше связан с драйверами. – Jon

+0

еще не имели возможности посмотреть на это, но «сложный и рабочий» по-прежнему лучше, чем «сложный и сломанный», – 00jt