Лучший способ печати из С#/.net?

Каков наилучший способ печати материала из С#/. net?

Вопрос касается отдельных страниц, а также отчетов, содержащих большое количество страниц.

Было бы здорово получить список наиболее распространенных печатных библиотек, содержащих основные функции и файлы для каждого из них.

[Обновить] для стандартных клиентов (или серверов) Windows, а не для веб-приложений.

Ответ 1

Для отчетов я использую элемент управления RDLC.

Для всего остального я использую встроенные объекты печати в .NET.

Edit Вложенные объекты печати находятся в пространстве имен System.Drawing.Printing. Когда вы используете PrintDialog или PrintPreviewDialog в приложении WinForms (или WPF), именно этим объектам вы передаете управление.

Основная идея заключается в том, что вы рисуете на принтере. Простейшая форма:

Sub MyMethod()
     Dim x as New PrintDocument
     AddHandler x.PrintPage, AddressOf printDoc_PrintPage
     x.Print
End Sub
Sub printDoc_PrintPage( sender as Object,  e as PrintPageEventArgs)
      Dim textToPrint as String= ".NET Printing is easy"
      dim printFont as new Font("Courier New", 12)
      dim leftMargin as int= e.MarginBounds.Left
      dim topMargin as int = e.MarginBounds.Top
      e.Graphics.DrawString(textToPrint, printFont, Brushes.Black, leftMargin, topMargin)
End Sub

Что происходит в том, что когда мой объект (x) отправляется командой печати, он вызывает событие "ПЕЧАТЬ СТРАНИЦЫ" (которое предназначено для печати по 1 странице за раз). Затем это событие использует атрибут Graphics для PrintPageEventArgs для рисования соответствующей строки непосредственно в диспетчере очереди печати. ​​

Здесь один учебник и быстрый поиск Google для учебника по .NET-печати возвращают чуть более 200 тыс. результатов.

Ответ 2

"Пример кода для отображения основ печати в приложениях Windows Forms:

    using System.Drawing.Printing;

    PrintDocument printDoc = new PrintDocument();
    printDoc.DefaultPageSettings.Landscape = true;
    printDoc.DefaultPageSettings.Margins.Left = 100; //100 = 1 inch = 2.54 cm
    printDoc.DocumentName = "My Document Name"; //this can affect name of output PDF file if printer is a PDF printer
    //printDoc.PrinterSettings.PrinterName = "CutePDF";
    printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);

    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDoc; //Document property must be set before ShowDialog()

    DialogResult dialogResult = printDialog.ShowDialog();
    if (dialogResult == DialogResult.OK)
    {
        printDoc.Print(); //start the print
    }   

    void printDoc_PrintPage(object sender, PrintPageEventArgs e)
    {
        Graphics g = e.Graphics;
        string textToPrint = ".NET Printing is easy";
        Font font = new Font("Courier New", 12);
        // e.PageBounds is total page size (does not consider margins)
        // e.MarginBounds is the portion of page inside margins
        int x1 = e.MarginBounds.Left;
        int y1 = e.MarginBounds.Top;
        int w = e.MarginBounds.Width;
        int h = e.MarginBounds.Height;

        g.DrawRectangle(Pens.Red, x1, y1, w, h); //draw a rectangle around the margins of the page, also we can use: g.DrawRectangle(Pens.Red, e.MarginBounds)
        g.DrawString(textToPrint, font, Brushes.Black, x1, y1);

        e.HasMorePages = false; //set to true to continue printing next page
    }

Ответ 3

Мы использовали набор сторонних DLL из PDFSharp, которые, в свою очередь, используют DLL из MigraDoc. Я не отношусь ко всем причинам, по которым мы пошли в этом направлении (решение было принято старшим разработчиком), но могу сказать, что:

  • Кажется, что он активен развитие.
  • Он имел большую часть которые нам нужны.
  • Исходный код доступен. Хотя он использовал некоторые шаблоны и условные обозначения, которые я раньше не видел, как только я добрался до их было довольно легко сделать изменения. Я добавил поддержку для использования непосредственно в System.Drawing.Image а не как сохранение файлов.
  • Это хорошо не документированы внутренне или снаружи.

Ответ 4

Грузы вещей, вы говорите. Hum, кажется, что вы должны использовать решение с дизайнером, поэтому вам следует изучить Crystal Reports и RDLC. Также существует решение служб Reporting Services, но в этом случае вам понадобится сервер с SQL Server.

Crystal Reports, похоже, дает вам больше возможностей, но требует немного больше обучения, чем RDLC.

Я бы не рекомендовал вам создавать те, что есть в HTML + CSS, из-за ограничений и дополнительной работы, которую вам пришлось бы бросать на нее.

Ответ 5

Если вы можете создать свой вывод как FlowDocument, вы можете легко превратить его в XPS, чтобы получить "электронную" версию, и распечатайте XPS.

Ответ 6

Это зависит от требований вашего приложения.

Несмотря на то, что это не идеальный инструмент (на самом деле далекий от этого), Crystal Reports имеет тенденцию быть хорошим выбором. Это дает вам возможность получать данные непосредственно из базы данных или, если у вас уже есть список объектов, которые вы хотите распечатать, вы можете передать их в документ и привязать свойства объекта к меткам отчета.

Но дайте нам дополнительную информацию о том, что вы пытаетесь сделать, чтобы получить лучшие предложения.