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

Java实现字符串句子正确换行及PDF中泰语句子合理分割

问题解答

让我分两部分来拆解你的问题,都是日常开发里常见的文本换行需求:


1. Java中实现字符串句子的正确换行

不同场景下的换行逻辑不一样,我给你列几个常用的方案:

控制台/纯文本场景

如果你要生成按语义分割的换行(比如句号、感叹号、问号后自动换行),用正则表达式就能快速搞定:

String rawText = "Hello world! This is a test sentence. How are you?";
// 匹配标点+空格,替换成标点+换行符
String wrappedText = rawText.replaceAll("([.!?])\\s+", "$1\n");
System.out.println(wrappedText);

如果是固定宽度的换行(比如每行最多30个字符),要注意非拉丁字符(比如中文、泰语)的宽度,每个这类字符占2个普通字符位置,你可以自己实现换行逻辑,或者用StringUtils(Apache Commons)的wrap方法简化操作。

GUI场景

如果是在Swing或JavaFX里,直接用组件自带的换行功能就行:比如Swing的JTextArea,只要设置setLineWrap(true)和setWrapStyleWord(true),后者会保证单词不会被截断在中间,严格按语义边界换行。


2. iText生成PDF时泰语句子的正确分割

你当前的代码用Paragraph直接加文本,iText默认按空格分割换行,这对泰语来说肯定不行——泰语本身很少用空格分隔单词,就算有空格,也得按音节/语义断词,才能达到类似Word的效果。给你几个可行的调整方案:

先确认基础:字体和编码没问题

你已经用了THSarabun Bold字体,还嵌入了IDENTITY_H编码,这一步是对的,继续保持,这是泰语正确显示的核心前提。

方案1:用Hyphenation实现泰语断词

iText的hyphenation模块支持泰语的语义断词,你需要先下载泰语的断词字典(比如th.xml),放在项目资源里,然后给Paragraph配置断词规则:

// 加载泰语断词字典,参数依次是语言代码、地区、前向连字符长度、后向连字符长度
HyphenationConfig thaiHyphen = new HyphenationConfig("th", "", 2, 2);
Paragraph para1 = new Paragraph(20, "ณ ป่าใหญ่แห่งหนึ่ง มีกระต่ายตัวหนึ่งมั่นใจในความเร็วของฝีเท้าตัวเองมาก...", fontSarabunBold);
// 给段落设置断词规则
para1.setHyphenation(thaiHyphen);

这样iText就会按照泰语的音节边界换行,不会随便截断单词。

方案2:用ColumnText手动控制布局

如果不需要连字符,只想让文本在合适的位置换行,用ColumnText比直接加Paragraph更灵活,它对东亚文字的换行支持更好:

document.open();
document.setMargins(1,1,1,1);
Font fontSarabunBold = new Font(BaseFont.createFont("fonts/THSarabun Bold.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED));

// 创建ColumnText,指定页面的可显示区域(用文档的边距)
ColumnText column = new ColumnText(writer.getDirectContent());
column.setSimpleColumn(document.left(), document.bottom(), document.right(), document.top());

// 用Phrase包裹文本,设置行高和字体
Phrase thaiPhrase = new Phrase("ณ ป่าใหญ่แห่งหนึ่ง มีกระต่ายตัวหนึ่งมั่นใจในความเร็วของฝีเท้าตัวเองมาก...", fontSarabunBold);
thaiPhrase.setLeading(20); // 和你之前的Paragraph行高一致
column.addText(thaiPhrase);

// 渲染文本,自动处理泰语换行
column.go();

document.close();

方案3:升级到iText 7(强烈推荐)

iText 7对东亚文字的支持做了大幅优化,默认就能处理泰语的语义断词,代码也更简洁:

// 初始化PDF文档
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(Constants.FILE));
Document document = new Document(pdfDoc);
document.setMargins(1, 1, 1, 1);

// 加载泰语字体
PdfFont thaiFont = PdfFontFactory.createFont("fonts/THSarabun Bold.ttf", PdfEncodings.IDENTITY_H, true);
// 创建段落,直接添加即可,iText 7会自动处理泰语换行
Paragraph para1 = new Paragraph("ณ ป่าใหญ่แห่งหนึ่ง มีกระต่ายตัวหนึ่งมั่นใจในความเร็วของฝีเท้าตัวเองมาก...")
        .setFont(thaiFont)
        .setFontSize(20)
        .setLeading(20);

document.add(para1);
document.close();

小提醒

如果你的泰语文本里有多余的空格,建议先去掉——泰语本来就不用空格分隔单词,多余的空格会干扰iText的断词逻辑。另外,确保字体文件路径正确,别让程序找不到字体。

内容的提问来源于stack exchange,提问作者Bell Aimsaard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:57:56