Как установить размер страницы для документа Xps?
Я пытаюсь сохранить документ XPS с FixedDocument. Пока что мне не удалось изменить размер страницы. Как я могу изменить его на нестандартный размер?
Я основал свой код на первом ответе на этот вопрос, более конкретно, я использую этот код:
if (File.Exists(filename)) {
File.Delete(filename);
}
var oldParent = LogicalTreeHelper.GetParent(this) as ContentControl;
try {
oldParent.Content = null;
FixedDocument doc = new FixedDocument();
PageContent pageCnt = new PageContent();
FixedPage page = new FixedPage();
page.Children.Add(this);
try {
((System.Windows.Markup.IAddChild)pageCnt).AddChild(page);
doc.Pages.Add(pageCnt);
XpsDocument xpsDoc = new XpsDocument(filename, FileAccess.ReadWrite);
try {
var writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
writer.Write(doc);
}
finally {
xpsDoc.Close();
}
}
finally {
page.Children.Clear();
}
}
finally {
((ContentControl)oldParent).Content = this;
}
Он копирует пользовательский элемент управления в документ XPS и делает это успешно, но, как я уже сказал, использует размер бумаги по умолчанию.
Я пытался использовать DocumentPaginator.PageSize
свойство для установки нового размера страницы (после создания экземпляра FixedDocument
), но все, что я назначаю этому свойству, похоже, игнорируется; страница в итоговом документе XPS сохраняет формат бумаги по умолчанию.
Выполняя пошаговое выполнение, я вижу, что значение PageSize
свойство действительно изменилось, поэтому новое значение как-то не принимается DocumentPaginator
,
Я нашел различные онлайн-ресурсы, ни один из которых еще не решил мою проблему:
- Этот форум на MS Social утверждает, что установка
PageSize
собственность работает, но это не так, как я могу сказать. - Документы утверждают, что установка
PageSize
свойство работает и привести пример, который делает то же самое, что я пытался. (Кроме этого, основываясь на этой странице документов, я даже не могу сказать, какую единицу чисел использовать.) - Документы также указывают на
DocumentPage.Size
собственность, однако эта собственность не может быть публично изменена. Действительно ли мне нужно переопределить некоторый класс страницы перед добавлением страницы в документ, чтобы получить другой размер страницы? - Эта публикация на форуме описывает ту же проблему, но ответ кажется мне бессмысленным. Я использую
DocumentPaginator
свойство только когда-либо один раз, так что нет "вызова (...).DocumentPaginator снова", для которого я мог бы сохранить экземпляр. - Этот вопрос звучит многообещающе, но на самом деле речь идет не о размере страницы, а о масштабе изображения на данной странице.
- Помимо вышеупомянутого
PageSize
свойство (которое в любом случае здесь установлено равным размеру по умолчанию), этот учебник используетWidth
а такжеHeight
свойстваFixedPage
, Однако присвоение им некоторых положительных случайных значений для быстрого теста может привести к повреждению моего документа XPS и отображению сообщения об ошибке при открытии XPS Viewer.
2 ответа
FixedDocuments имеют фиксированные страницы. Высота и ширина FixedPage можно контролировать. Примерно так:
FixedPage pageOne = new FixedPage();
pageOne.Height = 20;
pageOne.Width = 10;
или в XAML:
Высота ="20" Ширина ="10"
Я считаю, что FixedDocument будет печатать только по размеру своих страниц. Даже при загрузке FixedDocument в DocumentViewer изменение размера страницы настроек принтера при нажатии кнопки печати не будет иметь никакого эффекта. FixedDocument по самому своему определению точно сохраняет точность своего содержимого.
Единственный способ изменить его - создать производный DocumentPaginator, который вызывает внутренние функции FixedDocument.DocumentPaginator и соответствующим образом изменяет возвращаемые значения.