2013-02-25 68 views
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.OriginWidtharea.OriginHeight這是我的邊距的大小(以像素爲單位)。

如果我想在整個頁面中準確地包含80個字符,則每個字符的寬度應爲area.ExtentWidth/80(以像素爲單位)。我的打印機的area.ExtentWidth是768,因此每個字符的寬度應爲9.6像素。

此外,如果我想在我的頁面上恰好適合66行,每行應該是area.ExtentHeight/66高(以像素爲單位)。我的打印機的area.ExtentHeight是1038.66,因此每行應該是15.7像素高。

使用這些輸入,我該如何選擇一個FontSize,其中每個字符的寬度都是X像素,並且在包裝時會導致每一行的像素高度爲Y像素?

回答

0

首先選擇一個字體來打印,其大小是固定的,例如Courier New。這將爲您提供已知的字符維度並極大地簡化計算。在處理打印機時,最好使用Twips而不是「像素」,因爲根據您的顯示器/操作系統設置等因素,tw /像素比率會有很大的變化。可以在此處找到有關渲染模式的好文章/答案; How do I convert Twips to Pixels in .NET?

處理打印時使用緹的原因是因爲它與字體點大小非常接近。字體「點」是1/72英寸。同樣,每英寸有1440緹。因此,每個字體「點」有20緹(1440/72)。

一旦你有一個固定的字體大小,你可以準確地控制,你所概述的計算會給你的字體大小。例如,如果您有可用的打印空間648 ,然後除以72,您將得到9的字體「點」以在您的應用程序中使用。