WPF и XPS - как произвести преобразование XAML в XPS?
Переезжаем потихоньку с винформса на WPF и 4 фреймворк Изучаю новые (или для кого-то старые ) технологии
Судя по обзорам технологий, было бы неплохо заюзать XPS формат.
Собственно нужно формирование отчетов в PDF, но решения XPS->PDF вроде как есть. Поэтому будем считать это вторым шагом.
Вопрос в том как бы поудобнее XPS файлы генерить. Очень понравился binding в XAML, хотелось бы организовать чтото наподобие XAML+binding на MVVM->XPS.
Однако гугление на тему генерации XAML->XPS дало достаточно скудные результаты. Собственно примитивную генерацию XPS сделать получилось с ходу, но... есть проблема - отчет получается без разбивки на страницы, т.к. юзаю FixedDocument. Задача в том что нужно формировать XPS, который автоматом на несколько страниц генерится, в зависимости от кол-ва строк в таблицах и т.п.
Я формирую XPS файл так:
Код:
PageReport pageReport = new PageReport(); // XAML с объектом Page в качестве рута
pageReport.DataContext=dataContext;
UIElement content = (UIElement)pageReport.Content;
pageReport.Content = null;
((Grid)content).Width = pageReport.Width;
((Grid)content).Height = pageReport.Height;
FixedPage fixedPage = new FixedPage();
fixedPage.Children.Add(content);
PageContent pageContent = new PageContent();
((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage);
FixedDocument fixedDoc = new FixedDocument();
fixedDoc.Pages.Add(pageContent);
return fixedDoc;
Все работает очень удобно - шаблон отчета можно в дизайнере студии набивать, но проблема - все на одной странице, что не влезло, то не влезло. Как сформировать FixedDocument с разбивкой на страницы?
Крутил FlowDocument, но дизайнер VS2010 не понимает такой XAML
Таким образом нужно дерево UIElement'ов преобразовать в XPS. Как это сделать?
Я бы не заморачивался с XPS, если конечная цель - PDF. Есть же библиотеки, позволяющие формировать PDF напрямую. В конце-концов, есть PDF-принтеры, с которыми можно использовать любой генератор отчетов.
Впрочем, при формировании что XPS, что PDF через библиотеки с API, подобным приведенному в твоем примере, нужно либо использовать движки формирования отчетов, которые сами умеют делать постраничную разбивку, либо реализовывать алгоритм постраничной разбивки самому (что, в общем случае, нетривиально и геморно - делал когда-то такое).
Я бы не заморачивался с XPS, если конечная цель - PDF. Есть же библиотеки, позволяющие формировать PDF напрямую. В конце-концов, есть PDF-принтеры, с которыми можно использовать любой генератор отчетов.
например? Какие есть бесплатные библиотеки для генерации PDF, но не на уровне "вот тебе канва рисуй, а я в PDF скину", а нормальная. Т.к. нужны вложенные сложные таблицы с автосайзом колонок/строк печатать, картинки, текст, все это форматировать должным образом.
и то и другое на жабе писано, посему очень проблемно интегрируется в систему писанную в C#
Сейчас используется nfop - дотнет порт FOP'а, жутко громоздкий, глюкавый и тормозной, но другого нету...
Вот и думаю, не может ли XAML->XPS стать заменой этому глючному монстру XSLT->FO->PDF. Первые опыты показали что отлично работает и было бы супер заменой, но все уперлось в разбивку на страницы, пока работает только на одной странице...
например? Какие есть бесплатные библиотеки для генерации PDF, но не на уровне "вот тебе канва рисуй, а я в PDF скину", а нормальная. Т.к. нужны вложенные сложные таблицы с автосайзом колонок/строк печатать, картинки, текст, все это форматировать должным образом.
Я, честно говоря, сомневаюсь, что бесплатные библиотеки такого уровня есть и для XPS - потому и не понимаю пока смысл использовать XPS как промежуточный шаг.