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

时间:2016-08-30 08:29:18

标签: c# fonts itext

我正在创建一个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);

此代码似乎工作正常,但是当我在屏幕中添加更大的文本时,文本会被截断,对齐仍然在中心(在水平意义上)。

我正在阅读有关使用图形库的内容,但无法解决问题。

1 个答案:

答案 0 :(得分:1)

你说你正在填写一个模板。假设您的文档中至少有一个AcroForm字段。在此问题的答案中解释了填写字段:itextsharp setting the stamper FormFlatttening=true results in no output

通常,该字段具有定义需要使用的字体大小的属性,但您是对的:如果文本不适合表单字段定义的矩形,则文本将被截断。您可以通过将字体大小设置为“自动”来更改此设置。这样,如果文本不适合,字体大小将减小。这在此解释:Set AcroField Text Size to Auto

或者您可以使用多行字段。见How to get the row count of a multiline field?

如果您没有表单字段(这很奇怪,因为这意味着您必须编写坐标,例如PageSize.A4.Height/2, 140),则不应使用showTextAligned()方法。如果您无法使用表单字段定义位置(但我无法想到任何参数,为什么您不能),您应该看一下MovieAds示例(取自我的书{ {3}})。

我有一个方法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时,才允许iText截断内容。

while (AddParagraph(CreateMovieParagraph(movie, size),
          canvas, f, true) && size > 6) 
{
    size -= 0.2f;
}