0

我想使用等宽字体打印文本,宽 80 个字符,高 66 个字符。目标是模拟将原始文本发送到冲击式打印机。

这是一些代码:

public void Print(string printerName, string text, string desc = "")
{
    PrintDialog dialog = new PrintDialog();
    PrintQueue queue = new LocalPrintServer().GetPrintQueue(printerName);
    dialog.PrintQueue = queue;

    PageImageableArea area = queue.GetPrintCapabilities(dialog.PrintTicket).PageImageableArea;

    TextBlock block = new TextBlock();
    block.FontFamily = new FontFamily("Courier New");
    block.Margin = new Thickness(area.OriginWidth, area.OriginHeight, area.OriginWidth, area.OriginHeight);
    block.FontSize = ???
    block.Text = text;
    block.Measure(new Size(area.ExtentWidth, area.ExtentHeight));
    block.Arrange(new Rect(new Point(0, 0), block.DesiredSize));

    dialog.PrintVisual(block, desc);
}

我的理解是 PageImageableArea 给了我哪些是我area.ExtentWidtharea.ExtentHeight实际打印尺寸(以像素为单位),area.OriginWidth哪些area.OriginHeight是我的边距大小(以像素为单位)。

如果我想在页面上准确地放置 80 个字符,则每个字符都应该是area.ExtentWidth / 80宽的,以像素为单位。我的area.ExtentWidth打印机是 768,所以每个字符应该是 9.6 像素宽。

此外,如果我想在我的页面上精确放置 66 行,则每行都应该area.ExtentHeight / 66很高,以像素为单位。我的area.ExtentHeight打印机是 1038.66,所以每行应该是 15.7 像素高。

使用这些输入,我如何选择一个 FontSize ,其中每个字符都是 X 像素宽,并且在包装时会导致每行是 Y 像素高?

4

1 回答 1

0

首先选择要打印的字体大小固定,例如 Courier New。这将为您提供已知的字符尺寸并极大地简化计算。与打印机打交道时,最好使用 Twips 而不是“像素”,因为 twip/像素比率会根据您的显示器/操作系统设置等变化很大。可以在此处找到有关渲染模式的好文章/答案;如何在 .NET 中将缇转换为像素?

在处理打印时使用缇的原因是因为它与字体点大小非常接近。字体“点”是 1/72 英寸。同样,一英寸有 1440 缇。因此,每个字体“点”有 20 缇 (1440 / 72)。

一旦有了可以准确控制的固定字体大小,您概述的计算将为您提供字体大小。例如,如果您有 648的可用打印空间,则除以 72,您将获得 9 的字体“点”以在您的应用程序中使用。

于 2013-02-25T21:01:32.927 回答