Arhn - архитектура программирования

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

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

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

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

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

16.12.2008

  • Насколько вы уже изучили пространство имен System.Drawing.Printing? 16.12.2008
  • Я рассмотрел несколько способов печати, но прежде чем углубиться в один из них, я хотел бы узнать больше — это пустая трата времени, чтобы выбрать неправильный способ, чтобы узнать больше. 17.12.2008

Ответы:


1

Для отчетов я использую элемент управления 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» возвращает чуть более 200 000 результатов.

16.12.2008
  • Не могли бы вы немного подробнее рассказать о встроенных объектах печати? 16.12.2008

  • 2

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

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

    3

    » Пример кода для демонстрации основ печати в приложениях 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
        }
    
    25.12.2013

    4

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

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

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

    16.12.2008

    5

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

    16.12.2008

    6

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

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

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

    16.12.2008
  • Ну ладно, у меня куча материала для печати: отдельные страницы, длинные отчеты, липкие этикетки, назовите это, мне придется это напечатать (скоро). Итак, я хотел бы получить обзор решений для печати за и против. 16.12.2008

  • 7

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

    24.07.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..