PDFsharp and MigraDoc Foundation (Основы)

    Так как статья, из-за которой я получил инвайт куда-то пропала, хочу опубликовать ее снова.

    Ввиду небольшого количества бесплатных библиотек для работы с PDF в .Net а также недостаточного освещения их на русском языке хочу рассказать о работе с такой замечательной библиотекой как PDFsharp and MigradDoc

    Пожалуй начнем с самого начала — исходники можно скачать здесь или здесь
    Теперь добавим ссылки в свой проект:
    using MigraDoc;
    using PdfSharp;
    
    using MigraDoc.DocumentObjectModel;
    using MigraDoc.Rendering;
    using PdfSharp.Pdf;
    

    Создаем новый документ
    Document document = new Document();
    

    Каждый документ MigraDoc состоит из независимых секций, которые могут иметь свой формат.
    Создание секции:
    Section section = document.AddSection();
    после такой инициализации, работая с section — мы работаем с частью документа document.
    Секции имеет функции для работы с информацией, такие как Add,AddParagraph(), AddImage(),AddTable() и т.д., а также класс для изменения формата самой секции PageSetup.
    Изменение формата:
    section.PageSetup.PageFormat = PageFormat.А5;//стандартный размер страницы
    section.PageSetup.Orientation = Orientation.Portrait;//ориентация
    section.PageSetup.BottomMargin = 10;//нижний отступ
    section.PageSetup.TopMargin = 10;//верхний отступ

    Добавление информации происходит либо с помощью Add(Param), где Param — параграф(Paragraph), рисунок(Image), таблица(Table), график(Chart) или текстовая рамка(TextFrame)
    Paragraph paragraph =new Paragraph();
    section.Add(paragraph);

    либо по примеру добавления секции
    Paragraph paragraph = section.AddParagraph();

    При чем для каждого параграфа также возможно установить индивидуальный формат (класс Format) и стиль (класс Style):
    paragraph.Format.Font.Color = Color.FromCmyk(100, 30, 20, 50);

    К каждому параграфу можно добавить информацию:
    Text text = new Text("text");
    paragraph.AddText("text");//текст
    paragraph.AddFormattedText("formatted text", styleName);// форматированный текст
    paragraph.Add(text);//добавление любого из перечисленых ниже
    paragraph.AddBookmark("Bookmark");//закладка
    paragraph.AddChar('c');//символ
    paragraph.AddDateField("10.10.2010");//дата
    paragraph.AddFootnote("Footnote");//нижняя подпись
    //и еще много чего

    Основу мы собрали, теперь осталось превратить ее в полноценный PDF документ, для чего используется PdfDocumentRenderer:
    pdfRenderer = new PdfDocumentRenderer(true, PdfFontEmbedding.Always);
    pdfRenderer.Document = document;
    pdfRenderer.RenderDocument();
    pdfRenderer.PdfDocument.Save(filePath);// сохраняем

    Возможно понадобится использовать в документе шрифты не установленные по умолчанию в ОС, например DejaVuSansMono.ttf. Это можно сделать так, предварительно поместив файл вышеуказанного шрифта в туже папку где и исполняемы файл:
    Uri uri = new Uri(@"file://" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + @"\DejaVuSansMono.ttf");
    XPrivateFontCollection pfc = XPrivateFontCollection.Global;
    try
    {
          pfc.Add(uri, "./#DejaVu Sans Mono");
    }
    catch (Exception)
    {}
    pdfRenderer.DocumentRenderer.PrivateFonts = pfc;

    Если нужно вывести созданный документ в своем приложение, нам поможет MigraDoc.Rendering.Windows.DocumentPreview — контрол для вывода созданных в MigraDoc документов. Вначале нужно поместить его на форму или WPF-окно, после чего использовать такой код:
    Document doc = new Document();
    doc = oDocument.Clone();
    preview.Ddl = DdlWriter.WriteToString(doc);

    Возможность выводить уже созданные PDF-документы к сожалению отстутсвует.
    Рекомендую обратить внимание на функцию Clone(), которая важна при присваивании любых объектов MigraDoc(документов, секций, параграфов и т.д.), если ее не использовать то при изменении первого объекта будет изменятся и тот, который первому присвоили.
    Для печати MigraDoc документов можно использовать MigraDocPrintDocument:
    MigraDocPrintDocument migraDocPrint = new MigraDocPrintDocument(preview.Renderer);
    migraDocPrint.Print();

    Но замечена такая проблема, что данный способ не работает при печати через сервер, печать через локальный принтер нормальна.
    Поэтому как вариант можно использовать для печати Foxit Reader:
    pdfDocumentRenderer.PdfDocument.Save(@"temp.pdf");
    Process.Start(@"Resources\Foxit Reader.exe", @"/p temp.pdf"); 
    

    В заключение хочется сказать, что протестировав все библиотеки из этого поста я остановился на данной библиотеке как самой удобной и имеющей широкие возможности.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 4

      0
      > Ввиду небольшого количества бесплатных библиотек для работы с PDF в .Net

      Когда-то тоже занимался этим вопросом. В целом суть в том, что любой производитель библиотеки, предоставляющий подписывание и шифрацию PDF, должен делать лицензионные отчисления Adobe. Поэтому бесплатных библиотек с этими функциями быть не может. Ну а энтерпрайзам обычно существенно нужны именно эти функции.
        0
        Недавно столкнулся с задачей написания генератора отчета в PDF на NET-e. Начал делать на PDFsharp-е, столкнулся с множественными проблемами расчета форматирования динамического текста. Забил и сделал в MS Word через COM объекты (там начиная с 2-го сервиспака для 2007-го офиса поддерживается экспорт в PDF).
        Единственная проблема (в моем случае — несущественная): на машине пользователя должен стоять свежий офис.
          0
          >Забил и сделал в MS Word через COM объекты
          А не проще ли было делать XPS, а потом его конвертировать в PDF?
            0
            Задача состояла в следующем: есть некий шаблон акта, который заполняется вручную сотрудниками данными из БД. Заполнять долго, данных много и зачастую они не влезают в соответствующие поля, поэтому этот процесс решили автоматизировать. Решили что сгенерированный отчет должен полностью соответствовать шаблону акта, с одной оговоркой: если в пункт акта не влезают данные, добавить в нем дополнительные строки. Вообщем-то вся проблема вылилась в автопереносе и форматировании отрендеренного текста. На pdfsharp-е у меня не получилось сделать красиво. Поэтому я воспользовался вордом, с его таблицами и автопереносами и получилось как раз то что нужно. С точки зрения программирования, работа с COM объектами ворда очень проста, после создания дока можно его сохранить в любой одерживаемый формат. В нашем случае был PDF, так как пользователям нужно было запретить редактирование.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое