Anvisningar: Skriv ut med XPS Print API
Det här avsnittet beskriver hur du använder XPS Print API för att skriva ut från ett Windows-program.
MED XPS Print API kan inbyggda Windows-program skriva ut XPS-dokument. Ett program kan skapa ett XPS-dokument med hjälp av XPS-dokument-API:et. I Vanliga programmeringsuppgifter för XPS-dokument hjälpavsnittet beskrivs hur du gör detta. När ett XPS-dokument har skapats kan programmet använda XPS Print API för att skriva ut det.
Att använda XPS Print API för att skriva ut ett dokument från ett program omfattar följande steg.
- Initiera COM-gränssnitt
- Skapa en avslutningshändelse
- Starta ett XPS-utskriftsjobb
- Skapa ett IXpsOMPackageWriter-gränssnitt
- Stäng IXpsOMPackageWriter-gränssnittet
- Stäng utskriftsjobbströmmen
- Vänta på slutförandehändelsen
- Frigör resurser
XPS Print API kräver ett XPS-dokument för utskrift. I följande exempel skapas XPS-dokumentet när det skickas till skrivaren av XPS Print API. Det går också att skapa ett XPS-dokument utan att skicka det till en skrivare med hjälp av XPS-dokument-API:et och underhålla det som en XPS OM eller genom att spara XPS OM som ett XPS-dokument. Mer information om hur du använder en XPS OM finns i XPS-dokument-API:et.
Initiera COM-gränssnittet
Initiera COM-gränssnittet om programmet inte redan har gjort det.
// 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;
}
Skapa en slutförandehändelse
Skapa en slutförandehändelse som XPS Print API använder för att meddela programmet när utskriftshanteraren har tagit emot hela dokumentet från programmet. XPS Print API stöder också en förloppshändelse så att ett program kan känna till annan spoolningsaktivitet.
// 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);
}
Starta ett XPS-utskriftsjobb
Starta ett XPS-utskriftsjobb genom att anropa StartXpsPrintJob. StartXpsPrintJob returnerar en ström där programmet skickar dokumentet som ska skrivas ut.
// 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);
}
Skapa ett IXpsOMPackageWriter-gränssnitt
Skapa ett IXpsOMPackageWriter--gränssnitt genom att anropa IXpsOMObjectFactory::CreatePackageWriterOnStream på strömmen som returneras av 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;
}
För varje dokument i det här utskriftsjobbet startar du ett nytt dokument och lägger sedan till sidor i dokumentet.
Starta ett nytt dokument
Starta ett nytt dokument i paketskrivaren genom att anropa IXpsOMPackageWriter::StartNewDocument. Om ett dokument är öppet när den här metoden anropas stängs det och ett nytt dokument öppnas.
// 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;
}
Lägga till en sida
Anropa IXpsOMPackageWriter::AddPage för att skriva vart och ett av dokumentets sidor från programmet till det nya dokumentet i paketskrivaren.
Not
Programmet antas ha skapat sidan före det här steget. Mer information om hur du skapar dokumentsidor och lägger till innehåll i dem finns i Common XPS Document Programming Tasks.
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);
}
}
Stäng IXpsOMPackageWriter-gränssnittet
När alla dokument har skrivits för det här utskriftsjobbet anropar du IXpsOMPackageWriter::Stäng för att stänga paketet.
if (SUCCEEDED(hr))
{
if (FAILED(hr = packageWriter->Close()))
{
fwprintf(
stderr,
L"ERROR: Could not close package writer: %08X\n",
hr);
}
}
Stäng utskriftsjobbströmmen
Stäng utskriftsjobbströmmen genom att anropa Stäng, som meddelar utskriftshanteraren att hela utskriftsjobbet har skickats av programmet.
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();
}
}
Vänta på slutförandehändelsen
Vänta tills utskriftsjobbet har slutförts.
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);
}
}
När slutförandehändelsen har signalerats anropar du GetJobStatus för att hämta jobbstatusen.
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;
}
}
Frigör resurser
När jobbstatusen har angetts som slutförd släpper du de gränssnitt och resurser som används för det här utskriftsjobbet.
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;
}