Вывод произвольного размера страницы в XPS из отчета WPF

У меня есть отчет WPF, который рисует содержимое отчета в пользовательском размере страницы (мы можем рассматривать его как A4, проблема та же), если я отправляю вывод на принтер (физический или виртуальный, например PDFCreator), мой пользовательский размер страницы корректно сохраняются для каждой страницы.

Но когда я вывожу его в формате XPS, страницы адаптируются к размеру страницы Letter.

Как сохранить мой пользовательский размер страницы при выводе отчета WPF в XPS?

МОЯ ПОСЛЕДНЯЯ ЦЕЛЬ: получить PDF-файл из WPF, и мой подход состоит в том, чтобы преобразовать XPS в PDF с помощью PDFSharper. Преобразование работает хорошо, но вывод XPS искажает мой пользовательский размер страницы. Другие подходы приветствуются, но я все равно хотел бы понимать и контролировать размер страницы вывода XPS.

ПРИМЕР ПРОЕКТА: Test_WpfToPDF_withXpsCorruptingPageSizeToLetter.zip


person Luciano    schedule 26.07.2013    source источник
comment
Не могли бы вы показать нам код, который вы используете для преобразования из XPS в PDF?   -  person Sevenate    schedule 31.07.2013
comment
Кроме того, что именно вы подразумеваете под отчетом WPF? Является ли это своего рода настраиваемым компонентом, или вы просто используете какой-то подход для печати произвольного элемента управления WPF или что-то в этом роде?   -  person Sevenate    schedule 31.07.2013
comment
XPS в PDF не проблема, PDFSharper работает. Моя проблема в том, что WPF печатается как XPS. Даже при использовании средства просмотра XPS страница «повреждена», так что проблема не в PDFSharper. Но я постараюсь оставить здесь образец проекта для загрузки. [В любом случае вы должны увидеть: msdn.microsoft.com/en-us/library /ms742418.aspx]   -  person Luciano    schedule 31.07.2013
comment
Лучано, спасибо - пример проекта может быть полезен.   -  person Sevenate    schedule 31.07.2013
comment
@Sevenate: Пример проекта есть, любая помощь приветствуется.   -  person Luciano    schedule 02.08.2013
comment
Лучано, прости, что ненадолго ушел. Рад, что у вас уже есть ответ.   -  person Sevenate    schedule 20.09.2013


Ответы (1)


Кажется, это работает, когда вы оборачиваете пользовательский элемент управления (отчет) внутри другого элемента, предоставляя также реальный размер и не забывая поставить фон. Я не знаю точно почему, но фон, кажется, делает свое дело, наряду с размером.

public override DocumentPage GetPage(int pageNumber) {
    var page = new MyUserControl();

    Border wrapper = new Border();
    wrapper.Width = this.PageSize.Width;
    wrapper.Height = this.PageSize.Height;
    wrapper.Background = Brushes.White;

    wrapper.Child = page;

    wrapper.Measure(this.PageSize);
    wrapper.Arrange(new Rect(new Point(0, 0), this.PageSize));
    wrapper.UpdateLayout();

    return new DocumentPage(wrapper);
}
person wesleyjefferson    schedule 06.08.2013