2014-01-25 1 views
2

디스크에서 XPS 파일을로드하고 작성한 메모리 문서에 FixedDocument 또는 FixedDocumentSequence의 일부로 인쇄하려고합니다. 이중화되어있어 하나의 시퀀스로 인쇄해야합니다..XPS 파일의 XPSDocument를 기존 FixedDocument에로드하십시오.

// 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의 두 번째 페이지로 인쇄 할 수있는 방법이

같은 오류와 함께 종료 계속 ? 문제는 당신 documentSequence에로드 된 XPS 파일을 추가로 내가 정확히 GetMainDoc() 방법으로 무엇을 반환됩니다 잘 모릅니다으로 나는 그것을 제외하고 단지 mainDocRef refrences을 주석 한

+0

WAG,하지만 [RemoveLogicalChild] (http://msdn.microsoft.com/en-us/library/vstudio/system.windows.frameworkcontentelement.removelogicalchild (v = vs.100) .aspx)를 참조하십시오. FixedDocumentSequence. 이것은 모두 WPF, btw입니다. WPF에서 요소는 코드에서 뒤틀리는 인스턴스를 소유하는 개체 (논리 트리에서 시각적 트리가 만들어지고 다를 수 있음)를 소유하는 개체와 같이 최대 하나의 "논리 부모"를 갖습니다. 당신이 원하는 것을하기 위해서, 당신은 다른 부모에게 다시 연결할 수 있도록 부모와 자식의 연결을 끊어야합니다. 내가 연결 한 방법은 이렇게해야한다고 생각합니다. – Will

+0

@Will this is protected method –

+0

보호뿐만 아니라 내부도 –

답변

0

Simon_Weaver 그러나 이것은 사소한 것 같다 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; 

지금 주목해야 할 한 가지 XpsDocumentIDisposable에서 PrintQueue 상속입니다 보인다. (Dont는 당신에게 무엇을 거기에서해야하는지에 관해 말할 필요가있다).

이제는 GetMainDoc()에 문제가있을 수 있지만이 방법에 대한 참조는 게시되지 않으므로 여기서 오류를 테스트 할 수 없습니다. 어떻게 진행되는지 알려주세요.

건배. Nico

관련 문제