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

