【问题标题】:iTextSharp: how to scale font to make a multiline it fill a rectangleiTextSharp:如何缩放字体以使多行填充矩形
【发布时间】:2015-02-16 11:02:48
【问题描述】:

使用 iTextSharp 我必须在给定的矩形中填充高度和宽度的文本。文本可以换行,我必须找到正确的字体大小才能填充矩形。

包装文本不是问题我有一个递归函数,它返回所有可能的包装配置的数组。

这不是 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);

【问题讨论】:

    标签: text itextsharp word-wrap


    【解决方案1】:

    使用 ColumnText.FitText(Font font, String text, Rectangle rect, float maxFontSize, int runDirection)。它返回字体大小。

    【讨论】:

    • 忘了说我用的是第4版的库,好像没有这个功能。
    • 这就是使用多年版本的问题。看新版本的代码,只有20行左右,根据自己的需要进行调整。
    • 这个功能似乎可以工作,至少它会进行一些字体计算,但是,我对领先感到困惑,我想......我会用一些代码更新主要问题
    • 我还有一个小问题:这个函数在一个单词的中间打断了我的字符串,而不是在空格上……这正常吗?有适当的分词解决方案吗?
    【解决方案2】:

    下载了源文件,并非所有内容都是正确的,但我不明白:

    段落使用 1.5 * fontsize 作为前导。

    setText 忽略前导并使用默认值 (16f = 12f x 1.5)

    所以如果我想使用 setText 我必须提供领先。但是函数 FitText 以 1 * fontsize 前导计算字体大小,因此以默认 1.5 前导使用它是不正确的,而其他函数使用默认 16f ...

    我设法用一个额外的参数扩展了 FitText:乘数(1、1.5 等)。这节省了我的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多