Здравствуйте.
Делаю отчет в PdfSharp.
Вроде бы все просто… создал графикс и рисую в нем блоки стандартными методами. Но вот столкнулся с проблемкой.
Надо отобразить примерно такое:
Может рисовать текст только в заданном прямоугольнике. На уме только костыль чтобы нарисовать вначале в большом прямоугольнике текст с одним стилем, а затем в о второй текст вставить кучу пробелов и рисовать его в том же самом прямоугольнике?
Так про форматтер то я знаю. Как в блоке нарисовать заголовок то другим стилем??
В общем с помощью расширения Migra можно добавлять блоки в виде параграфов аналогично RTF.
internal static PdfDocument GenerateProtocol(BlockInfo printDialogResult)
{
PdfDocument s_document = new PdfDocument();
s_document.Info.Title = pat.Name;
s_document.Info.Subject = pat.Name;
PdfPage page = s_document.AddPage();
page.Orientation = PdfSharp.PageOrientation.Portrait;
XGraphics gfx = XGraphics.FromPdfPage(page );
//gfx.ScaleTransform(0.95, 0.95);
// HACK²
gfx.MUH = PdfFontEncoding.Unicode;
Document doc = new Document();
Section sec = doc.AddSection();
// Add a single paragraph with some text and format information.
Paragraph para = sec.AddParagraph();
para.Format.Alignment = ParagraphAlignment.Justify;
para.Format.Font.Name = "Times New Roman";
para.Format.Font.Size = 12;
para.Format.Font.Color = Colors.Black;
para.AddFormattedText("ЗАГОЛОВОК ТЕКСТА: ", TextFormat.Bold);
para.AddText("А теперь представьте: у вас есть многостраничный документ, например годовой отчёт или дипломная работа. Вы находитесь на энной странице и видите факты, которые нужно перепроверить далее по тексту. Погружаться предстоит глубоко, поэтому номер текущего листа нужно где-то записать. Как возвратиться обратно без напоминалки?");
// Create a renderer and prepare (=layout) the document
DocumentRenderer docRenderer = new DocumentRenderer(doc);
docRenderer.PrepareDocument();
// Render the paragraph. You can render tables or shapes the same way.
//docRenderer.RenderObject(gfx, XUnit.FromCentimeter(3), XUnit.FromCentimeter(2), XUnit.FromCentimeter(16.5), para);
double A4Width = (int)XUnit.FromCentimeter(21).Point;
double A4Height = (int)XUnit.FromCentimeter(29.7).Point;
double width = page.Width;
double height = page.Height;
page.TrimMargins = new TrimMargins() { All = 0 };
XRect A4Rect = new XRect(0, 0, A4Width, A4Height);
int pageCount = docRenderer.FormattedDocument.PageCount;
for (int idx = 0; idx < pageCount; idx++)
{
XRect rect = new XRect(0, 0, A4Width / 3 * 0.9, A4Height / 3 * 0.9);
rect.X = (idx % 3) * A4Width / 3 + A4Width * 0.05 / 3;
rect.Y = (idx / 3) * A4Height / 3 + A4Height * 0.05 / 3;
XGraphicsContainer container = gfx.BeginContainer(A4Rect, A4Rect, XGraphicsUnit.Point);
// Draw page border for better visual representation
gfx.DrawRectangle(XPens.Black, A4Rect);
// Render the page. Note that page numbers start with 1.
docRenderer.RenderPage(gfx, idx + 1);
// Note: The outline and the hyperlinks (table of content) does not work in the produced PDF document.
// Pop the previous graphical state
gfx.EndContainer(container);
}
return s_document;
}
Если без него, то надо было бы много чего велосипедить для выравнивания по ширине, чтоб совпадали размеры после применения стилей. + просто считать символы не прокатит если шрифт не моноширинный.
Без выравнивания можно разбить это на слова, и отдельно выводить на нужной позиции, используя MeasureString.
Ну кто ж эти рекомендации читает без необходимости )))
Раньше для простого одностраничного отчета нормально хватало и обычного рендеринга. А сейчас понадобилось на 20 листов формировать и уже задумался. С мигрой конечно все удобно… она и на страницы режет документ сама… одно удовольствие работать.