Тихо используйте принтер Microsoft XPS Document Writer для создания XPS - PullRequest
2 голосов
/ 03 марта 2011

В течение нескольких дней я боролся с печатью XPS в файл без диалогового окна. Я прочитал сообщения по этому вопросу в CodeGuru и Feng Yuan (MSDN), а также многие темы для обсуждения здесь, и я все еще потерян.

В частности, мой сценарий состоит в том, что у меня есть сторонний API, который я должен использовать, и он печатает на принтере по умолчанию (скажем, Microsoft XPS Document Writer). Я хочу иметь возможность "применить" имя файла перед процедурой печати и, конечно, не иметь диалогового окна.

Я пытался работать с примерами WinDDK - XPSDRV и LOCALMON, но не смог понять, как именно манипулировать кодом для достижения моих целей. (или даже полностью понимаю, нужен ли мне новый драйвер принтера или новый тип порта)

Ответы [ 2 ]

1 голос
/ 04 июля 2013

Я столкнулся с той же нуждой.Ниже приведена некоторая логика, обеспечивающая мне желаемую функциональность:

 // 
 // PrintDocument_inst
 // 
 this.PrintDocument_inst.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.k_line_PrintPage);

  private void Print( string align_file_name )
  {
     if ( plot_metafile == null )
     {
        MessageBox.Show( "you need to load offset data before printing a plot" );
        return;
     }

     try
     {
        PrintDocument_inst.DefaultPageSettings = PageSettings_inst;

        PrintDialog_inst = new PrintDialog( );
        PrintDialog_inst.Document = PrintDocument_inst;
        PrintDialog_inst.UseEXDialog = true;  // this must be set true or dialog won't show on 64 bit Vista 
        PrintDialog_inst.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";
        PrintDialog_inst.PrinterSettings.PrintToFile = true;
        PrintDialog_inst.PrinterSettings.PrintFileName = align_file_name;

        i_page_to_print_next = 1;
        n_pages_still_to_print = 1;
        PrintDocument_inst.Print( );
     }
     catch ( Exception e )
     {
        MessageBox.Show( e.ToString( ) );
     }
     finally
     {
     }

  }  //    end of function   Print( string align_file_name )

  //PrintPage event handler
  private void k_line_PrintPage(object sender,PrintPageEventArgs ppea)
  {         
     int leftMargin = ppea.MarginBounds.Left;
     int topMargin = ppea.MarginBounds.Top ;

     try
     {
        float _scale_f;

        if ( PrintDialog_inst != null )
        {
           string str_printer_name = PrintDialog_inst.PrinterSettings.PrinterName.ToString ( );
           if ( str_printer_name.CompareTo ( "Adobe PDF" ) == 0 )
           {
              _scale_f = 0.61F; //  0.85F;
           }
           else
           {
              _scale_f = 0.59F; //  0.82F;
           }
        }
        else  // case of print preview
        {
           _scale_f = 0.59F; // 0.82F;
        }
        if ( _scale_f != 1.0F ) ppea.Graphics.ScaleTransform ( _scale_f, _scale_f );
        ppea.Graphics.DrawImage ( plot_metafile, leftMargin, topMargin );
        ppea.HasMorePages = ( --n_pages_still_to_print > 0 ? true : false );
     }
     finally
     {
     }
  } //  end of  private void k_line_PrintPage(object sender,PrintPageEventArgs ppea)
0 голосов
/ 11 марта 2011

Вы удалите фильтры в xml конвейера, а также связанные DLL в файле inf. Но все же, как и я, я думаю, вы столкнетесь с проблемой печати холста (графика). Мне не удалось преобразовать / преобразовать этот холст в глифы, чтобы получить его содержимое.

Если у вас возникли дополнительные проблемы, дайте мне знать

С уважением

...