【问题标题】:How to change the paper size for a printer without using PrinterSettings?如何在不使用 PrinterSettings 的情况下更改打印机的纸张尺寸?
【发布时间】:2015-11-04 03:13:37
【问题描述】:

我正在尝试编写将在特殊介质上打印的自定义标签打印机。

打印介质大小约为 2.00" x 0.244",使用 DPI 为 600。下面是传入位图标签值的 printLabel 函数。

您会看到我目前正在尝试自定义页面大小,但打印机打印出 12 个标签,只有 1 个具有我需要的信息。

我一次只需要打印一个标签。如果您需要更多信息或有疑问,请随时发表评论,但我不知道我需要做什么。

我无法想象从 Windows 中的打印机设置页面获取页面大小的枚举集合。任何帮助将不胜感激。

PrintServer ps = null;

        if (Properties.Settings.Default.ShrinkLabelPrinter.Contains(@"\\serverloc1") || Properties.Settings.Default.ShrinkLabelPrinter.Contains(@"\\SERVERLOC1"))
            ps = new PrintServer(@"\\serverloc1");
        else if (Properties.Settings.Default.ShrinkLabelPrinter.Contains(@"\\serverloc2") || Properties.Settings.Default.ShrinkLabelPrinter.Contains(@"\\SERVERLOC2"))
            ps = new PrintServer(@"\\serverloc2");
        else
            ps = new PrintServer();

        System.Windows.Controls.PrintDialog pd = new System.Windows.Controls.PrintDialog();

        PrintQueue queue = ps.GetPrintQueue(@"\\serverloc2\bbp33 (Copy 1)");

        List<string> lstPaperSizes = new List<string>();

        queue.CurrentJobSettings.CurrentPrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.Unknown, 150, 141);

        //queue.CurrentJobSettings.CurrentPrintTicket.PageMediaSize = ;

        pd.PrintQueue = queue;

        System.Drawing.Image img = label;

        //REMOVE IF LABELS ARE PORTRAIT FORMAT
        //img.RotateFlip(RotateFlipType.Rotate90FlipNone); 

        var ms = new MemoryStream();

        img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        ms.Position = 0;

        var bi = new BitmapImage();
        bi.BeginInit();
        bi.CacheOption = BitmapCacheOption.OnLoad;
        bi.StreamSource = ms;
        RenderOptions.SetBitmapScalingMode(bi, BitmapScalingMode.HighQuality);
        bi.EndInit();

        var vis = new DrawingVisual();
        var dc = vis.RenderOpen();

        Rect angle = new Rect
        {
            Width = Convert.ToInt32(Math.Round(bi.Width, 0)),
            Height = Convert.ToInt32(Math.Round(bi.Height, 0))
        };

        dc.DrawImage(bi, angle);
        dc.Close();
        img.Save(@"\temp\Label Creator\Resources\cable_label.png");
        pd.PrintVisual(vis, "Cable Label");

【问题讨论】:

    标签: c# wpf printing size


    【解决方案1】:

    我会建议你做更多的调试,检查图像的高度,检查你的页面大小是否正确等等。简而言之,这可能是很多事情;以下是一些引起我注意的:

    1. 您要打印到的 PageMediaSize 宽 1.5625" (150px/96dpi),高 1.46875" (141px/96dpi)
    2. 不要更改queue.CurrentJobSettings...PageMediaSize,而是尝试做pd.PrintTicket.PageMediaSize.PageMediaSize = new ...
    3. 也许PrintQueue.Commit() 对你有用
    4. 设置断点并查看您的PrintQueue 属性,如果我建议没有任何工作,我有兴趣查看您的PrintQueue.UserPrintTicket 的值(但是您可能不想更改UserPrintTicket) .
    5. 确保您了解打印机本身及其硬件功能。它可以做横向和纵向吗?有它的SDK吗?
    6. 查看/研究PrintQueue.PrintCapabilities,然后断点+调试目标打印机的功能至少一次。里面有很多信息(比如兼容的媒体尺寸)。
    7. 注意img 的尺寸。如果您想要 2" x 0.244",则您的媒体尺寸应为 new PageMediaSize(PageMediaSizeName.Unknown, 192, 23.424);。您的图像应该具有相似的尺寸,并且不应超过这些尺寸。打印前查看您的pd.PrintableAreaHeight|Width
      • Windows 显示默认为 96DPI。这是在您将视觉效果发送到打印机时假设的。因此,您可以通过 (size in inches / 96) = # of pixels you want to use with PageMediaSize 找到您的尺寸。转到标准打印机并通过 PrintCapabilities 查看PageMediaSizeName.NorthAmericanLetter 的大小,您会看到高度为 816 像素 x 1056 像素。 816/96 = 8.5、1056/96 = 11 -- 8.5 x 11 媒体。
    8. 您还可以以 XML 格式下载打印机的功能。在 XML 中,您可能会发现打印机可以处理的其他功能(如介质尺寸),并且可能需要您在打印前进行设置。

    我非常有信心研究和尝试我在粗体项中指出的内容应该会在某个时候引导您找到解决方案。在我与System.Printing 命名空间打交道的许多小时中,我发现每台打印机的行为都可能不同,而小的更改可能会产生最愚蠢的效果!

    我会在附近提供帮助,只需在 cmets 上发帖即可!祝你好运。

    编辑 1

    很遗憾,我没有任何定制/专业打印机可供测试,但我会尝试几种可以获得预定义尺寸的方法。

    使用PrintQueue.PrintCapabilities:

    这将打印出打印机报告的可用尺寸。由于 B33-126 是自定义尺寸,您可能会看到一堆带有尺寸的 PageMediaSizeName.Unknowns,您必须在其中确定适合您的尺寸,然后在您的应用程序中使用与 PrintTicket 相同的尺寸。

    PrintQueue pq = GetYourPrintQueue();
    PrintCapabilities pc = pq.GetPrintCapabilities();
    ReadOnlyCollection<PageMediaSize> capableSizes = pc.PageMediaSizeCapability;
    foreach(var pm in capableSizes) 
    { 
        Console.WriteLine(pm);
    }
    //Identify what PageMediaSize you need, and set your print ticket to use the exact same dimensions
    

    使用PrintQueue.GetPrintCapabilitiesAsXml()

    PrintQueue pq = GetYourPrintQueue();
    MemoryStream pcXml = pq.GetPrintCapabilitiesAsXml();
    Console.WriteLine(pcXml.ToString())
    //At this point, set a breakpoint on Console.WriteLine and inspect the `pcXml` object to see if the XML contains custom print capabilities.  If so you'll have to identify which sizes/properties you need to make use of.
    

    使用PrintQueue.UserPrintTicket

    UserPrintTicket 是当前用户的默认打印机设置。因此,您可以做的是使用控制面板进入您的打印设备,右键单击您的目标打印机,然后转到“打印首选项”并将您的页面/纸张尺寸更改为 B33-126 尺寸,然后单击应用/确定关闭窗口。

    现在做:

    PrintQueue pq = GetYourPrintQueue();
    var upt = pq.UserPrintTicket;
    Console.WriteLine(upt);
    

    并在Console.WriteLine 上设置断点并检查 upt。这将显示 PrintTicket 中与我们在上述步骤中设置/应用的设置相匹配的当前设置。您应该可以在那时执行pd.PrintTicket = upt 并打印。

    使用 PrintDialog:

    您可以使用PrintDialog.ShowDialog() 设置打印机设置,然后添加一个断点来查看它们是什么并将相同的设置应用于您的解决方案。

    PrintDialog pd = new PrintDialog();
    pd.ShowDialog();
    //Set a breakpoint on the code show below this comment.  At this point your print dialog is shown and you can select a printer.  Select the target printer and click "Preferences." When shown, set whatever settings you might normally use to print labels.  Then click "Apply," then click "OK."  
    Console.WriteLine(pd.PrintTicket);
    

    当调试器运行到最后一行代码时,您刚刚通过首选项页面应用到打印机的设置将显示在 pd.PrintTicket 中。您可以采用这些设置并在您的应用程序中为PrintTicket 使用相同的设置。

    最后一点是在关闭PrintDialog 后查看它的属性。它有你的高度和宽度(可以找到边距)。您要确保您尝试打印的图像适合这些尺寸。请记住,您可以使用PrintDialog.CopyCount 打印多个。

    【讨论】:

    • 我想尝试将页面大小更改为预定义的大小。 “新页面尺寸”选项正在打印大量标签。我正在寻找的特定页面大小是 B33-126,如果我通过 windows,它是在打印机设置中定义的。有没有办法遍历这些并设置它?如果我将默认页面大小更改为此,它只会打印一个标签,并且看起来应该是这样。再次感谢!
    • 谢谢,帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多