Pull to refresh

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

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

Ввиду небольшого количества бесплатных библиотек для работы с 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"); 

В заключение хочется сказать, что протестировав все библиотеки из этого поста я остановился на данной библиотеке как самой удобной и имеющей широкие возможности.
Tags:
Hubs:
Total votes 10: ↑10 and ↓0+10
Comments4

Articles