2010-04-30 8 views
0

Existe-t-il un moyen (bibliothèque ou natif) d'utiliser l'API d'impression pour imprimer un document XPS? J'ai essayé d'utiliser le Document Toolkit API qui fonctionne jusqu'à un certain point, mais je reçois une exception COM lorsque j'essaie de définir PrintPageEventArgs.PageVisual.Silverlight: Impression XPS par programme

+1

Qu'ont Firstfloorsoftware dit à ce sujet quand vous leur avez demandé? – AnthonyWJones

+0

@AnthonyWJones Exception a été un problème de ma part. Ils ont dit que la prochaine version apportera un soutien officiel pour Silverlight 4 et l'impression. Il fournira également une solution de contournement pour les attributs PathGeometry Figure générés par le pilote d'imprimante XPS qui ne sont pas compatibles avec Silverlight (un autre problème que j'ai rencontré). Donc, je tiens pour la prochaine version. – David

Répondre

1

Cela devrait le faire en code natif, ne pas oublier d'activer COM premier:

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