Загрузите XpsDocument из файла.XPS в существующий FixedDocument
Я пытаюсь загрузить файл XPS с диска и распечатать его как часть FixedDocument
или же FixedDocumentSequence
в памяти документы, которые я создал. Они должны быть напечатаны как одна последовательность, потому что они дуплексные.
Вот моя лучшая попытка на данный момент:
// create my memory FixedDocument (a packing slip)
DocumentReference mainDocRef = GetMainDoc(); // created in memory
// load XPS document from file (to print on the back)
XpsDocument xpsDoc = new XpsDocument("flyer.xps", FileAccess.Read);
var docSequenceFromFile = xpsDoc.GetFixedDocumentSequence();
var xpsDocRef = docSequenceFromFile.References.First();
// try to combine together
FixedDocumentSequence documentSequence = new FixedDocumentSequence();
documentSequence.References.Add(mainDocRef);
documentSequence.References.Add(xpsDocRef); // THROWS EXCEPTION
// print
XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(printQueue);
xps.Write(documentSequence, ticket);
Я всегда заканчиваю с исключением:
InvalidOperationException: дополнительная информация: указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его.
Я пробовал несколько способов сделать это, но продолжаю заканчиваться с ошибками как это
Как я могу загрузить XpsDocument
и распечатать его как вторую страницу в FixedDocumentSequence
Я создал в памяти?
1 ответ
Simon_Weaver,
Поскольку я точно не знаю, что возвращается GetMainDoc()
Метод, который я исключил, и только что закомментировал mainDocRef
однако это кажется тривиальным, так как ваша проблема заключается в добавлении загруженного файла XPS в ваш documentSequence
и mainDocRef
несколько не имеет отношения к вопросу (пожалуйста, поправьте меня, если я ошибаюсь).
Теперь проблема, как указано в том, что xpsDoc
загружается в другой элемент (документ), и мы должны отсоединить его как состояние исключения. Однако возможность сделать это защищена internal
метод. При этом самый простой способ - просто перечислить все страницы документа и создать новую страницу из источника перечисляемой страницы в новом документе.
Окончательный код выглядит примерно так... (код прокомментирован)
//DocumentReference mainDocRef = GetMainDoc(); // created in memory. commented as I dont have a reference to what this object contains.
//create our new document reference to add the pages to
DocumentReference newDocReference = new DocumentReference();
// load XPS document from file (to print on the back)
using (XpsDocument xpsDoc = new XpsDocument(@"flyer.xps", FileAccess.Read))
{
var docSequenceFromFile = xpsDoc.GetFixedDocumentSequence();
var xpsDocRef = docSequenceFromFile.References.First();
//get the fixed document to enumerate
FixedDocument xpsFixedDoc = xpsDocRef.GetDocument(false);
//get the fixed document to add to
FixedDocument newFixedDoc = new FixedDocument();
//set the new document reference
newDocReference.SetDocument(newFixedDoc);
//enumerate each page of the fixed document
foreach (PageContent page in xpsFixedDoc.Pages)
{
PageContent newPageContent = new PageContent();
newPageContent.Source = page.Source;
((IUriContext)newPageContent).BaseUri = ((IUriContext)page).BaseUri;
newPageContent.GetPageRoot(true);
newFixedDoc.Pages.Add(newPageContent);
}
}
// try to combine together.
FixedDocumentSequence documentSequence = new FixedDocumentSequence();
//documentSequence.References.Add(mainDocRef); <<-- commented out, re-add after tests
//add the new document reference
documentSequence.References.Add(newDocReference);
// print
XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(printQueue);
xps.Write(documentSequence, ticket);
mainDocRef = null;
newDocReference = null;
Теперь стоит отметить XpsDocument
а также PrintQueue
наследовать от IDisposable
, (Не нужно говорить, что там делать).
Теперь все еще могут быть проблемы с GetMainDoc()
но поскольку ссылка на этот метод не опубликована, я не могу проверить здесь никаких ошибок. Дайте мне знать, как это происходит.
Приветствия. Нико