Silverlight: программная печать XPS

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


person David    schedule 30.04.2010    source источник
comment
Что сказали об этом Firstfloorsoftware, когда вы спросили их?   -  person AnthonyWJones    schedule 01.05.2010
comment
Исключение @AnthonyWJones было проблемой с моей стороны. Они сказали, что в следующем выпуске будет официальная поддержка Silverlight 4 и печати. Это также обеспечит обходной путь для атрибутов рисунка PathGeometry, созданных драйвером принтера XPS, которые несовместимы с Silverlight (еще одна проблема, с которой я столкнулся). Так что жду следующего релиза.   -  person David    schedule 04.05.2010


Ответы (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);
    }
person Tony Edgecombe    schedule 20.09.2010