Aracılığıyla paylaş


Nasıl Yapılır: XPS Yazdırma API'siyle Yazdırma

Bu konuda, bir Windows uygulamasından yazdırmak için XPS Yazdırma API'sinin nasıl kullanılacağı açıklanmaktadır.

XPS Yazdırma API', yerel Windows uygulamalarının XPS belgelerini yazdırmasına olanak tanır. Bir uygulama, XPS Belge API'sinikullanarak bir XPS belgesi oluşturabilir. Ortak XPS Belge Programlama Görevleri yardım konusu bunun nasıl yapılacağını açıklar. Bir XPS belgesi oluşturulduktan sonra uygulama, xps yazdırma API'sini kullanarak yazdırabilir.

Bir uygulamadan belge yazdırmak için XPS Yazdırma API'sini kullanmak aşağıdaki adımları içerir.

XPS Yazdırma API'sinin yazdırmak için bir XPS belgesi gerekir. Aşağıdaki örnekte, XPS belgesi XPS Yazdırma API'si tarafından yazıcıya gönderilirken oluşturulur. XPS Belge API'sini kullanarak ve XPS OM olarak koruyarak veya XPS OM'yi XPS belgesi olarak kaydederek bir XPS belgesini yazıcıya göndermeden bir XPS belgesi oluşturmak da mümkündür. XPS OM kullanma hakkında daha fazla bilgi için bkz. XPS Belge API'si.

COM Arabirimini Başlat

Uygulama henüz yapmadıysa COM arabirimini başlatın.

    // 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;
    }

Tamamlama Etkinliği Oluştur

XPS Yazdırma API'sinin yazdırma biriktiricisi belgenin tamamını uygulamadan aldığında uygulamayı bilgilendirmek için kullandığı bir tamamlama olayı oluşturun. XPS Yazdırma API'si, bir uygulamanın diğer biriktirme işlemleri hakkında bilgi edinebilmesi için bir ilerleme olayını da destekler.

        // 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);
        }

XPS Yazdırma İşi Başlatma

XPS yazdırma işini başlatmak için StartXpsPrintJobfonksiyonunu çağırın. StartXpsPrintJob, uygulamanın yazdırılacak belgeyi göndereceği bir akış döndürür.

        // 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);
        }

IXpsOMPackageWriter Arabirimi Oluşturma

IXpsOMPackageWriter arabirimini oluşturmak için StartXpsPrintJobtarafından döndürülen akışta IXpsOMObjectFactory::CreatePackageWriterOnStream çağrısını yapın.

    // 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;
    }

Bu yazdırma işindeki her belge için yeni bir belge başlatın ve bu belgeye sayfalar ekleyin.

Yeni Belge Başlat

IXpsOMPackageWriter::StartNewDocumentçağırarak paket yazıcısında yeni bir belge başlatın. Bu yöntem çağrıldığında bir belge açıksa kapatılır ve yeni bir belge açılır.

    // 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;
    }

Sayfa Ekle

IXpsOMPackageWriter::AddPageçağırarak belgenin sayfalarından her birini uygulamadan paket yazıcıdaki yeni belgeye yazın.

Not

Uygulamanın bu adımdan önce sayfayı oluşturduğu varsayılır. Belge sayfaları oluşturma ve bunlara içerik ekleme hakkında daha fazla bilgi için bkz. 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);
        }
    }

IXpsOMPackageWriter Arabirimini Kapatma

Bu yazdırma işi için tüm belgeler yazıldıktan sonra, paketi kapatmak için IXpsOMPackageWriter::Close 'kapat'ı arayın.

    if (SUCCEEDED(hr))
    {
        if (FAILED(hr = packageWriter->Close()))
        {
            fwprintf(
                stderr, 
                L"ERROR: Could not close package writer: %08X\n", 
                hr);
        }
    }

Yazdırma İşi Akışını Kapatma

Yazdırma işi akışını, yazdırma işinin tamamının uygulama tarafından gönderildiğini yazdırma sıralayıcıya bildiren Kapat çağrısı yaparak kapatın.

    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();
        }
    }

Tamamlanma Olayını Bekleyin

Yazdırma işinin tamamlanma olayını bekleyin.

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

Tamamlanma olayı işaretlendikten sonra, iş durumunu almak için GetJobStatusçağırın.

    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;
        }
    }

Yayın Kaynakları

Bir iş durumu tamamlandığında, söz konusu yazdırma işi için kullanılan arabirimleri ve kaynakları serbest bırakın.

    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;
    }