1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > itext文本域自动换行_iText+Flying Saucer生成pdf文档 重写Breaker中文可以换行 但

itext文本域自动换行_iText+Flying Saucer生成pdf文档 重写Breaker中文可以换行 但

时间:2021-08-29 19:14:08

相关推荐

itext文本域自动换行_iText+Flying Saucer生成pdf文档 重写Breaker中文可以换行 但

网上有好多重新的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中文可以换行 但是英文单词会截断问题

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。