مشاركة عبر


نظرة عامة حول الطباعة

مع Microsoft NET Framewor.، مطورو التطبيقات المستخدمين Windows Presentation Foundation (WPF) يكون لديهم مجموعة جديدة ثرية من إدارة نظام الطباعة و الطباعة واجهات API. مع Windows Vista, بعض هذه التحسينات لنظام الطباعة تتوفر أيضاً للمطورين الذين ينشئوا تطبيقات Windows Forms و المطورين الذين يستخدموا التعليمات البرمجية غير المُدارة. أساسية هذه الوظيفة الجديدة هو تنسيق ملف تصميم مستندات XML (XPS) جديد و مسار طباعة XPS.

يشتمل هذا الموضوع على الأقسام التالية.

  • حول XPS

  • مسار طباعة XPS

  • مسار طباعة GDI

  • طراز برنامج تشغيل الجهاز XPSDrv

  • مواضيع ذات صلة

حول XPS

XPS هو تنسيق مستند إلكتروني, تنسيق ملف التخزين المؤقت و لغة وصف الصفحة. هو على تنسيق مستند مفتوح يستخدم XML، Open Packaging Conventions (OPC)، والمقاييس الصناعية الأخرى لإنشاء مستندات عبر الأنظمة الأساسية. XPSيسهل عملية بمستندات رقمي التي يتم تاريخ الإنشاء مشاركة، تاريخ الطباعة، عرضه أرشفة. و لمزيد من المعلومات على XPS، راجع موقع ويب XPS.

عدة أساليب لطباعة محتوى مستند إلى XPS باستخدام WPF موضّحة في كيفية القيام بما يلي: طباعة ملفات XPS برمجياً. قد تجد أنه مفيدة إلى تشير هذه العينات أثناء مراجعة للمحتوى الموجودة في هذا إلى صورة. (يجب على مطوري تعليمات برمجية غير المدارة مراجعة التعليمات ل "محوّل مستندات XPS Microsoft Office 2010 Suite" الهروب طابعة. Windows Formsيجب أن يستخدم المطورونAPIفيSystem.Drawing.Printingمساحة الاسم التي لا تدعم بالكاملXPSمسار طباعة، ولكن عدم دعم مسار. طباعة GDI-إلى-XPS مختلط راجع بنية مسار الطباعة أدناه).

مسار طباعة XPS

مسار طباعة تصميم مستندات XML (XPS) هو ميزة Windows جديدة التي تعيد تعريف كيفية معالجة الطباعة في تطبيقات Windows. لأن XPS يمكنه استبدال لغة العرض تقديمي للمستند (مثل RTF) , تنسيق المخزن المؤقت للطباعة (مثل WMF) و لغة وصف الصفحة (مثل PCL أو Postscript); يحتفظ مسار الطباعة الجديد بتنسيق XPS من منشور التطبيق إلى المعالجة النهائية في برنامج تشغيل أو جهاز الطباعة.

مسار طباعة XPS مبنية على أساس طراز برنامج تشغيل الطابعة XPS (XPSDrv)، والتي توفر العديد من الفوائد للمطورين مثل طباعة "ما تراه هو ما تحصل عليه" (WYSIWYG), دعم الألوان المحسَّنة وأداء الطباعة المحسَّن بشكل ملحوظ. (للمزيد عن XPSDrv, راجع ‏‫أداة تطوير برنامج تشغيل الجهاز Windows‬.)

عملية التخزين المؤقت لمستندات XPS هو بشكل أساسي نفسه كما في الإصدارات السابقة من Windows. ومع ذلك، تم تحسينه لدعم مسار طباعة XPS بالإضافة إلى مسار طباعة GDI الموجود. مسار الطباعة الجديد أصلاً يستهلك ملف التخزين المؤقت XPS. بينما برامج تشغيل الطابعات في وضع المستخدم المكتوبة من أجل الإصدارات السابقة من Windows ستتابع عملها، يكون مطلوباً برنامج تشغيل الطابعة XPS (XPSDrv) من أجل استخدام مسار طباعة XPS.

فوائد مسار طباعة XPS جوهرية, و تتضمن:

  • دعم طباعة WYSIWYG

  • دعم أصلي لملفات تعريف اللون المتقدم ، والذي يتضمن ٣٢ بت لكل قناة (bpc) ،CMYK ،الألوان المسماة, أحبار n و دعم أصلي للشفافية والتدرجات.

  • أداء الطباعة المحسَّن للتطبيقات المستندة إلى NET Framewor. و Win32.

  • تنسيق صناعة قياسية XPS.

لسيناريوهات الطباعة الأساسية ، API بسيط و بديهي يكون متوفر مع نقطة دخول واحدة لواجهة المستخدم, التكوين و المهمة الإرسال. للسيناريوهات المتقدمة ، دعم إضافي يُضاف إلى تخصيص واجهة المستخدم (UI) (أو لا واجهة المستخدم على الإطلاق) ، الطباعة المتزامنة أو غير المتزامنة و قدرات طباعة الدفعي. كلاً من الخيارين يوفر دعم الطباعة في وضع الثقة الكاملة أو الجزئية.

XPS تم تصميمه مع القابلية للتوسعة في الاعتبار. باستخدام الإطار القابل للتوسعة, يمكن إضافة الميزات والقدرات إلي XPS في طريقة نمطية. تتضمن الميزات القابلة للتوسع ما يلي:

  • مخطط الطباعة. المخطط العام يتم تحديثه بشكل منتظم و تمكين الملحق السريع من قدرات الجهاز. (راجع PrintTicket و PrintCapabilities أدناه).

  • تدفقات تصفية القابلة للتوسعة. تدفقات تصفية برنامج تشغيل الطابعة XPS (XPSDrv) تم تصميمها لتمكين الطباعة المباشرة و غير القابلة للتحجيم من مستندات XPS. (ابحث عن "XPSDrv" في أداة تطوير برنامج تشغيل الجهاز Windows).

بنية مسار الطباعة

بينما كلا من تطبيقات Win32 و NET Framewor. تدعم XPS ، تطبيقات Win32 و Windows Forms تستخدم GDI إلى تحويل XPS من أجل إنشاء محتوي XPS منسَّق لبرنامج تشغيل الطابعة XPS (XPSDrv). هذه التطبيقات غير مطلوبة لاستخدام مسار طباعة XPS و يمكن متابعة استخدام الطباعة المستندة إلي ملف تعريف محسّن (EMF). مع ذلك، معظم ميزات XPS و تحسينات تتوفر فقط إلي التطبيقات التي تستهدف مسار طباعة XPS.

لتمكين استخدام الطابعات المستندة إلى XPSDrv خلال تطبيقات Win32 و Windows Forms، برنامج تشغيل الطابعة XPS (XPSDrv) يدعم تحويل GDI إلي تنسيق XPS. يوفر طراز XPSDrv أيضاً محول لـ XPS إلي تنسيق GDI بحيث يمكن لتطبيقات Win32 طباعة مستندات XPS. لتطبيقات WPF, التحويل من تنسيق XPS إلى GDI يتم تلقائياً عن طريق أساليب Write و WriteAsync منم فئة XpsDocumentWriter كلما كانت قائمة انتظار طباعة الهدف من عملية الكتابة لا تحتوي على برنامج تشغيل XPSDrv. ( تطبيقات Windows Forms لا يمكنها طباعة مستندات XPS.)

يصف الرسم التوضيحي التالي النظام الفرعي للطباعة و يقوم بتعريف أجزاء يوفرها Microsoft ، و الأجزاء المعرّفة من قِبل البرامج وبائعي الأجهزة.

نظام الطباعة XPS

طباعة XPS أساسية

WPF يعرّف كلاً من API الأساسي و المتقدم. للتطبيقات التي لا تتطلب تخصيص طباعة شامل أو الوصول إلى مجموعة ميزات XPS الكاملة, يتوفر دعم الطباعة الأساسي. دعم الطباعة الأساسية يتم عرضها من خلال عنصر تحكم مربع حوار الطباعة الذي يتطلب تكوين الحد الأدنى و ميزات واجهة المستخدم المألوفة. العديد من ميزات XPS تتوفر باستخدام هذا الطراز للطباعة المبسط.

طباعة
الحوار

عنصر تحكم System.Windows.Controls.PrintDialog يوفر نقطة دخول واحدة واجهة المستخدم ، التكوين، و XPS إرسال المهمة. لمزيد من المعلومات حول كيفية إنشاء مثيل و استخدام عنصر التحكم, راجع كيفية القيام بما يلي: استدعاء حوار الطباعة.

طباعة XPS متقدم

للوصول إلى مجموعة كاملة من ميزات XPS, يجب استخدام API الطباعة المتقدم. يتم وصف عدة API ذات صلة بتفصيل أكبر أدناه. للحصول على قائمة كاملة من XPS مسار الطباعة واجهات API, راجع مراجع مساحة الاسم System.Windows.Xps و System.Printing.

PrintTicket و PrintCapabilities

فئات PrintTicket و PrintCapabilities هم أساس ميزات XPS المتقدمة. كلا النوعين من الكائنات هي XMLتهيئة بنية موجهة للطباعة ميزات مثل كـ ترتيب النسخ وطباعة على الوجهين، التدبيس والخ يتم تعريف هذه البنى قبل طباعة المخطط. PrintTicket يرشد طابعة إلي كيفية معالجة مهمة طباعة. فئة PrintCapabilities تعرِّف قدرات الطابعة. عن طريق الاستعلام عن قدرات الطابعة، يمكن إنشاء PrintTicket الذي يستفيد بالكامل من ميزات المدعمة للطابعة. وبشكل مماثل، يمكن أن يتم تجنب الميزات غير المدعمة.

يوضح المثال التالي كيفية الاستعلام عن PrintCapabilitiesمن طابعة و إنشاء PrintTicket باستخدام التعليمات البرمجية.

' ---------------------- 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()
// ---------------------- 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>
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()

PrintServer و PrintQueue

فئة PrintServer تمثل ملقم طباعة شبكة الاتصال و فئة PrintQueue تمثل طابعة و قائمة انتظار مهمة الإخراج المقترن به. معاً، هذه واجهات API تسمح بالإدارة المتقدمة لمهام طباعة الملقم. PrintServer, أو أحد الفئات المشتقة منها, تُستخدَم لإدارة PrintQueue. أسلوب AddJob يُستخدم لإدراج مهمة طباعة جديدة إلي قائمة الانتظار.

يوضح المثال التالي كيفية إنشاء LocalPrintServer و الوصول إلي PrintQueue الافتراضي الخاص به باستخدام التعليمات البرمجية.

        ' -------------------- 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()
// -------------------- 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()

XpsDocumentWriter

XpsDocumentWriter ، مع أساليب Write و WriteAsync العديدة الخاصة به, تستخدم لكتابة مستندات XPS إلى PrintQueue. على سبيل المثال، أسلوب Write(FixedPage, PrintTicket) يستخدم لإخراج مستند XPSو PrintTicket بشكل متزامن. أسلوب WriteAsync(FixedDocument, PrintTicket) يستخدم لإخراج مستند XPS و PrintTicket بشكل غير متزامن.

يوضح المثال التالي كيفية إنشاء XpsDocumentWriter باستخدام التعليمات البرمجية.

        ' -------------------- 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()
// -------------------- 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()

أساليب AddJob أيضاً توفر طرق للطباعة. انظر كيفية القيام بما يلي: طباعة ملفات XPS برمجياً للحصول على التفاصيل.

مسار طباعة GDI

بينما تطبيقات WPF تدعم أصلاً مسار طباعة XPS، تطبيقات Win32 و Windows Forms يمكنها الاستفادة من بعض ميزات XPS. برنامج تشغيل الطابعة XPS (XPSDrv) يمكنها تحويل ناتج المستند إلي GDI إلى تنسيق XPS. للسيناريوهات المتقدمة, تحويل مخصص للمحتوى يتم دعمه باستخدام هروب طابعة Microsoft XPS Document Converter . بشكل مماثل، تطبيقات WPF يمكن أيضاً أن تخرج إلى مسار طباعة GDI عن طريق استدعاء أحد أساليب Write أو WriteAsync من فئة XpsDocumentWriter و تعيين طابعة غير XpsDrv كقائمة انتظار هدف الطباعة.

للتطبيقات التي لا تتطلب وظيفة XPSأو الدعم ، مسار طباعة GDI الحالي يبقى بدون تغيير.

طراز برنامج تشغيل الجهاز XPSDrv

مسار الطباعة XPS يحسِّن فعالية التخزين المؤقت عن طريق استخدام XPS كتنسيق تخزين مؤقت للطباعة أصلي عند الطباعة إلي طابعة تسمح ب XPSأو برنامج تشغيل. عملية التخزين المؤقت المبسطة تلغي الحاجة إلى إنشاء ملف التخزين المؤقت المتوسطة مثل ملف بيانات EMF قبل أن يتم تخزين المستند بشكل مؤقت. خلال ملفات التخزين المؤقت ذات الحجم الأصغر, مسار طباعة XPS يمكنه تقليل حركة مرور الشبكة و تحسين أداء الطباعة.

EMF هو تنسيق مغلق يمثل ناتج التطبيق كسلسلة من الاستدعاءات إلى GDI للحصول على خدمات التقديم. بعكس EMF، يمثل تنسيق التخزين المؤقت XPS المستند الفعلي دون الحاجة لتفسير إضافي عند الإخراج إلى برنامج تشغيل الجهاز طابعة المستند إلي XPS(XPSDrv). يمكن أن تعمل برامج التشغيل مباشرةً على البيانات في التنسيق. تزيل هذه الإمكانية تحويلات مساحة اللون و البيانات المطلوبة عند استخدام ملفات EMF و برامج تشغيل الطباعة المستندة إلى GDI.

عادةً يتم تقليل أحجام ملفات التخزين المؤقت عند استخدام مستندات XPSالتي تستهدف برنامج تشغيل الطابعة XPS (XPSDrv) مقارنةً ب EMF المكافئة اليهم; ومع ذلك، توجد استثناءات:

  • رسم خط متجه الذي يكون معقد جداً , ذو عدة مستويات أو مكتوبة بطريقة غير كفء يمكن أن يكون أكبر من إصدار نقطي من الرسم نفسه.

  • لأغراض عرض الشاشة, تقوم ملفات XPS بتضمين الخطوط بالإضافة إلى الخطوط المستندة إلى الكمبيوتر; بينما ملفات التخزين المؤقت GDI لا تقوم بتضمين خطوط الجهاز. ولكن نوعين خطوط هم فرعين (انظر أدناه) و برامج تشغيل الطابعات يمكنها إزالة خطوط الجهاز قبل إرسال الملف إلي الطابعة.

يتم تنفيذ تقليل حجم التخزين المؤقت من خلال عدة آليات:

  • تقليل حجم ملف الخط. فقط الأحرف المستخدمة داخل المستند الفعلي تكون مخزنة في ملف XPS.

  • دعم الرسومات المتقدمة . الدعم الأصلي للشفافية و أوليات التدرج تتجنب rasterization المحتوى في مستند XPS.

  • تعريف الموارد الشائعة. الموارد التي يتم استخدامها عدة مرات (مثل الصورة التي تمثل شعار شركة) يتم التعامل معها كموارد المشتركة و يتم تحميلها مرة واحدة فقط.

  • ضغط ZIP. كافة مستندات XPS تستخدم ضغط ZIP.

راجع أيضًا:

المرجع

PrintDialog

XpsDocumentWriter

XpsDocument

PrintTicket

PrintCapabilities

PrintServer

PrintQueue

هروب طابعة Microsoft XPS Document Converter

المبادئ

المستندات فى WPF

تسلسل المستند و التخزين

موارد أخرى

المواضيع الإجرائية للطباعة

XPS