2010-04-30 8 views
0

Есть ли способ (библиотека или родной) использовать API печати для печати документа XPS? Я попытался использовать Document Toolkit API, который работает до определенной точки, но я получаю исключение COM, когда пытаюсь установить PrintPageEventArgs.PageVisual.Silverlight: Print XPS Programmatically

+1

Что Firstfloorsoftware сказал об этом, когда вы спросили их? – AnthonyWJones

+0

@ AnthonyWJones Исключение было проблемой на моем конце. Они сказали, что следующий релиз принесет официальную поддержку Silverlight 4 и печати. Он также обеспечит обходной путь для атрибутов PathGeometry Figure, созданных драйвером принтера XPS, которые не совместимы с Silverlight (другая проблема, с которой я столкнулся). Так что я удержался за следующий выпуск. – David

ответ

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); 
    }