Загрузите 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() но поскольку ссылка на этот метод не опубликована, я не могу проверить здесь никаких ошибок. Дайте мне знать, как это происходит.

Приветствия. Нико

Другие вопросы по тегам