【问题标题】:iTextSharp trims leading space and causes misalignment of columnsiTextSharp 修剪前导空格并导致列未对齐
【发布时间】:2025-11-20 21:10:01
【问题描述】:

从 iTextSharp 的 4.1.2 => 5.1.3 版本迁移时,我遇到了从文本生成 PDF 时发生的错误。问题是当一行的第一个字符有前导空格时,该前导空格会被截断。这是右对齐列的问题。

示例:(破折号=空格)

输入

------标题
--------------1
--------------2
0123456789

输出

-----标题
-------------1
-------------2
0123456789 ~~~请注意对齐不正确,因为该列没有前导空格!

有问题的代码已缩小到文件“iTextSharp/text/pdf/PdfChunck.cs”方法“TrimFirstSpace”。 在流出字节时,从 PdfDocument 类调用此方法。问题是没有关于这个方法试图完成什么的代码。

我应该改变什么才能使这项工作正常进行?似乎在这里注释掉 ELSE 条件应该可以解决这个问题。

public float TrimFirstSpace()
{
    BaseFont ft = font.Font;
    if (ft.FontType == BaseFont.FONT_TYPE_CJK && ft.GetUnicodeEquivalent(' ') != ' ')
    {
            if (value.Length > 1 && value.StartsWith("\u0001"))
            {
                value = value.Substring(1);
                return font.Width('\u0001');
            }
        }
        else
        {
            if (value.Length > 1 && value.StartsWith(" "))
            {
                value = value.Substring(1);
                return font.Width(' ');
            }
        }
        return 0;
    }

【问题讨论】:

  • 使用空格进行填充是错误的。我们不会解决这个问题。
  • 谁说错了? iTextSharps #1 目标是接受输入并将其转换为 PDF,无论它是什么类型的字符。这样的想法是有缺陷和没有根据的。顺便说一句,您已经发现自己做错了。答案将立即发布。
  • 我没有注意到您正在从 4 岁的版本迁移到 1 年半的版本。我总是假设人们升级到最新版本。我误以为这是另一个类似的问题,但不是错误。我赞成你的回答。

标签: itextsharp


【解决方案1】:

较新的代码更改解决了该问题。 if 语句很重要。


chunk = overflow;
chunk.TrimFirstSpace();


bool newlineSplit = chunk.IsNewlineSplit();
chunk = overflow;
if (!newlineSplit)
    chunk.TrimFirstSpace();

http://sourceforge.net/p/itextsharp/code/518/tree/trunk/src/core/iTextSharp/text/pdf/PdfDocument.cs#l415

【讨论】: