Лучший способ печати для клиентов Windows (не для веб-приложений)? - PullRequest
12 голосов
/ 16 декабря 2008

Как лучше всего распечатать материал из c # /. Net?

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

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

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

Ответы [ 7 ]

10 голосов
/ 16 декабря 2008

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

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

Редактировать Все присущие объекты печати находятся в пространстве имен 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) отправляется команда печати, он вызывает событие «PRINT PAGE» (которое предназначено для печати по 1 странице за раз). Затем это событие использует атрибут Graphics объекта PrintPageEventArgs для рисования соответствующей строки непосредственно в диспетчере очереди печати. ​​

Вот один учебник , а быстрый поиск в Google по "учебнику по .NET печати" возвращает чуть более 200K результатов.

2 голосов
/ 25 декабря 2013

»Пример кода, демонстрирующий основы печати в приложениях 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
    }
2 голосов
/ 16 декабря 2008

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

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

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

1 голос
/ 16 декабря 2008

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

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

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

0 голосов
/ 24 июля 2018

Можно печатать через Adobe Acrobat

Я использую стандартные библиотеки, такие как System.Diagnostics.ProcessStartInfo, чтобы использовать Adobe Acrobat для печати PDF. Конечному пользователю не придется взаимодействовать с графическим интерфейсом Acrobat, хотя, к сожалению, следующий код по-прежнему выводит его на экран в течение нескольких секунд.

    // Sample fileName = System.Environment.GetFolderPath(
    // System.Environment.SpecialFolder.CommonApplicationData)
    //  + @"\MyCompany\MyProject\TestPrint.pdf"
    private void SendPrintJob(string fileName)
    {
        try
        {
           // Start by finding Acrobat from the Registry.
           // This supposedly gets whichever you have of free or paid
            string processFilename = Microsoft.Win32.Registry.LocalMachine
                 .OpenSubKey("Software")
                 .OpenSubKey("Microsoft")
                 .OpenSubKey("Windows")
                 .OpenSubKey("CurrentVersion")
                 .OpenSubKey("App Paths")
                 .OpenSubKey("AcroRd32.exe")
                 .GetValue(String.Empty).ToString();

            ProcessStartInfo info = new ProcessStartInfo();
            info.Verb = "print";
            info.FileName = processFilename;
            info.Arguments = String.Format("/p /h {0}", fileName);
            info.CreateNoWindow = true;
            info.WindowStyle = ProcessWindowStyle.Hidden;
            info.UseShellExecute = false;

            Process p = new Process();
            p.StartInfo = info;
            p.Start();

            p.WaitForInputIdle();

            // Recommended to add a time-out feature. Mine is coded here.
        }
        catch (Exception e)
        {
            Console.WriteLine("Error sending print job. " + e.Message);
        }

Может манипулировать через PDFSharp / MigraDoc

Я не читал манипуляции с документами в ОП, но вижу другие ответы, комментирующие этот факт. В нескольких вопросах и ответах StackOverflow за 2008-2012 годы (включая @Robert Gowland из этого вопроса) говорится, что у PDFSharp / MigraDoc плохая документация.

В 2018 году я обнаружил, что это простая в освоении кривая, со многими образцами на домашней странице . Я прочитал этот вопрос сегодня утром, чтобы понять, как напечатать график, и теперь у меня есть кнопка, чтобы сделать снимок экрана с моим приложением и распечатать.

Вам нужно перейти к диспетчеру пакетов NuGet для PDFsharp-MigraDocs (или PDFsharp-MigraDocs-WPF, или PDFsharp-MigraDocs-GDI). MigraDocs - это высокоуровневый компонент, который может создавать документы из элементов, не заботясь о том, являются ли они PDF-файлами, изображениями или чем-то еще. PDFSharp - это компонент, который помогает, то есть переупорядочивать документы, размещать несколько документов на странице и разбивать содержимое на одну-две страницы.

0 голосов
/ 16 декабря 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...