Так как статья, из-за которой я получил инвайт куда-то пропала, хочу опубликовать ее снова.
Ввиду небольшого количества бесплатных библиотек для работы с PDF в .Net а также недостаточного освещения их на русском языке хочу рассказать о работе с такой замечательной библиотекой как PDFsharp and MigradDoc
Пожалуй начнем с самого начала — исходники можно скачать здесь или здесь
Теперь добавим ссылки в свой проект:
Создаем новый документ
Каждый документ MigraDoc состоит из независимых секций, которые могут иметь свой формат.
Создание секции:
Секции имеет функции для работы с информацией, такие как Add,AddParagraph(), AddImage(),AddTable() и т.д., а также класс для изменения формата самой секции PageSetup.
Изменение формата:
Добавление информации происходит либо с помощью Add(Param), где Param — параграф(Paragraph), рисунок(Image), таблица(Table), график(Chart) или текстовая рамка(TextFrame)
либо по примеру добавления секции
При чем для каждого параграфа также возможно установить индивидуальный формат (класс Format) и стиль (класс Style):
К каждому параграфу можно добавить информацию:
Основу мы собрали, теперь осталось превратить ее в полноценный PDF документ, для чего используется PdfDocumentRenderer:
Возможно понадобится использовать в документе шрифты не установленные по умолчанию в ОС, например DejaVuSansMono.ttf. Это можно сделать так, предварительно поместив файл вышеуказанного шрифта в туже папку где и исполняемы файл:
Если нужно вывести созданный документ в своем приложение, нам поможет MigraDoc.Rendering.Windows.DocumentPreview — контрол для вывода созданных в MigraDoc документов. Вначале нужно поместить его на форму или WPF-окно, после чего использовать такой код:
Возможность выводить уже созданные PDF-документы к сожалению отстутсвует.
Рекомендую обратить внимание на функцию Clone(), которая важна при присваивании любых объектов MigraDoc(документов, секций, параграфов и т.д.), если ее не использовать то при изменении первого объекта будет изменятся и тот, который первому присвоили.
Для печати MigraDoc документов можно использовать MigraDocPrintDocument:
Но замечена такая проблема, что данный способ не работает при печати через сервер, печать через локальный принтер нормальна.
Поэтому как вариант можно использовать для печати Foxit Reader:
В заключение хочется сказать, что протестировав все библиотеки из этого поста я остановился на данной библиотеке как самой удобной и имеющей широкие возможности.
Ввиду небольшого количества бесплатных библиотек для работы с PDF в .Net а также недостаточного освещения их на русском языке хочу рассказать о работе с такой замечательной библиотекой как PDFsharp and MigradDoc
Пожалуй начнем с самого начала — исходники можно скачать здесь или здесь
Теперь добавим ссылки в свой проект:
using MigraDoc; using PdfSharp; using MigraDoc.DocumentObjectModel; using MigraDoc.Rendering; using PdfSharp.Pdf;
Создаем новый документ
Document document = new Document();
Каждый документ MigraDoc состоит из независимых секций, которые могут иметь свой формат.
Создание секции:
после такой инициализации, работая с section — мы работаем с частью документа document.Section section = document.AddSection();
Секции имеет функции для работы с информацией, такие как 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");
В заключение хочется сказать, что протестировав все библиотеки из этого поста я остановился на данной библиотеке как самой удобной и имеющей широкие возможности.
