【问题标题】:How to calculate the number of characters that can be accommodated in a page of a given font and size如何计算给定字体和大小的页面中可以容纳的字符数
【发布时间】:2016-08-30 16:54:00
【问题描述】:

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

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

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

【问题讨论】:

标签: c# fonts itext


【解决方案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 示例(取自我的书iText 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,我不会真的添加它,我会虚拟添加它以查看段落是否合适。如果合适,我将重新调用该方法真正(使用simulate = false)。

我会根据需要多次重复此操作,每次尝试将字体减少 0.2 个用户单位。只有当字体小于 6pt 时,我才允许 iText 截断内容。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2015-03-17
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多