iTextSharp:如何缩放字体以使其填充矩形的多行
iTextSharp: how to scale font to make a multiline it fill a rectangle
使用 iTextSharp,我必须用文本填充给定的矩形,包括高度和宽度。文本可以换行,我必须找到正确的字体大小才能填充矩形。
包装文本不是问题我有一个递归函数,return 一个包含所有可能包装配置的数组。
这不是 gdi+ 的问题,但是 使用 iTextSharp 我在找到我的文本的高度时遇到问题,一旦它换行(即包含“\n”)
有什么帮助吗?
我发现这篇文章非常有用,它从另一个角度解决了我的问题:
Centered, multiline text using iTextSharp ColumnText
已添加:示例代码:
string text = "Lorem Ipsum è un testo segnaposto utilizzato nel settore della tipografia e della stampa. Lorem Ipsum è considerato il testo segnaposto standard sin dal sedicesimo secolo, quando un anonimo tipografo prese una cassetta di caratteri e li assemblò per preparare un testo campione. È sopravvissuto non solo a più di cinque secoli, ma anche al passaggio alla videoimpaginazione, pervenendoci sostanzialmente inalterato. Fu reso popolare, negli anni ’60, con la diffusione dei fogli di caratteri trasferibili “Letraset”, che contenevano passaggi del Lorem Ipsum, e più recentemente da software di impaginazione come Aldus PageMaker, che includeva versioni del Lorem Ipsum.";
Rectangle rect3 = new Rectangle(1000f, 0f, 2000f, 1000f);
// Determine correct font size
Font font3 = new Font(FontFactory.GetFont(FontFactory.HELVETICA, 1000, Font.NORMAL, Color.BLACK));
float fontSize2 = FitText(font3, text, rect3, 1000, PdfWriter.RUN_DIRECTION_DEFAULT);
PdfContentByte contentByte = writer.DirectContent;
Chunk chunk = new Chunk(text, new Font(FontFactory.GetFont(FontFactory.HELVETICA, fontSize2, Font.NORMAL, Color.BLACK)));
Phrase text33 = new Phrase(chunk);
ColumnText columnText4 = new ColumnText(cb);
columnText4.SetSimpleColumn(rect3.GetLeft(0), 0,rect3.GetRight(0), rect3.GetTop(0));
columnText4.SetText(text33);
cb.SaveState();
cb.SetColorStroke(Color.RED);
cb.Rectangle(rect3.GetLeft(0), rect3.GetBottom(0), rect3.GetRight(0), rect3.GetTop(0));
cb.Stroke();
cb.RestoreState();
columnText4.Alignment = Element.ALIGN_LEFT;
columnText4.Go();
doc.Close();
此外,即使使用 columnText4.SetSimpleColumn,我也遇到了麻烦,它呈现出 与我的 rect3 不同的 矩形...
EDIT2:使用这个似乎可以解决问题,但我真的不明白为什么我必须强制使用 leadong 作为字体大小:
columnText4.SetSimpleColumn(rect3.Left, rect3.Bottom, rect3.Right, rect3.Top, fontSize2, Element.ALIGN_LEFT);
使用ColumnText.FitText(Font font, String text, Rectangle rect, float maxFontSize, int runDirection)。它returns字体大小。
下载了资源,不是所有的都好,但我不明白这个:
段落使用 1.5 * 字体大小作为前导。
setText 忽略前导并使用默认值 (16f = 12f x 1.5)
所以如果我想使用 setText,我必须提供前导。但是函数 FitText 以 1 * fontsize 前导计算字体大小,因此使用默认 1.5 前导是不正确的,而另一个函数使用默认 16f...
我设法用一个额外的参数扩展 FitText:乘数(1、1.5 等)。这节省了我的时间。
使用 iTextSharp,我必须用文本填充给定的矩形,包括高度和宽度。文本可以换行,我必须找到正确的字体大小才能填充矩形。
包装文本不是问题我有一个递归函数,return 一个包含所有可能包装配置的数组。
这不是 gdi+ 的问题,但是 使用 iTextSharp 我在找到我的文本的高度时遇到问题,一旦它换行(即包含“\n”)
有什么帮助吗?
我发现这篇文章非常有用,它从另一个角度解决了我的问题:
Centered, multiline text using iTextSharp ColumnText
已添加:示例代码:
string text = "Lorem Ipsum è un testo segnaposto utilizzato nel settore della tipografia e della stampa. Lorem Ipsum è considerato il testo segnaposto standard sin dal sedicesimo secolo, quando un anonimo tipografo prese una cassetta di caratteri e li assemblò per preparare un testo campione. È sopravvissuto non solo a più di cinque secoli, ma anche al passaggio alla videoimpaginazione, pervenendoci sostanzialmente inalterato. Fu reso popolare, negli anni ’60, con la diffusione dei fogli di caratteri trasferibili “Letraset”, che contenevano passaggi del Lorem Ipsum, e più recentemente da software di impaginazione come Aldus PageMaker, che includeva versioni del Lorem Ipsum.";
Rectangle rect3 = new Rectangle(1000f, 0f, 2000f, 1000f);
// Determine correct font size
Font font3 = new Font(FontFactory.GetFont(FontFactory.HELVETICA, 1000, Font.NORMAL, Color.BLACK));
float fontSize2 = FitText(font3, text, rect3, 1000, PdfWriter.RUN_DIRECTION_DEFAULT);
PdfContentByte contentByte = writer.DirectContent;
Chunk chunk = new Chunk(text, new Font(FontFactory.GetFont(FontFactory.HELVETICA, fontSize2, Font.NORMAL, Color.BLACK)));
Phrase text33 = new Phrase(chunk);
ColumnText columnText4 = new ColumnText(cb);
columnText4.SetSimpleColumn(rect3.GetLeft(0), 0,rect3.GetRight(0), rect3.GetTop(0));
columnText4.SetText(text33);
cb.SaveState();
cb.SetColorStroke(Color.RED);
cb.Rectangle(rect3.GetLeft(0), rect3.GetBottom(0), rect3.GetRight(0), rect3.GetTop(0));
cb.Stroke();
cb.RestoreState();
columnText4.Alignment = Element.ALIGN_LEFT;
columnText4.Go();
doc.Close();
此外,即使使用 columnText4.SetSimpleColumn,我也遇到了麻烦,它呈现出 与我的 rect3 不同的 矩形...
EDIT2:使用这个似乎可以解决问题,但我真的不明白为什么我必须强制使用 leadong 作为字体大小: columnText4.SetSimpleColumn(rect3.Left, rect3.Bottom, rect3.Right, rect3.Top, fontSize2, Element.ALIGN_LEFT);
使用ColumnText.FitText(Font font, String text, Rectangle rect, float maxFontSize, int runDirection)。它returns字体大小。
下载了资源,不是所有的都好,但我不明白这个:
段落使用 1.5 * 字体大小作为前导。
setText 忽略前导并使用默认值 (16f = 12f x 1.5)
所以如果我想使用 setText,我必须提供前导。但是函数 FitText 以 1 * fontsize 前导计算字体大小,因此使用默认 1.5 前导是不正确的,而另一个函数使用默认 16f...
我设法用一个额外的参数扩展 FitText:乘数(1、1.5 等)。这节省了我的时间。