Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma popisuje, jak pomocí rozhraní XPS Print API tisknout z aplikace pro Windows.
Rozhraní XPS Print API umožňuje nativním aplikacím systému Windows tisknout dokumenty XPS. Aplikace může vytvořit dokument XPS pomocí XPS Document API. Běžné úlohy programování dokumentů XPS téma nápovědy popisuje, jak to udělat. Po vytvoření dokumentu XPS může aplikace k tisku použít rozhraní XPS Print API.
Použití rozhraní XPS Print API k tisku dokumentu z aplikace zahrnuje následující kroky.
- inicializace rozhraní COM
- Vytvoření události dokončení
- spuštění tiskové úlohy XPS
- Vytvořte rozhraní IXpsOMPackageWriter
- Zavřete rozhraní IXpsOMPackageWriter
- Zavřít stream tiskové úlohy
- počkat na dokončovací událost
- Uvolnění prostředků
Rozhraní XPS Print API vyžaduje tisk dokumentu XPS. V následujícím příkladu je dokument XPS vytvořen tak, jak je odeslán do tiskárny rozhraním XPS Print API. Dokument XPS je také možné vytvořit bez odeslání do tiskárny pomocí rozhraní XPS Document API a jeho údržby jako XPS OM nebo uložením OM XPS jako dokumentu XPS. Další informace o použití OM XPS naleznete v rozhraní XPS Document API.
Inicializace rozhraní COM
Inicializujte rozhraní COM, pokud již aplikace neučinila.
// Initialize the COM interface, if the application has not
// already done so.
if (FAILED(hr = CoInitializeEx(0, COINIT_MULTITHREADED)))
{
fwprintf(stderr,
L"ERROR: CoInitializeEx failed with HRESULT 0x%X\n", hr);
return 1;
}
Vytvořit událost dokončení
Vytvořte dokončovací událost, kterou rozhraní XPS Print API používá k upozornění aplikace, když tisková fronta přijme celý dokument z aplikace. Rozhraní XPS Print API podporuje také událost průběhu, aby aplikace věděla o jiné aktivitě zařazování.
// Create the completion event
completionEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!completionEvent)
{
hr = HRESULT_FROM_WIN32(GetLastError());
fwprintf(stderr,
L"ERROR: Could not create completion event: %08X\n", hr);
}
Zahájit tiskovou úlohu XPS
Spusťte tiskovou úlohu XPS voláním StartXpsPrintJob. StartXpsPrintJob vrátí datový proud, do kterého aplikace odešle dokument k vytištění.
// Start an XPS Print Job
if (FAILED(hr = StartXpsPrintJob(
printerName,
NULL,
NULL,
NULL,
completionEvent,
NULL,
0,
&job,
&jobStream,
NULL
)))
{
fwprintf(stderr,
L"ERROR: Could not start XPS print job: %08X\n", hr);
}
Vytvoření rozhraní IXpsOMPackageWriter
Vytvořte rozhraní IXpsOMPackageWriter voláním IXpsOMObjectFactory::CreatePackageWriterOnStream streamu vráceného StartXpsPrintJob.
// Create an XPS OM Object Factory. If one has already been
// created by the application, a new one is not necessary.
if (SUCCEEDED(hr))
{
if (FAILED(hr = CoCreateInstance(
__uuidof(XpsOMObjectFactory),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&xpsFactory))))
{
fwprintf(
stderr,
L"ERROR: Could not create XPS OM Object Factory: %08X\n",
hr);
}
}
// Create the Part URI for the Fixed Document Sequence. The
// Fixed Document Sequence is the top-level element in the
// package hierarchy of objects. There is one Fixed Document
// Sequence in an XPS document.
//
// The part name is not specified by the XML Paper Specification,
// however, the name used in this example is the part name
// used by convention.
//
if (SUCCEEDED(hr))
{
if (FAILED(hr = xpsFactory->CreatePartUri(
L"/FixedDocumentSequence.fdseq",
&partUri)))
{
fwprintf(stderr,
L"ERROR: Could not create part URI: %08X\n", hr);
}
}
// Create the package writer on the print job stream.
if (SUCCEEDED(hr))
{
if (FAILED(hr = xpsFactory->CreatePackageWriterOnStream(
jobStream,
TRUE,
XPS_INTERLEAVING_ON,
partUri,
NULL,
NULL,
NULL,
NULL,
&packageWriter
)
)
)
{
fwprintf(
stderr,
L"ERROR: Could not create package writer: 0x%X\n",
hr);
}
}
// Release the part URI interface.
if (partUri)
{
partUri->Release();
partUri = NULL;
}
Pro každý dokument v této tiskové úloze spusťte nový dokument a přidejte do tohoto dokumentu stránky.
Vytvořit nový dokument
Spusťte nový dokument v zapisovači balíčku voláním IXpsOMPackageWriter::StartNewDocument. Pokud je dokument otevřen při zavolání této metody, zavře se a otevře se nový dokument.
// Create the Part URI for the Fixed Document. The
// Fixed Document part contains the pages of the document.
// There can be one or more Fixed Documents in an XPS document.
//
// The part name is not specified by the XML Paper Specification,
// however, the name format used in this example is the format
// used by convention. The number "1" in this example must be
// changed for each document in the package. For example, 1
// for the first document, 2 for the second, and so on.
//
if (SUCCEEDED(hr))
{
if (FAILED(hr = xpsFactory->CreatePartUri(
L"/Documents/1/FixedDocument.fdoc",
&partUri)))
{
fwprintf(
stderr,
L"ERROR: Could not create part URI: %08X\n",
hr);
}
}
// Start the new document.
//
// If there was already a document started in this page,
// this call will close it and start a new one.
if (SUCCEEDED(hr))
{
if (FAILED(hr = packageWriter->StartNewDocument(
partUri,
NULL,
NULL,
NULL,
NULL)))
{
fwprintf(
stderr,
L"ERROR: Could not start new document: 0x%X\n",
hr);
}
}
// Release the part URI interface
if (partUri)
{
partUri->Release();
partUri = NULL;
}
Přidání stránky
Pro zápis každé stránky dokumentu z aplikace do nového dokumentu použijte IXpsOMPackageWriter::AddPage v zapisovači balíčků.
Poznámka
Předpokládá se, že aplikace vytvořila stránku před tímto krokem. Další informace o vytváření stránek dokumentu a přidávání obsahu do nich naleznete v běžné úlohy programování dokumentů XPS.
if (SUCCEEDED(hr))
{
// Add the current page to the document.
if (FAILED(hr = packageWriter->AddPage(
xpsPage,
&pageSize,
NULL,
NULL,
NULL,
NULL
)))
{
fwprintf(
stderr,
L"ERROR: Could not add page to document: %08X\n",
hr);
}
}
Zavřete rozhraní IXpsOMPackageWriter.
Až budou všechny dokumenty pro tuto tiskovou úlohu připraveny, zavolejte IXpsOMPackageWriter::Close, aby se balíček uzavřel.
if (SUCCEEDED(hr))
{
if (FAILED(hr = packageWriter->Close()))
{
fwprintf(
stderr,
L"ERROR: Could not close package writer: %08X\n",
hr);
}
}
Zavření streamu tiskové úlohy
Datový proud tiskové úlohy zavřete voláním Zavřít, což informuje zařazování tisku, že aplikace odeslala celou tiskovou úlohu.
if (SUCCEEDED(hr))
{
if (FAILED(hr = jobStream->Close()))
{
fwprintf(
stderr,
L"ERROR: Could not close job stream: %08X\n",
hr);
}
}
else
{
// Only cancel the job if we succeeded in creating a job.
if (job)
{
// Tell the XPS Print API that we're giving up.
// Don't overwrite hr with the return from this function.
job->Cancel();
}
}
Čekání na událost dokončení
Počkejte na událost dokončení tiskové úlohy.
if (SUCCEEDED(hr))
{
wprintf(L"Waiting for job completion...\n");
if (WaitForSingleObject(completionEvent, INFINITE) !=
WAIT_OBJECT_0)
{
hr = HRESULT_FROM_WIN32(GetLastError());
fwprintf(
stderr,
L"ERROR: Wait for completion event failed: %08X\n",
hr);
}
}
Po signálu události dokončení zavolejte GetJobStatus k získání stavu úlohy.
if (SUCCEEDED(hr))
{
if (FAILED(hr = job->GetJobStatus(&jobStatus)))
{
fwprintf(
stderr,
L"ERROR: Could not get job status: %08X\n",
hr);
}
}
if (SUCCEEDED(hr))
{
switch (jobStatus.completion)
{
case XPS_JOB_COMPLETED:
break;
case XPS_JOB_CANCELLED:
fwprintf(stderr, L"ERROR: job was cancelled\n");
hr = E_FAIL;
break;
case XPS_JOB_FAILED:
fwprintf(
stderr,
L"ERROR: Print job failed: %08X\n",
jobStatus.jobStatus);
hr = E_FAIL;
break;
default:
fwprintf(stderr, L"ERROR: unexpected failure\n");
hr = E_UNEXPECTED;
break;
}
}
Uvolnit zdroje
Po dokončení úlohy uvolněte rozhraní a prostředky použité pro tuto tiskovou úlohu.
if (packageWriter)
{
packageWriter->Release();
packageWriter = NULL;
}
if (partUri)
{
partUri->Release();
partUri = NULL;
}
if (xpsFactory)
{
xpsFactory->Release();
xpsFactory = NULL;
}
if (jobStream)
{
jobStream->Release();
jobStream = NULL;
}
if (job)
{
job->Release();
job = NULL;
}
if (completionEvent)
{
CloseHandle(completionEvent);
completionEvent = NULL;
}