2010-04-30 183 views
0

有什么方法(库或本机)使用打印API来打印XPS文档?我尝试了使用Document Toolkit API,这个工作达到了一定程度,但是当我尝试设置PrintPageEventArgs.PageVisual时,出现COM异常。Silverlight:以编程方式打印XPS

+1

什么都Firstfloorsoftware说一下吧,当你问他们? – AnthonyWJones 2010-04-30 22:02:15

+0

@AnthonyWJones异常是我的一个问题。他们表示,下一个版本将为Silverlight 4和打印带来官方支持。它还将为由XPS打印机驱动程序生成的PathGeometry Figure属性提供一种变通方法,这些属性与Silverlight不兼容(我遇到的另一个问题)。所以我支持下一个版本。 – David 2010-05-03 22:33:27

回答

1

这应做到在本地代码,不要忘了先启用COM:

SmartHandle event = ::CreateEvent(NULL, TRUE, FALSE, NULL); 
    if (event.get() == 0) 
    { 
     ::AtlThrow(::GetLastError()); 
    } 

    CComPtr<IXpsOMObjectFactory> pXpsFactory; 
    HRESULT hr = pXpsFactory.CoCreateInstance(CLSID_XpsOMObjectFactory); 
    if (FAILED(hr)) 
    { 
     ::AtlThrow(hr); 
    } 

    CComPtr<IXpsPrintJobStream> pDocumentStream; 
    hr = ::StartXpsPrintJob(printer, file, NULL, NULL, event.get(), NULL, NULL, NULL, &pDocumentStream, NULL); 
    if (FAILED(hr)) 
    { 
     ::AtlThrow(hr); 
    } 

    CComPtr<IXpsOMPackage> pXpsOMPackage; 

    hr = pXpsFactory->CreatePackageFromFile(argv[2], false, &pXpsOMPackage); 
    if (FAILED(hr)) 
    { 
     ::AtlThrow(hr); 
    } 

    hr = pXpsOMPackage->WriteToStream(pDocumentStream, FALSE); 
    if (FAILED(hr)) 
    { 
     ::AtlThrow(hr); 
    } 

    pDocumentStream->Close(); 

    if (::WaitForSingleObject(event.get(), INFINITE) != WAIT_OBJECT_0) 
    { 
     ::AtlThrow(hr); 
    } 
相关问题