Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列文本放置在绝对点itext sharp中_C#_Itext - Fatal编程技术网

C# 将列文本放置在绝对点itext sharp中

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++)

我正在使用itext sharp动态创建PDF。我使用ColumnText是因为我处理的是从右到左的内容。通过搜索web,我了解column.SetSimpleColumn接受4个参数(x,y,w,h),对吗?我的第一个问题是,我不知道列的宽度和高度,我需要它将是动态的文本内容。有人知道如何根据内容设置列宽和列高吗

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();
}