C# 根据可打印区域和字符/行数计算字体大小

C# 根据可打印区域和字符/行数计算字体大小,c#,wpf,printing,font-size,C#,Wpf,Printing,Font Size,我想用单空格字体打印文本,80个字符宽,66个字符高。目标是模拟将原始文本发送到冲击式打印机 下面是一些代码: public void Print(string printerName, string text, string desc = "") { PrintDialog dialog = new PrintDialog(); PrintQueue queue = new LocalPrintServer().GetPrintQueue(printerName); d

我想用单空格字体打印文本,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为我提供了
面积。ExtentWidth
面积。ExtentWight
是我的实际打印尺寸(以像素为单位),而
面积。OriginWidth
面积。OriginHeight
是我的页边距大小(以像素为单位)

如果我想在整个页面中正好容纳80个字符,则每个字符的宽度应为
area.extendwidth/80
像素。我的打印机的
区域.extendwidth
为768,因此每个字符的宽度应为9.6像素

另外,如果我想在我的页面上精确地容纳66行,每行应该是
area.extenstheight/66
高,以像素为单位。我的打印机的
区域.extenstheight
是1038.66,因此每行的高度应该是15.7像素


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

首先选择一种字体打印,该字体的大小是固定的,例如Courier New。这将为您提供已知的角色尺寸,并大大简化计算。在处理打印机时,最好使用twip而不是“像素”,因为twip/像素比率因监视器/OS设置等的不同而变化很大。这里可以找到有关渲染模式的好文章/答案

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

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