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