在 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
)
结果:
我正在使用 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
)
结果: