如何获取XWPFParagraph中文本的twips或points长度?
获取XWPFParagraph文本的Twips/Points长度
Apache POI 的 XWPF 模块没有提供直接获取段落文本长度的 API,但可以通过遍历段落内的每个 XWPFRun,结合字体属性计算单段文本宽度再累加,比单独手动处理 Font 和 FontMetrics 要简洁不少。
实现代码
import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.AffineTransform; public class ParagraphTextLengthCalc { // 单位转换规则:1 point = 20 twips private static final int POINTS_TO_TWIPS = 20; // 获取段落文本总长度(单位:points) public static double getTotalPoints(XWPFParagraph paragraph) { double totalLen = 0.0; // 启用抗锯齿的渲染上下文,提升计算精度 FontRenderContext frc = new FontRenderContext(new AffineTransform(), true, true); for (XWPFRun run : paragraph.getRuns()) { String text = run.getText(0); if (text == null || text.isBlank()) continue; // 提取当前文本块的字体属性 String fontFamily = run.getFontFamily() != null ? run.getFontFamily() : "Arial"; int fontSize = run.getFontSize() != -1 ? run.getFontSize() : 11; // 默认11号字 int fontStyle = 0; if (run.isBold()) fontStyle |= Font.BOLD; if (run.isItalic()) fontStyle |= Font.ITALIC; // 创建对应字体并计算文本宽度 Font font = new Font(fontFamily, fontStyle, fontSize); totalLen += font.getStringBounds(text, frc).getWidth(); } return totalLen; } // 获取段落文本总长度(单位:twips) public static double getTotalTwips(XWPFParagraph paragraph) { return getTotalPoints(paragraph) * POINTS_TO_TWIPS; } }
关键注意点
- 必须遍历
XWPFRun:一个段落里可能存在多个不同格式的文本块(比如不同字体、字号、粗细),每个run的宽度需要单独计算后累加 - 字体兼容性:如果POI获取的字体在本地系统不存在,AWT会自动使用默认字体替代,可能导致计算结果有误差
- 特殊字符处理:代码默认计算换行、制表符等特殊字符的宽度,若需要忽略这类字符,可以在遍历run时添加过滤逻辑
- 精度控制:
FontRenderContext启用了抗锯齿,能提升宽度计算的准确性
内容的提问来源于stack exchange,提问作者Dmv
相关产品推荐
相关产品推荐

