修改printTicket

时间:2016-06-13 16:41:04

标签: c# wpf system.printing

我试图修改打印票多天。 :(

以下是代码:

    using Microsoft.Win32;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Printing;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Drawing.Printing;
    using System.Drawing;
    using System.Xml;

    // ....

    // Get the ticket
    var printQueue = new PrintServer("\\\\NetworkNameHere").GetPrintQueue("PrinterNameHere");
    PrintTicket userPrintTicket = printQueue.UserPrintTicket;

    // Modify the ticket to print in landscape (or any other option)
    var xmlDoc = new XmlDocument();
    xmlDoc.Load(userPrintTicket.GetXmlStream());
    var manager = new XmlNamespaceManager(xmlDoc.NameTable);
    manager.AddNamespace(xmlDoc.DocumentElement.Prefix, xmlDoc.DocumentElement.NamespaceURI);

    string xpath = string.Format("//psf:Feature[@name='{0}']/psf:Option", "psk:PageOrientation");
    XmlNode node = xmlDoc.SelectSingleNode(xpath, manager);
    node.Attributes["name"].Value = "psk:Landscape";

    PrintTicket modifiedPrintTicket = null;
    using (var stream = new MemoryStream())
    {
        xmlDoc.Save(stream);
        stream.Position = 0;
        modifiedPrintTicket = new PrintTicket(stream);
    }

    System.Printing.ValidationResult result = printQueue.MergeAndValidatePrintTicket(printQueue.UserPrintTicket, modifiedPrintTicket);
   printQueue.UserPrintTicket = result.ValidatedPrintTicket;

           MessageBox.Show(result.ValidatedPrintTicket.PageOrientation.Value.ToString());

   printQueue.Commit();

   Byte[] myByteBuffer = UnicodeEncoding.Unicode.GetBytes("This is a test string for the print job stream.");
   using (var job = printQueue.AddJob())
        using (var stream = job.JobStream)
        {
            stream.Write(myByteBuffer, 0, myByteBuffer.Length);
            stream.Close();
        }

问题: 看起来票证被正确修改,但由于某些原因,它从不使用票证中指定的信息来获取任何选项。帮助!

请注意,我使用的是.Net 4.0,但我在addJob(4.5)中使用新的PrintTicket参数获得了相同的结果:printQueue.AddJob(" xx",result.ValidatedPrintTicket)

谢谢!

0 个答案:

没有答案