gpt4 book ai didi

java - 如何使用 iText 获取连字的宽度

转载 作者:行者123 更新时间:2023-12-02 01:51:10 24 4
gpt4 key购买 nike

如何获取连字的宽度?假设我有一个连字 ff 我能得到它的确切宽度吗?当我这样做时:

doc.setProperty(Property.TYPOGRAPHY_CONFIG, new TypographyConfigurator()
.addFeatureConfig(
new StandardScriptConfig(new HashSet<Character.UnicodeScript>(Arrays.asList(Character.UnicodeScript.LATIN, Character.UnicodeScript.CYRILLIC)))
.setLigaturesApplying(true)
));
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.IDENTITY_H, true);
font.getWidth("ff", 13);

这给出了通常的宽度 ff

最佳答案

具体获取“ff”连字的宽度

相关连字有其自己指定的 Unicode 字符 U+FB00,因此您可以使用它来获取它。

font.getWidth("\uFB00", 12);

获取pdfCalligraph处理的任意文本字符串的宽度

通过指定Property.TYPOGRAPHY_CONFIG,您隐式使用pdfCalligraph模块,该模块负责应用连字等书法功能。这是一个闭源附加组件,没有可与之交互的公共(public) API,旨在无缝集成到现有代码中。

要使任何布局元素有效(因为它将显示在生成的 PDF 中),您可以手动布局此类元素,然后获取布局结果的一些属性,例如计算的宽度。

您可以使用如下方法来计算文本的宽度:

float calculateTextWidth(Document document, String text) throws IOException {
PdfFont font = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
Paragraph p = new Paragraph(text).setFont(font);
IRenderer paragraphRenderer = p.createRendererSubTree();
paragraphRenderer.setParent(document.getRenderer()).layout(new LayoutContext(new LayoutArea(1, new Rectangle(100, 100))));
return paragraphRenderer.getChildRenderers().get(0).getOccupiedArea().getBBox().getWidth();
}

确保传递给 LayoutArea 构造函数的矩形足够大,可以容纳所有文本(在我们的例子中 100x100 就足够了)。

然后,如果您尝试在设置 Property.TYPOGRAPHY_CONFIG 之前和之后比较该方法的输出,只要字体包含连字,您很可能会看到不同的值。就我而言,这些值分别为 9.9849.768。由于您对连字的宽度感兴趣,请确保在将版式配置应用于文档后调用此方法。

关于java - 如何使用 iText 获取连字的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52976781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com