gpt4 book ai didi

wpf - XPSDocumentWriter - 将特定页面打印到特定托盘

转载 作者:行者123 更新时间:2023-12-04 15:34:28 24 4
gpt4 key购买 nike

我目前正在开发一个打印应用程序。此应用程序要求某些页面需要来自打印机上的特定纸盘。这是我到目前为止所拥有的内容:

    foreach (var dto in dispensersToPrint)
{
var documents = FilterDocumentSections(DispenserDocumentsToPrint.RetrieveByDispenserId(dto.DispenserId));
var groupedDocs = documents.GroupBy(t => t.DocumentTypeId);
var queueName = Properties.Settings.Default.PrinterName;
var queue = RawPrinterHelper.GetPrintQueue(queueName);
var seq = new FixedDocumentSequence();
var xpsWriter = PrintQueue.CreateXpsDocumentWriter(queue);

foreach (var docGroup in groupedDocs)
{
var printTicket = queue.DefaultPrintTicket.Clone();
var printTray = MapPrintTray((DocumentSectionType)docGroup.Key);
if (!printTray.IsNullOrEmpty())
{
printTicket = RawPrinterHelper.ModifyPrintTicket(printTicket, "psk:JobInputBin", printTray);
}
var fixedDoc = new FixedDocument();
fixedDoc.PrintTicket = printTicket;

foreach (var doc in docGroup)
{
var pageContent = new PageContent();
var fixedPage = new FixedPage();

var localFileName = string.Empty;
var unzippedFileName = string.Empty;
//copy files locally
localFileName = CopyFileToLocalMachine(doc.FileName);
//unzip file
unzippedFileName = EmfPrintingHelper.UnzipEmfFile(localFileName);
var itemToPrint = new PrintableEmfImage
{
DataContext = new EmfImageViewModel { FileName = unzippedFileName }
};
fixedPage.Children.Add(itemToPrint);
pageContent.Child = fixedPage;
fixedDoc.Pages.Add(pageContent);
}
var docRef = new DocumentReference();
docRef.SetDocument(fixedDoc);
seq.References.Add(docRef);
}
xpsWriter.Write(seq);
}

在真正的高水平上:
  • 对于每个分配器(工单),我需要打印;我首先按文档类型分组(即打印类型 A 到纸盘 1)
  • 然后我创建了一个新的 FixedDocumentSequence
  • 对于每个文档类型;然后我创建一个固定文档。然后我修改打印票以查看适当的托盘。
  • 然后我为每种文档类型构建每个单独的页面;并将它们添加到 FixedDocument
  • 一旦FixedDocument的构建完成;我将它附加到 DocumentSequence。
  • 然后我将 FixedDocumentSequence 发送到 xpsWriter。

  • 但出于某种原因;这些设置没有得到尊重。我从同一个托盘中打印出所有文件。

    以下是我目前的一些观察:
  • 修改打印票有效;我已经通过将修改后的 printTicket 发送到 xpsWriter 中来验证这一点;但这会将设置应用于整个作业;这对我来说是不行的。
  • 查询我的打印能力时;我注意到我只有 JobInputBin。我不太认为这意味着这台打印机不支持该功能;因为多托盘打印可以从类似的 WindowsForms 应用程序(使用 PageSettings.PaperSource)

  • 关于我接下来可以尝试什么的任何想法?有没有人成功地做过这样的事情?

    最佳答案

    我首先要说的是,我无法使用带托盘的打印机,因此很遗憾我无法测试此解决方案。也就是说,我会将您的注意力引向 MSDN 论坛帖子,here ,原始海报追求相同的每页托盘行为。

    根据您发布的代码,您可能已经看到了这篇文章中的一些内容,从您发布的代码至少具有 ModifyPrintTicket() 的一些实现来判断。 .

    在帖子中,有几个不同的用户,每个用户都引用了针对其特定问题版本的解决方案。但是,在这种情况下似乎最相关的解决方案是关于在 ModifyPrintTicket() 中未正确考虑 namespace 的解决方案。 (如发布者
    Jo0815)。我说“最相关”是因为海报说打印托盘被忽视了。他们 (wittersworld) 提供了一个替代实现来纠正这个问题。在 MSDN 上的帖子中,指向完整源代码的链接已断开,但可以找到 here .

    要点是,在 ModifyPrintTicket() ,他们添加了 namespaceUri参数,然后改变了这个:

    if (node != null)
    {
    node.Attributes["name"].Value = newValue;
    }

    对此:
    if (node != null)
    {
    if (newValue.StartsWith("ns0000"))
    {
    // add namespace to xml doc
    XmlAttribute namespaceAttribute = xmlDoc.CreateAttribute("xmlns:ns0000");
    namespaceAttribute.Value = namespaceUri;
    xmlDoc.DocumentElement.Attributes.Append(namespaceAttribute);
    }
    node.Attributes["name"].Value = newValue;
    }

    允许用户指定使用的特定于打印机的命名空间。

    我希望这是有帮助的。

    关于wpf - XPSDocumentWriter - 将特定页面打印到特定托盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21860339/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com