C# 如何在iTextsharp中将文本(更改Fontsize直到其适合)适配到矩形中
我正在尝试以固定的宽度和高度在绝对位置将文本插入现有PDF。当文本太大或字体太大时,文本不可见。我试图解决此问题,如中所述 但什么也插不进去。有人知道我做错了什么或我错过了什么吗 以下是我目前正在做的事情:C# 如何在iTextsharp中将文本(更改Fontsize直到其适合)适配到矩形中,c#,wpf,itext,C#,Wpf,Itext,我正在尝试以固定的宽度和高度在绝对位置将文本插入现有PDF。当文本太大或字体太大时,文本不可见。我试图解决此问题,如中所述 但什么也插不进去。有人知道我做错了什么或我错过了什么吗 以下是我目前正在做的事情: TextBlock tb = (TextBlock)g.Children[0]; ColumnText ct = new ColumnText(stamper.GetOverContent(fd.Page)); float llx=0, lly=0, urx=0, ury = 0;
TextBlock tb = (TextBlock)g.Children[0];
ColumnText ct = new ColumnText(stamper.GetOverContent(fd.Page));
float llx=0, lly=0, urx=0, ury = 0;
float percentX = (float) ((Canvas.GetLeft(g) + tb.Padding.Left)/c.ActualWidth);
float percentY = (float)((Canvas.GetTop(g) - tb.Padding.Top)/c.ActualHeight);
float percentWidth = (float)(g.ActualWidth/c.ActualWidth);
float percentHeight = (float)(g.ActualHeight/c.ActualHeight);
llx = percentX * reader.GetPageSize(fd.Page).Width;
lly =(float) (reader.GetPageSize(fd.Page).Height - percentY * reader.GetPageSize(fd.Page).Height);
urx = llx + percentWidth * reader.GetPageSize(fd.Page).Width;
ury = lly - percentHeight * reader.GetPageSize(fd.Page).Height;
ct.SetSimpleColumn(new iTextSharp.text.Rectangle(llx, lly, urx, ury));
float fontsize = (float) tb.FontSize - 2;
Boolean fits;
iTextSharp.text.Paragraph p;
do {
p = new iTextSharp.text.Paragraph();
fontsize -= 0.1f;
p.Font.Size = fontsize;
p.Add(tb.Text);
ct.AddElement(p);
int status = ct.Go(true);
fits = !ColumnText.HasMoreText(status);
status = ct.Go(true);
} while (!fits && p.Font.Size > 2);
ct.Go();
我找到了解决问题的办法。万一有人想知道它是如何工作的,我就是这样解决这个问题的: 首先,我用Go(True)模拟将文本插入到ColumnText中。然后,我检查给定字体的文本是否适合列文本。我减小字体大小,直到合适为止 似乎再次调用方法Go(false)是不够的。我创建了一个新的ColumnText对象,并再次在该对象上调用SetSimpleColumn。在这个上调用Go方法是有效的 这就是代码:
ColumnText ct = new ColumnText(contentByte);
ct.SetSimpleColumn(rec);
ct.AddElement(new iTextSharp.text.Paragraph(tb.Text.ToString()));
int status = ct.Go(true);
Boolean fits = !ColumnText.HasMoreText(status);
if (fits)
{
ColumnText ctxt = new ColumnText(contentByte);
ctxt.SetSimpleColumn(rec);
ctxt.AddElement(new iTextSharp.text.Paragraph(tb.Text.ToString()));
ctxt.Go();
}else
{
double fontsize = tb.FontSize - 2;
while(!fits && fontsize > 1)
{
fontsize -= 0.1;
iTextSharp.text.Paragraph p = new iTextSharp.text.Paragraph(tb.Text);
p.Font = new iTextSharp.text.Font(BaseFont.CreateFont());
p.Font.Size = (float)fontsize;
ColumnText ctxt = new ColumnText(contentByte);
ctxt.SetSimpleColumn(rec);
ctxt.AddElement(p);
int stat = ctxt.Go(true);
fits = !ColumnText.HasMoreText(stat);
}
iTextSharp.text.Paragraph par = new iTextSharp.text.Paragraph(tb.Text);
par.Font = new iTextSharp.text.Font(BaseFont.CreateFont());
par.Font.Size = (float)fontsize;
ColumnText coltxt = new ColumnText(contentByte);
coltxt.SetSimpleColumn(rec);
coltxt.AddElement(par);
coltxt.Go();
}
我找到了解决问题的办法。万一有人想知道它是如何工作的,我就是这样解决这个问题的: 首先,我用Go(True)模拟将文本插入到ColumnText中。然后,我检查给定字体的文本是否适合列文本。我减小字体大小,直到合适为止 似乎再次调用方法Go(false)是不够的。我创建了一个新的ColumnText对象,并再次在该对象上调用SetSimpleColumn。在这个上调用Go方法是有效的 这就是代码:
ColumnText ct = new ColumnText(contentByte);
ct.SetSimpleColumn(rec);
ct.AddElement(new iTextSharp.text.Paragraph(tb.Text.ToString()));
int status = ct.Go(true);
Boolean fits = !ColumnText.HasMoreText(status);
if (fits)
{
ColumnText ctxt = new ColumnText(contentByte);
ctxt.SetSimpleColumn(rec);
ctxt.AddElement(new iTextSharp.text.Paragraph(tb.Text.ToString()));
ctxt.Go();
}else
{
double fontsize = tb.FontSize - 2;
while(!fits && fontsize > 1)
{
fontsize -= 0.1;
iTextSharp.text.Paragraph p = new iTextSharp.text.Paragraph(tb.Text);
p.Font = new iTextSharp.text.Font(BaseFont.CreateFont());
p.Font.Size = (float)fontsize;
ColumnText ctxt = new ColumnText(contentByte);
ctxt.SetSimpleColumn(rec);
ctxt.AddElement(p);
int stat = ctxt.Go(true);
fits = !ColumnText.HasMoreText(stat);
}
iTextSharp.text.Paragraph par = new iTextSharp.text.Paragraph(tb.Text);
par.Font = new iTextSharp.text.Font(BaseFont.CreateFont());
par.Font.Size = (float)fontsize;
ColumnText coltxt = new ColumnText(contentByte);
coltxt.SetSimpleColumn(rec);
coltxt.AddElement(par);
coltxt.Go();
}
在没有模拟模式和改变字体大小的情况下,它确实部分适合。所以我一定是做错了什么,它在没有模拟模式和改变字体大小的情况下部分适合。所以我一定是做错了什么