在 iText 7 中 - 具有相同坐标的段落和矩形不正确重叠

In iText 7 - a paragraph and a rectangle with same coordinates are not right overlapping

我正在使用 C# 和 iText 7.2.1。

我想在矩形内绘制文本。我在文档中看到矩形和段落的定位锚都是'left-bottom corner'。但是当我使用下面的代码时,它们不在同一个位置。好像他们对Y坐标的理解不一样

我的代码:

using iText.IO.Font;
using iText.IO.Font.Constants;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas;
using iText.Layout;
using iText.Layout.Element;

namespace iTextTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var str = "ABCD1234";
            var fontSize = 32;
            var x = 100;
            var y = 700;
            var writer = new PdfWriter("test.pdf");
            var pdfdoc = new PdfDocument(writer);
            var doc = new Document(pdfdoc);
            var font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
            var width = font.GetWidth(str, fontSize);
            var height = fontSize;

            // Draw rectangle
            var pdfPage = pdfdoc.AddNewPage();
            var pdfCanvas = new PdfCanvas(pdfPage);
            pdfCanvas.SetFillColor(ColorConstants.YELLOW);
            pdfCanvas.Rectangle(x, y, width, height);
            pdfCanvas.Fill();

            // Draw text
            var p = new Paragraph().Add(str).SetFont(font);
            p.SetFontSize(fontSize).SetFontColor(ColorConstants.BLACK);
            p.SetFixedPosition(x, y, width);
            doc.Add(p);

            doc.Close();
            pdfdoc.Close();
            writer.Close();
        }
    }
}

段落的一行不需要字号的高度,而是行距。对于紧密设置的文本,行距可能等于字体大小(有时甚至小于它),但对于 easy-to-read 文本,行距通常大于字体大小。

使用 iText 绘制段落时,额外的 space 位于行的底部。这会导致您在输出中看到的行下方出现空 space。

因此,为了让您的代码正常工作,您必须设置前导以匹配您的字体大小,即

// Draw text
var p = new Paragraph().Add(str).SetFont(font);
p.SetFontSize(fontSize).SetFontColor(ColorConstants.BLACK);
p.SetFixedPosition(x, y, width);
p.SetFixedLeading(fontSize); // <-- added
doc.Add(p);

(TextPosition 测试 TextAndPositionLikeLandings)

结果: