2

我正在尝试从磁盘加载 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我在内存中创建的第二页?

4

1 回答 1

0

西蒙韦弗,

由于我不完全知道该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()但由于没有发布对此方法的引用,因此我无法在此处测试任何错误。让我知道事情的后续。

干杯。尼科

于 2014-01-29T05:30:44.403 回答