C# 将列文本放置在绝对点itext sharp中
我正在使用itext sharp动态创建PDF。我使用ColumnText是因为我处理的是从右到左的内容。通过搜索web,我了解column.SetSimpleColumn接受4个参数(x,y,w,h),对吗?我的第一个问题是,我不知道列的宽度和高度,我需要它将是动态的文本内容。有人知道如何根据内容设置列宽和列高吗C# 将列文本放置在绝对点itext sharp中,c#,itext,C#,Itext,我正在使用itext sharp动态创建PDF。我使用ColumnText是因为我处理的是从右到左的内容。通过搜索web,我了解column.SetSimpleColumn接受4个参数(x,y,w,h),对吗?我的第一个问题是,我不知道列的宽度和高度,我需要它将是动态的文本内容。有人知道如何根据内容设置列宽和列高吗 try { for (int j = 0; j < project.Slides[i].Labels.Count; j++)
try
{
for (int j = 0; j < project.Slides[i].Labels.Count; j++)
{
string pageContext = project.Slides[i].Labels[j].Text;
int fontNumber = Convert.ToInt32(project.Slides[i].Labels[j].Font);
int fontSize = Convert.ToInt32(project.Slides[i].Labels[j].Size);
float fontSizePoints = (float)fontSize * (float)2.3;
string fontColor = project.Slides[i].Labels[j].Color;
float fontX = (float)project.Slides[i].Labels[j].X;
float fontY = (float)project.Slides[i].Labels[j].Y;
var color = System.Drawing.ColorTranslator.FromHtml(fontColor);
baseFont = GetBaseFont(fontNumber);
float w = baseFont.GetWidthPoint(pageContext, fontSizePoints);
Font dFont = new Font(baseFont, fontSizePoints);
dFont.Color = new BaseColor(color);
ColumnText column = new ColumnText(writer.DirectContent);
column.SetSimpleColumn(fontX, fontY, w, 100);
column.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
column.AddElement(new Paragraph(pageContext, dFont));
column.Go();
}
}
catch (Exception)
{
}
试试看
{
对于(int j=0;j
我附上图片来描述这个问题。文档中可以有一个或20个文本列。我不知道字体的大小和这段文字的长度。它可以是2个单词或30个单词。我仅有的信息是左下坐标的x,y(以及字体系列、大小、颜色…),我的问题是如何创建TextColumn(由于RTL支持,需要使用它)并按特定坐标位置放置。
@mkl感谢您的回复。我找到的最好的解决办法是。在绝对位置+RTL支持下工作出色
try
{
for (int j = 0; j < project.Slides[i].Labels.Count; j++)
{
string pageContext = project.Slides[i].Labels[j].Text;
int fontNumber = Convert.ToInt32(project.Slides[i].Labels[j].Font);
int fontSize = Convert.ToInt32(project.Slides[i].Labels[j].Size);
float fontSizePoints = (float)fontSize * (float)2.1;
string fontColor = project.Slides[i].Labels[j].Color;
float X = (float)project.Slides[i].Labels[j].X;
float Y = pHeightPoints - (float)project.Slides[i].Labels[j].Y;
float width = (float)project.Slides[i].Labels[j].Widht;
float height = (float)project.Slides[i].Labels[j].Heigh;
float llx = X;
float lly = Y + height;
float urx = X + width;
float ury = Y;
var color = System.Drawing.ColorTranslator.FromHtml(fontColor);
baseFont = GetBaseFont(fontNumber);
float w = baseFont.GetWidthPoint(pageContext, fontSizePoints);
Font dFont = new Font(baseFont, fontSizePoints);
dFont.Color = new BaseColor(color);
PlaceText(writer.DirectContent, pageContext,
new Font(baseFont, fontSizePoints,
Font.NORMAL,
new BaseColor(color)), llx, lly, urx, ury, 14,
Element.ALIGN_RIGHT);
}
}
catch (Exception)
{
}
谢谢我尝试使用float w=baseFont.GetWidthPoint(pageContext,fontSizePoints);但是它没有给我正确的宽度。上下文正在中断,我将升级到iText 7并使用pdfCalligraph。这样,您就可以避免此类问题。正如我在回答您之前提出的问题时所写的那样,在iText 7之前的版本中对从右到左的支持相当有限,而iText 5处于维护模式,这意味着我们不再在iText 5上进行主动开发。iText 5中没有现成的支持,因此您必须自己扩展iText 5,或者切换到iText 7。@BrunoLowagie我知道您是itextsharp解决方案的最佳希望,并且您比其他任何人都更了解这个库,这是我在这个项目中的最后一个问题。所有项目都是使用itext 5构建的,现在覆盖所有项目代码将是非常困难的。必须有某种方法来完成此问题。如果您几乎准备好投入生产(除了此问题),也许是时候获得商业许可证和支持合同来解决此问题了。无论如何,您可能需要商业许可证,因为只有遵守AGPL的规则,您才能免费使用iTextSharp。你知道这些规则吗?你的应用程序的上下文是什么?我有超过50K的声誉,所以我也有一段时间处于堆栈溢出状态。当面对像你这样的人时,我经常使用“给予者必须设定限制,但接受者很少这样做”这样的表达方式。事实上,你多年来一直处于人满为患的状态,但仍然没有获得>100的声誉,事实上你正在寻找一个不愿意付钱的解决方案,这告诉我,你是一个什么都不给的接受者。你是这样看待这个社区的吗?作为一个你可以免费得到东西而不需要任何回报的地方?float w=baseFont.GetWidthPoint(pageContext,fontSizePoints);不在使用中
protected static void PlaceText(PdfContentByte pdfContentByte
, string text
, iTextSharp.text.Font font
, float lowerLeftx
, float lowerLefty
, float upperRightx
, float upperRighty
, float leading
, int alignment)
{
ColumnText ct = new ColumnText(pdfContentByte);
ct.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
ct.SetSimpleColumn(new Phrase(text, font), lowerLeftx, lowerLefty, upperRightx, upperRighty, leading, alignment);
ct.Go();
}