You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:22:35