如何计算给定字体和大小的页面中可以容纳的字符数

本文关键字:字符 计算 何计算 字体 | 更新日期: 2023-09-27 18:04:53

我正在创建一个c#控制台应用程序,它使用ITextSharp在证书模板(pdf)文件中填充详细信息。需要填充的文本是动态生成的。

如果动态生成的文本超过一定的大小,字段名将被截断。我已经想到了一个算法来解决这个问题,我需要在给定字体和字体大小的页面中容纳的最大字符数。要容纳文本的页面宽度已经给了我们。

我使用了以下代码:

string text = "This is the test string that needs to be accommodated";
// Registering a font
FontFactory.Register("somefont.ttf", "script");
var script = FontFactory.GetFont("script", 20f); // registers the font with the given type and size. 
Phrase phrase_text = new Phrase();
phrase_text.Add(new Chunk(text, script));
ColumnText.ShowTextAligned(pbover, Element.ALIGN_CENTER, new Phrase(phrase_text), PageSize.A4.Height/2, 140, 0);

这段代码似乎工作得很好,但是当我在屏幕上添加一个更大的文本时,文本被截断,对齐仍然在中心(在水平意义上)。

我正在阅读一些关于使用图形库,但无法解决的问题。

如何计算给定字体和大小的页面中可以容纳的字符数

你说你正在填写一个模板。假设文档中至少有一个AcroForm字段。在这个问题的答案中解释了填写字段:如果将stamper设置为formflattenten =true,将导致没有输出

通常,该字段有一个属性来定义需要使用的字体大小,但是您是对的:如果文本不适合表单字段定义的矩形,则文本将被截断。你可以通过设置字体大小为"auto"来改变这一点。这样,如果文本不合适,字体大小就会减小。设置AcroField文本大小为Auto

或者您可以使用多行字段。参见如何获取多行字段的行数?

如果你没有一个表单字段(这将是奇怪的,因为这意味着你必须编程的坐标,例如PageSize.A4.Height/2, 140),你不应该使用showTextAligned()方法。如果没有办法使用表单字段来定义位置(但我想不出有什么理由不这样做),你应该看看MovieAds的例子(取自我的书《text in Action》)。

我有一个方法AddParagraph看起来像这样:

public bool AddParagraph(Paragraph p, PdfContentByte canvas, 
    AcroFields.FieldPosition f, bool simulate) 
{
  ColumnText ct = new ColumnText(canvas);
  ct.SetSimpleColumn(
    f.position.Left, f.position.GetBottom(2),
    f.position.GetRight(2), f.position.Top
  );
  ct.AddElement(p);
  return ColumnText.HasMoreText(ct.Go(simulate));
}

在本例中,我创建了一个ColumnText对象,并为其定义了一个列。我添加一个段落,然后渲染这个段落。如果simulatetrue,我不会真正添加它,我添加它是虚拟的,看看段落是否合适。如果合适,我重新调用方法for real(与simulate = false)。

我根据需要多次重复这个操作,每次尝试减少0.2个用户单位的字体。只有当字体小于6pt时,我才允许ittext截断内容。
while (AddParagraph(CreateMovieParagraph(movie, size),
          canvas, f, true) && size > 6) 
{
    size -= 0.2f;
}