【问题标题】:Calculate font size based on printable area and number of characters/lines根据可打印区域和字符/行数计算字体大小
【发布时间】:2023-03-31 03:41:01
【问题描述】:

我想使用等宽字体打印文本,宽 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.OriginWidtharea.OriginHeight 是我的边距大小(以像素为单位)。

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

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

使用这些输入,我如何选择一个 FontSize,其中每个字符的宽度为 X 像素,并且在包裹时使每行的高度为 Y 像素?

【问题讨论】:

    标签: c# wpf printing font-size


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 2017-10-08
      • 2016-04-23
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多