当前位置: 代码迷 >> 综合 >> itext文本域自动换行_iText+Flying Saucer生成pdf文档,重写Breaker中文可以换行,但是英文单词会截断问题
  详细解决方案

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

热度:123   发布时间:2023-10-18 05:23:37.0

网上有好多重新的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;}
}

如果有用,欢迎三连

  相关解决方案