网上有好多重新的Breaker的案例或者代码,但是如果其中涉及到英文,那么单词也会直接被拦腰截断,这不是我们想要的结果,我有重写了一下Breaker,完美解决这个问题,废话不多说,代码如下:

package org.xhtmlrenderer.layout;import org.xhtmlrenderer.css.constants.IdentValue;
import org.xhtmlrenderer.css.style.CalculatedStyle;
import org.xhtmlrenderer.render.FSFont;public class Breaker {public static void breakFirstLetter(LayoutContext c, LineBreakContext context,int avail, CalculatedStyle style) {FSFont font = style.getFSFont(c);context.setEnd(getFirstLetterEnd(context.getMaster(), context.getStart()));context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));if (context.getWidth() > avail) {context.setNeedsNewLine(true);context.setUnbreakable(true);}}private static int getFirstLetterEnd(String text, int start) {int i = start;while (i < text.length()) {char c = text.charAt(i);int type = Character.getType(c);if (type == Character.START_PUNCTUATION ||type == Character.END_PUNCTUATION ||type == Character.INITIAL_QUOTE_PUNCTUATION ||type == Character.FINAL_QUOTE_PUNCTUATION ||type == Character.OTHER_PUNCTUATION) {i++;} else {break;}}if (i < text.length()) {i++;}return i;}public static void breakText(LayoutContext c,LineBreakContext context, int avail, CalculatedStyle style) {FSFont font = style.getFSFont(c);IdentValue whitespace = style.getWhitespace();// ====== handle nowrapif (whitespace == IdentValue.NOWRAP) {context.setEnd(context.getLast());context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));return;}//check if we should break on the next newlineif (whitespace == IdentValue.PRE ||whitespace == IdentValue.PRE_WRAP ||whitespace == IdentValue.PRE_LINE) {int n = context.getStartSubstring().indexOf(WhitespaceStripper.EOL);if (n > -1) {context.setEnd(context.getStart() + n + 1);context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));context.setNeedsNewLine(true);context.setEndsOnNL(true);} else if (whitespace == IdentValue.PRE) {context.setEnd(context.getLast());context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));}}//check if we may wrapif (whitespace == IdentValue.PRE ||(context.isNeedsNewLine() && context.getWidth() <= avail)) {return;}context.setEndsOnNL(false);String currentString = context.getStartSubstring();int left = 0;
//        int right = currentString.indexOf(WhitespaceStripper.SPACE, left + 1);int right = getStrRight(currentString,left);int lastWrap = 0;int graphicsLength = 0;int lastGraphicsLength = 0;while (right > 0 && graphicsLength <= avail) {lastGraphicsLength = graphicsLength;graphicsLength += c.getTextRenderer().getWidth(c.getFontContext(), font, currentString.substring(left, right));lastWrap = left;left = right;
//            right = currentString.indexOf(WhitespaceStripper.SPACE, left + 1);right = getStrRight(currentString,left+1);}if (graphicsLength <= avail) {//try for the last bit too!lastWrap = left;lastGraphicsLength = graphicsLength;graphicsLength += c.getTextRenderer().getWidth(c.getFontContext(), font, currentString.substring(left));}if (graphicsLength <= avail) {context.setWidth(graphicsLength);context.setEnd(context.getMaster().length());//It fit!return;}context.setNeedsNewLine(true);if (lastWrap != 0) {//found a place to wrapcontext.setEnd(context.getStart() + lastWrap);context.setWidth(lastGraphicsLength);} else {//unbreakable stringif (left == 0) {left = currentString.length();}context.setEnd(context.getStart() + left);context.setUnbreakable(true);if (left == currentString.length()) {context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));} else {context.setWidth(graphicsLength);}}return;}private static boolean isChinese(char c) {Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {return true;}return false;}private static int getStrRight(String s,int left){if(left>=s.length())return -1;char[] ch = s.toCharArray();for(int i = left;i<ch.length;i++){if(isChinese(ch[i]) || ' ' == ch[i]){return i==0?i+1:i;}}return -1;}
}

如果有用,欢迎三连

itext文本域自动换行_iText+Flying Saucer生成pdf文档,重写Breaker中文可以换行,但是英文单词会截断问题相关推荐

  1. itext文本域自动换行_iText+Flying Saucer生成pdf文档,中文不显示和不自动换行问题...

    一.重写Breaker,添加中文识别 // Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: ...

  2. itext生成pdf文档加载中文字体解决方法

    最近接手一个任务,在网页中通过用户的输入的信息生成一个pdf文档并且下载到用户本地.iText是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML. ...

  3. 使用Flying Saucer生成pdf

    使用Flying Saucer生成pdf 实现思路: 利用FreeMarker编写HTML模板,通过Flying Saucer生成pdf. 一.maven添加依赖 本项目使用maven构建,基于spr ...

  4. Flying Saucer生成pdf报表

    使用Flying Saucer生成pdf报表: 1.首先看一下Flying Saucer的官方介绍: https://github.com/flyingsaucerproject/flyingsauc ...

  5. flyingsaucer转换多个html,用 flying saucer 生成pdf文件 Css及html的问题

    我用  flying saucer  生成PDF文件,因为要生成文章,而文章是由tinymce发布的.可能有些文章发布出去后格式有问题,比如说标签不规范,有的没有闭合. 这样 flying sauce ...

  6. freemark与flying saucer生成PDF

    freemark与flying saucer生成PDF 1.导入flying saucer与freemark的包. 2.利用freemark生成html文件. 3.利用flying saucer进行p ...

  7. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

  8. java pdf 首行缩进_java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  9. 使用itext和JasperReports生成PDF文档

    1>方法一Itext来实现生成文档这个pdf的文档 1.使用Itext来实现生成我都这个PDF的文档,代码如下 public static void main(String[] args) {t ...

最新文章

  1. 面试题鬼的很:Class.forName 和 ClassLoader 有什么区别?
  2. awk输出csv的一列
  3. 828c语言程序设计_21计算机考研只考一门高级语言程序设计的院校大汇总!
  4. requirejs与echart的一些问题
  5. 【设计模式系列】行为型之模板模式
  6. VB讲课笔记01:VB6.0安装与启动
  7. android开发所遇问题集(一)----Mr.Zhang
  8. flask 导出excel
  9. png格式图像转成jpg图像时出现异常颜色值
  10. javaScript 高级04 正则表达式(边界符、字符类、量词符)
  11. Flixel横板游戏制作教程(六)—SoundsandMusic(音效与音乐)
  12. java生成二维码QRcode方式
  13. 记一次hydra密码破解神器的学习
  14. 关于appium踩坑 selenium.common.exceptions.WebDriverException: Message: An unknown server-side error(已解决)
  15. linux 入门命令,新手入门Linux命令集锦
  16. 在线帮助中心,轻松解决售后服务问题
  17. 【斜率优化】【决策单调】xjb讲课
  18. Android Verified Boot dm-verity 优化和实战
  19. 巨坑 jom makefile debug error 2 报错
  20. matlab 计算指北角,运筹学及MATlab编程.doc

热门文章

  1. android和苹果位置共享,苹果和安卓手机修改微信共享位置方法。
  2. 微信小程序 navigator 导航
  3. 一篇文章让你解决sql报错check the manual that corresponds to your MySQL server version for the right syntax to
  4. 如何理解那些令人困惑的Windows 7文件/共享权限
  5. Shiro教程,整合SpringBoot项目实战(笔记)
  6. LCD液晶屏驱动详解
  7. 点星PBX(DotAsterisk)单台讯时MX100G-4E1数字中继网关同时混合接入电信、移动双运营商线路教程
  8. Wi-Fi DFS与TPC介绍
  9. CMDN Club #23 开放平台和O2O移动产品开发
  10. HTTP3 (QUIC) 协议