Yazdırmaya Genel Bakış
Microsoft .NET Framework ile, Windows Presentation Foundation (WPF) kullanan uygulama geliştiricileri, zengin bir yeni yazdırma ve yazdırma sistemi yönetimi API'lerine sahiptir. Windows Vista ile, bu yazdırma sistemi geliştirmelerinden bazıları yönetilmeyen kod kullanarak Windows Forms uygulamaları ve geliştiricileri oluşturan geliştiriciler için de kullanılabilir. Bu yeni işlevselliğin merkezinde yeni XML Kağıt Belirtimi (XPS) dosya biçimi ve XPS yazdırma yolu yer alır.
Bu konu, aşağıdaki bölümleri içerir.
XPS hakkında
XPS elektronik belge biçimi, biriktirici dosya biçimi ve sayfa açıklama dilidir. Platformlar arası belgeler oluşturmak için XML, Open Packaging Conventions (OPC) ve diğer endüstri standartlarını kullanan açık bir belge biçimidir. XPS dijital belgelerin oluşturulduğu, paylaşıldığı, yazdırıldığı, görüntülendiği ve arşivlendiği süreci basitleştirir. XPS hakkında ek bilgi için bkz . XPS Belgeleri.
WPF kullanarak XPS tabanlı içerik yazdırmaya yönelik çeşitli teknikler, PROGRAM ARACıLıĞıYLA XPS Dosyalarını Yazdırma bölümünde gösterilmiştir. Bu konu başlığında yer alan içeriğin gözden geçirilmesi sırasında bu örneklere başvurmak yararlı olabilir. (Yönetilmeyen kod geliştiricileri,MXDC_ESCAPE işlevi. Windows Forms geliştiricileri, API'yi System.Drawing.Printing tam XPS yazdırma yolunu desteklemeyen ancak karma GDI-XPS yazdırma yolunu destekleyen ad alanında kullanmalıdır. Aşağıdaki Yazdırma Yolu Mimarisi'ne bakın.)
XPS Yazdırma Yolu
XML Kağıt Belirtimi (XPS) yazdırma yolu, Yazdırmanın Windows uygulamalarında nasıl işleneceğini yeniden tanımlayan yeni bir Windows özelliğidir. XPS belge sunu dilini (RTF gibi), yazdırma biriktirici biçimini (WMF gibi) ve sayfa açıklama dilini (PCL veya Postscript gibi) değiştirebildiğinden; yeni yazdırma yolu, uygulama yayınından yazdırma sürücüsünde veya cihazda son işlemeye kadar XPS biçimini korur.
XPS yazdırma yolu, geliştiriciler için "gördükleriniz elde ettiğiniz şey" (WYSIWYG) yazdırma, geliştirilmiş renk desteği ve önemli ölçüde geliştirilmiş yazdırma performansı gibi çeşitli avantajlar sağlayan XPS yazıcı sürücüsü modelini (XPSDrv) temel alır. (XPSDrv hakkında daha fazla bilgi için bkz. Windows Sürücü Seti belgeleri.)
XPS belgeleri için yazdırma biriktiricisinin çalışması temelde Windows'un önceki sürümlerindekiyle aynıdır. Ancak, mevcut GDI yazdırma yoluna ek olarak XPS yazdırma yolunu destekleyecek şekilde geliştirilmiştir. Yeni yazdırma yolu yerel olarak bir XPS biriktirici dosyası tüketir. Windows'un önceki sürümleri için yazılmış kullanıcı modu yazıcı sürücüleri çalışmaya devam edecek olsa da, XPS yazdırma yolunu kullanmak için bir XPS yazıcı sürücüsü (XPSDrv) gerekir.
XPS yazdırma yolunun avantajları önemlidir ve şunlardır:
WYSIWYG yazdırma desteği
Kanal başına 32 bit (bpc), CMYK, adlandırılmış renkler, n mürekkepler ve saydamlık ve gradyanlar için yerel destek içeren gelişmiş renk profillerinin yerel desteği.
.NET Framework ve Win32 tabanlı uygulamalar için geliştirilmiş yazdırma performansı.
Endüstri standardı XPS biçimi.
Temel yazdırma senaryoları için kullanıcı arabirimi, yapılandırma ve iş gönderimi için tek bir giriş noktası ile basit ve sezgisel bir API kullanılabilir. Gelişmiş senaryolar için kullanıcı arabirimi, zaman uyumlu veya zaman uyumsuz yazdırma ve toplu yazdırma özellikleri için ek destek eklenir. Her iki seçenek de tam veya kısmi güven modunda yazdırma desteği sağlar.
XPS, genişletilebilirlik göz önünde bulundurularak tasarlanmıştır. Genişletilebilirlik çerçevesi kullanılarak, özellikler ve özellikler XPS'ye modüler bir şekilde eklenebilir. Genişletilebilirlik özellikleri şunlardır:
Şemayı Yazdır'ı seçin. Genel şema düzenli olarak güncelleştirilir ve cihaz özelliklerinin hızlı bir şekilde genişletılmasını sağlar. (Bkz. Aşağıdaki PrintTicket ve PrintCapabilities .)
Genişletilebilir Filtre İşlem Hattı. XPS yazıcı sürücüsü (XPSDrv) filtre işlem hattı, XPS belgelerinin hem doğrudan hem de ölçeklenebilir yazdırılabilmesi için tasarlanmıştır. Daha fazla bilgi için bkz . XPSDrv Yazıcı Sürücüleri.
Yazdırma Yolu Mimarisi
Hem Win32 hem de .NET Framework uygulamaları XPS'yi desteklese de, Win32 ve Windows Forms uygulamaları XPS yazıcı sürücüsü (XPSDrv) için XPS biçimlendirilmiş içerik oluşturmak üzere XPS'ye GDI dönüştürmesi kullanır. Bu uygulamaların XPS yazdırma yolunu kullanması gerekmez ve Gelişmiş Meta Dosyası (EMF) tabanlı yazdırmayı kullanmaya devam edebilir. Ancak, çoğu XPS özelliği ve geliştirmesi yalnızca XPS yazdırma yolunu hedefleyen uygulamalar tarafından kullanılabilir.
Win32 ve Windows Forms uygulamaları tarafından XPSDrv tabanlı yazıcıların kullanımını etkinleştirmek için, XPS yazıcı sürücüsü (XPSDrv), GDI'nin XPS biçimine dönüştürülmesini destekler. XPSDrv modeli, Win32 uygulamalarının XPS Belgelerini yazdırabilmesi için XPS-GDI biçimi için bir dönüştürücü de sağlar. WPF uygulamaları için, yazma işleminin hedef yazdırma kuyruğunda XPSDrv sürücüsü olmadığında, XPS'nin GDI biçimine dönüştürülmesi sınıfın ve WriteAsync yöntemleri XpsDocumentWriter tarafından Write otomatik olarak gerçekleştirilir. (Windows Forms uygulamaları XPS Belgelerini yazdıramaz.)
Aşağıdaki çizimde yazdırma alt sistemi gösterilir ve Microsoft tarafından sağlanan bölümler ile yazılım ve donanım satıcıları tarafından tanımlanan bölümler tanımlanır:
Temel XPS Yazdırma
WPF hem temel hem de gelişmiş API'leri tanımlar. Kapsamlı yazdırma özelleştirmesi veya eksiksiz XPS özellik kümesine erişim gerektirmeyen uygulamalar için temel yazdırma desteği sağlanır. Temel yazdırma desteği, minimum yapılandırma gerektiren ve tanıdık bir kullanıcı arabirimine sahip olan bir yazdırma iletişim kutusu denetimi aracılığıyla kullanıma sunulur. Bu basitleştirilmiş yazdırma modeli kullanılarak birçok XPS özelliği kullanılabilir.
PrintDialog
Denetim kullanıcı System.Windows.Controls.PrintDialog arabirimi, yapılandırma ve XPS iş gönderimi için tek bir giriş noktası sağlar. Denetimin örneğini oluşturma ve kullanma hakkında bilgi için bkz . Yazdırma İletişim Kutusu Çağırma.
Gelişmiş XPS Yazdırma
EKSIKSIZ XPS özellikleri kümesine erişmek için gelişmiş yazdırma API'sinin kullanılması gerekir. Aşağıda ilgili birkaç API daha ayrıntılı olarak açıklanmıştır. XPS yazdırma yolu API'lerinin tam listesi için ve System.Printing ad alanı başvurularına bakınSystem.Windows.Xps.
PrintTicket ve PrintCapabilities
PrintTicket ve PrintCapabilities sınıfları, gelişmiş XPS özelliklerinin temelini oluşturur. Her iki nesne türü de harmanlama, iki taraflı yazdırma, zımbalama gibi yazdırma odaklı özelliklerin XML biçimli yapılarıdır. Bu yapılar yazdırma şeması tarafından tanımlanır. bir PrintTicket yazıcıya yazdırma işinin nasıl işlendiği hakkında bilgi sağlar. sınıfı bir PrintCapabilities yazıcının özelliklerini tanımlar. Bir yazıcının özelliklerini sorgulayarak, PrintTicket yazıcının desteklenen özelliklerinden tam olarak yararlanan bir oluşturulabilir. Benzer şekilde, desteklenmeyen özellikler önlenebilir.
Aşağıdaki örnekte, bir yazıcının PrintCapabilities nasıl sorgulanıp kullanılarak kod oluşturulacağı PrintTicket gösterilmektedir.
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
/// Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
/// A PrintTicket for the current local default printer.</returns>
PrintTicket^ GetPrintTicketFromPrinter ()
{
PrintQueue^ printQueue = nullptr;
LocalPrintServer^ localPrintServer = gcnew LocalPrintServer();
// Retrieving collection of local printer on user machine
PrintQueueCollection^ localPrinterCollection = localPrintServer->GetPrintQueues();
System::Collections::IEnumerator^ localPrinterEnumerator = localPrinterCollection->GetEnumerator();
if (localPrinterEnumerator->MoveNext())
{
// Get PrintQueue from first available printer
printQueue = ((PrintQueue^)localPrinterEnumerator->Current);
} else
{
return nullptr;
}
// Get default PrintTicket from printer
PrintTicket^ printTicket = printQueue->DefaultPrintTicket;
PrintCapabilities^ printCapabilites = printQueue->GetPrintCapabilities();
// Modify PrintTicket
if (printCapabilites->CollationCapability->Contains(Collation::Collated))
{
printTicket->Collation = Collation::Collated;
}
if (printCapabilites->DuplexingCapability->Contains(Duplexing::TwoSidedLongEdge))
{
printTicket->Duplexing = Duplexing::TwoSidedLongEdge;
}
if (printCapabilites->StaplingCapability->Contains(Stapling::StapleDualLeft))
{
printTicket->Stapling = Stapling::StapleDualLeft;
}
return printTicket;
};// end:GetPrintTicketFromPrinter()
// ---------------------- GetPrintTicketFromPrinter -----------------------
/// <summary>
/// Returns a PrintTicket based on the current default printer.</summary>
/// <returns>
/// A PrintTicket for the current local default printer.</returns>
private PrintTicket GetPrintTicketFromPrinter()
{
PrintQueue printQueue = null;
LocalPrintServer localPrintServer = new LocalPrintServer();
// Retrieving collection of local printer on user machine
PrintQueueCollection localPrinterCollection =
localPrintServer.GetPrintQueues();
System.Collections.IEnumerator localPrinterEnumerator =
localPrinterCollection.GetEnumerator();
if (localPrinterEnumerator.MoveNext())
{
// Get PrintQueue from first available printer
printQueue = (PrintQueue)localPrinterEnumerator.Current;
}
else
{
// No printer exist, return null PrintTicket
return null;
}
// Get default PrintTicket from printer
PrintTicket printTicket = printQueue.DefaultPrintTicket;
PrintCapabilities printCapabilites = printQueue.GetPrintCapabilities();
// Modify PrintTicket
if (printCapabilites.CollationCapability.Contains(Collation.Collated))
{
printTicket.Collation = Collation.Collated;
}
if ( printCapabilites.DuplexingCapability.Contains(
Duplexing.TwoSidedLongEdge) )
{
printTicket.Duplexing = Duplexing.TwoSidedLongEdge;
}
if (printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft))
{
printTicket.Stapling = Stapling.StapleDualLeft;
}
return printTicket;
}// end:GetPrintTicketFromPrinter()
' ---------------------- GetPrintTicketFromPrinter -----------------------
''' <summary>
''' Returns a PrintTicket based on the current default printer.</summary>
''' <returns>
''' A PrintTicket for the current local default printer.</returns>
Private Function GetPrintTicketFromPrinter() As PrintTicket
Dim printQueue As PrintQueue = Nothing
Dim localPrintServer As New LocalPrintServer()
' Retrieving collection of local printer on user machine
Dim localPrinterCollection As PrintQueueCollection = localPrintServer.GetPrintQueues()
Dim localPrinterEnumerator As System.Collections.IEnumerator = localPrinterCollection.GetEnumerator()
If localPrinterEnumerator.MoveNext() Then
' Get PrintQueue from first available printer
printQueue = CType(localPrinterEnumerator.Current, PrintQueue)
Else
' No printer exist, return null PrintTicket
Return Nothing
End If
' Get default PrintTicket from printer
Dim printTicket As PrintTicket = printQueue.DefaultPrintTicket
Dim printCapabilites As PrintCapabilities = printQueue.GetPrintCapabilities()
' Modify PrintTicket
If printCapabilites.CollationCapability.Contains(Collation.Collated) Then
printTicket.Collation = Collation.Collated
End If
If printCapabilites.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge) Then
printTicket.Duplexing = Duplexing.TwoSidedLongEdge
End If
If printCapabilites.StaplingCapability.Contains(Stapling.StapleDualLeft) Then
printTicket.Stapling = Stapling.StapleDualLeft
End If
Return printTicket
End Function ' end:GetPrintTicketFromPrinter()
PrintServer ve PrintQueue
PrintServer sınıfı bir ağ yazdırma sunucusunu, sınıfı ise bir yazıcıyı PrintQueue ve onunla ilişkilendirilmiş çıkış işi sırasını temsil eder. Bu API'ler birlikte sunucunun yazdırma işlerinin gelişmiş yönetimine olanak tanır. bir PrintServeröğesini yönetmek PrintQueueiçin bir veya türetilmiş sınıflarından biri kullanılır. AddJob yöntemi kuyruğa yeni bir yazdırma işi eklemek için kullanılır.
Aşağıdaki örnekte, kod kullanarak bir LocalPrintServer oluşturma ve varsayılan PrintQueue değere erişme işlemleri gösterilmektedir.
// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
/// Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
/// An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
// Create a local print server
LocalPrintServer ps = new LocalPrintServer();
// Get the default print queue
PrintQueue pq = ps.DefaultPrintQueue;
// Get an XpsDocumentWriter for the default print queue
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
return xpsdw;
}// end:GetPrintXpsDocumentWriter()
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
''' Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
''' An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
' Create a local print server
Dim ps As New LocalPrintServer()
' Get the default print queue
Dim pq As PrintQueue = ps.DefaultPrintQueue
' Get an XpsDocumentWriter for the default print queue
Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()
XpsDocumentWriter
birçok ve WriteAsync yöntemine Write sahip olan bir XpsDocumentWriter, xps belgelerini bir PrintQueueöğesine yazmak için kullanılır. Örneğin, Write(FixedPage, PrintTicket) yöntemi bir XPS belgesinin çıktısını almak ve PrintTicket zaman uyumlu olarak kullanmak için kullanılır. WriteAsync(FixedDocument, PrintTicket) yöntemi, bir XPS belgesinin çıktısını almak ve PrintTicket zaman uyumsuz olarak kullanmak için kullanılır.
Aşağıdaki örnekte, kullanarak kod oluşturma XpsDocumentWriter gösterilmektedir.
// -------------------- GetPrintXpsDocumentWriter() -------------------
/// <summary>
/// Returns an XpsDocumentWriter for the default print queue.</summary>
/// <returns>
/// An XpsDocumentWriter for the default print queue.</returns>
private XpsDocumentWriter GetPrintXpsDocumentWriter()
{
// Create a local print server
LocalPrintServer ps = new LocalPrintServer();
// Get the default print queue
PrintQueue pq = ps.DefaultPrintQueue;
// Get an XpsDocumentWriter for the default print queue
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
return xpsdw;
}// end:GetPrintXpsDocumentWriter()
' -------------------- GetPrintXpsDocumentWriter() -------------------
''' <summary>
''' Returns an XpsDocumentWriter for the default print queue.</summary>
''' <returns>
''' An XpsDocumentWriter for the default print queue.</returns>
Private Function GetPrintXpsDocumentWriter() As XpsDocumentWriter
' Create a local print server
Dim ps As New LocalPrintServer()
' Get the default print queue
Dim pq As PrintQueue = ps.DefaultPrintQueue
' Get an XpsDocumentWriter for the default print queue
Dim xpsdw As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(pq)
Return xpsdw
End Function ' end:GetPrintXpsDocumentWriter()
Yöntemler AddJob ayrıca yazdırma yolları da sağlar. Bkz. Program Aracılığıyla XPS Dosyalarını Yazdırma. bölümüne bakın.
GDI Yazdırma Yolu
WPF uygulamaları XPS yazdırma yolunu yerel olarak desteklese de, Win32 ve Windows Forms uygulamaları da bazı XPS özelliklerinden yararlanabilir. XPS yazıcı sürücüsü (XPSDrv), GDI tabanlı çıkışı XPS biçimine dönüştürebilir. Gelişmiş senaryolarda, Microsoft XPS Belge Dönüştürücüsü (MXDC) kullanılarak içeriğin özel dönüştürülmesi desteklenir. Benzer şekilde WPF uygulamaları da sınıfının veya WriteAsync yöntemlerinden birini Write çağırarak ve XpsDrv olmayan bir yazıcıyı XpsDocumentWriter hedef yazdırma kuyruğu olarak belirleyerek GDI yazdırma yoluna çıkış yapabilir.
XPS işlevselliği veya desteği gerektirmeyen uygulamalar için geçerli GDI yazdırma yolu değişmeden kalır.
- GDI yazdırma yolu ve çeşitli XPS dönüştürme seçenekleriyle ilgili ek başvuru malzemeleri için bkz . Microsoft XPS Belge Dönüştürücüsü (MXDC) ve XPSDrv Yazıcı Sürücüleri.
XPSDrv Sürücü Modeli
XPS yazdırma yolu, XPS özellikli bir yazıcıya veya sürücüye yazdırırken yerel yazdırma havuzu biçimi olarak XPS kullanarak biriktirici verimliliğini artırır. Basitleştirilmiş biriktirme işlemi, belge biriktirilmeden önce EMF veri dosyası gibi bir ara biriktirici dosyası oluşturma gereksinimini ortadan kaldırır. XpS yazdırma yolu, daha küçük biriktirici dosya boyutları aracılığıyla ağ trafiğini azaltabilir ve yazdırma performansını artırabilir.
EMF, uygulama çıkışını işleme hizmetleri için GDI'ya yapılan bir dizi çağrı olarak temsil eden kapalı bir biçimdir. EMF'nin aksine, XPS biriktirici biçimi, XPS tabanlı bir yazıcı sürücüsüne (XPSDrv) çıkış yapıldığında daha fazla yorum gerektirmeden gerçek belgeyi temsil eder. Sürücüler doğrudan biçimdeki veriler üzerinde çalışabilir. Bu özellik, EMF dosyalarını ve GDI tabanlı yazdırma sürücülerini kullandığınızda gereken veri ve renk alanı dönüştürmelerini ortadan kaldırır.
Bir XPS yazıcı sürücüsünü (XPSDrv) hedefleyen XPS Belgeleri kullandığınızda, EMF eşdeğerleriyle karşılaştırıldığında, biriktirilen dosya boyutları genellikle azalır; ancak, özel durumlar vardır:
Çok karmaşık, çok katmanlı veya verimsiz yazılmış bir vektör grafiği, aynı grafiğin bit eşlemli sürümünden daha büyük olabilir.
Ekran görüntüleme amacıyla, XPS dosyaları cihaz yazı tiplerini ve bilgisayar tabanlı yazı tiplerini ekler; GDI biriktirici dosyaları ise cihaz yazı tiplerini eklemez. Ancak her iki yazı tipi türü de alt kümelenir (aşağıya bakın) ve yazıcı sürücüleri dosyayı yazıcıya iletmeden önce cihaz yazı tiplerini kaldırabilir.
Havuz boyutunu küçültme işlemi çeşitli mekanizmalar aracılığıyla gerçekleştirilir:
Yazı tipi alt ayarı. Yalnızca gerçek belge içinde kullanılan karakterler XPS dosyasında depolanır.
Gelişmiş Grafik Desteği. Saydamlık ve gradyan temelleri için yerel destek, XPS Belgesi'ndeki içeriğin rasterleştirilmesini önler.
Ortak kaynakların tanımlaması. Birden çok kez kullanılan kaynaklar (şirket logosunu temsil eden bir resim gibi) paylaşılan kaynaklar olarak kabul edilir ve yalnızca bir kez yüklenir.
ZIP sıkıştırma. Tüm XPS belgeleri ZIP sıkıştırması kullanır.
Ayrıca bkz.
.NET Desktop feedback