【问题标题】:Silverlight: Print XPS ProgrammaticallySilverlight:以编程方式打印 XPS
【发布时间】:2011-04-04 20:56:04
【问题描述】:

是否有任何方法(库或本机)使用打印 API 打印 XPS 文档?我尝试使用Document Toolkit API,它可以工作到一定程度,但是当我尝试设置PrintPageEventArgs.PageVisual 时出现COM 异常。

【问题讨论】:

  • 当你问他们时,Firstfloorsoftware 是怎么说的?
  • @AnthonyWJones 异常对我来说是个问题。他们表示下一个版本将带来对 Silverlight 4 和打印的官方支持。它还将为 XPS 打印机驱动程序生成的 PathGeometry Figure 属性提供一种解决方法,这些属性与 Silverlight 不兼容(我遇到的另一个问题)。所以我正在等待下一个版本。

标签: silverlight printing xps


【解决方案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);
    }

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多