iTextSharp GetWidthPoint()不包含字母间距

时间:2016-06-17 14:45:10

标签: c# itext

请考虑以下代码:

var path = AppDomain.CurrentDomain.BaseDirectory;
var filePath = Path.Combine(path, "test1.pdf");

using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
using (var document = new Document(new Rectangle(PageSize.A4.Width, PageSize.A4.Height)))
using (var writer = PdfWriter.GetInstance(document, stream))
{

    try
    {

        document.Open();

        const string value = "The quick brown fox";

        for (int i = 0; i < 4; i++)
        {

            var chunk = new Chunk(value);

            chunk.SetCharacterSpacing(i);

            var origin = new Phrase(chunk);
            var paragraph1 = new Paragraph(origin);

            document.Add(paragraph1);

            var widthPoint = chunk.GetWidthPoint();

            Debug.WriteLine(widthPoint);

        }

        writer.CloseStream = false;

    }
    finally
    {
        document.Close();
        stream.Close();
    }

}

我正在尝试将一个段落/块添加到新的PdfPTable中的单个PdfPCell中。我们无法控制进入单元格的实际文本,并且文本可能比可用空间稍长一些。文本会突破多行或流出单元格并被隐藏。

这个想法是自动减少文本的字母间距(最多为最小量),以便尝试减轻被裁剪的文本。基本上应用一个小的负字母间距,直到文本适合。问题是,无论应用的字母间距,widthPoint的值始终相同。生成的PDF显然具有不同宽度的文本。

有没有办法用letter-spacing或它的容器来计算文本的实际宽度?块/段是(我将描述为)盒式模型元素。也就是说它们填充单元并且总是具有相同的宽度。

不知道如何继续。

这适用于iTextSharp版本5.5.9.0

2 个答案:

答案 0 :(得分:2)

简单地说:你是对的。 Chunk.GetWidthPoint()仅计算没有字符或字间距的宽度:

virtual public float GetWidthPoint() {
    if (GetImage() != null) {
        return GetImage().ScaledWidth;
    }
    return font.GetCalculatedBaseFont(true).GetWidthPoint(Content, font.CalculatedSize) * HorizontalScaling;
} 

因此,

  

有没有办法用字母间距或容器来计算文本的实际宽度?

iTextSharp 5没有提供开箱即用的功能。但是您可以像这样轻松计算出正确的值:

float WidthWithCharSpacing = chunk.GetWidthPoint() + chunk.GetCharacterSpacing() * (chunk.Content.Length - 1);

答案 1 :(得分:1)

您可能正在寻找考虑字符之间的字距调整的GetWidthPointKerned方法。