如何在不使用PrinterSettings的情况下更改打印机的纸张大小

本文关键字:情况下 打印机 张大小 PrinterSettings | 更新日期: 2023-09-27 18:07:18

我正在编写一个可以在特殊媒体上打印的自定义标签打印机。

使用DPI为600的打印媒体大小大约为2.00"× 0.244"。下面是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");

如何在不使用PrinterSettings的情况下更改打印机的纸张大小

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

  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 × 11介质。
  8. 您还可以以XML格式下载打印机的功能。在XML中,您可能会发现打印机可以处理的其他功能(如媒体大小),这可能需要您在打印之前进行设置。

我很有信心研究和尝试我在粗体项目中指出的事情应该会在某个时候引导你找到解决方案。在我摆弄System.Printing命名空间的许多时间里,我发现每个打印机的行为都不同,微小的改变可能会产生最愚蠢的效果!

我会帮你的,你就在评论里留言吧!祝你好运。

编辑1

不幸的是,我没有任何定制/专用打印机来测试,但我将尝试几种方法来获得预定义的尺寸。

使用PrintQueue.PrintCapabilities:

这将打印出打印机报告的可用尺寸。由于B33-126是一个自定义的尺寸,你可能会看到一堆PageMediaSizeName.Unknown s的尺寸,在那里你必须确定适合你的尺寸,然后在你的应用程序中使用与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.

Using 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打印多个。