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


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