iText生成pdf处理中文时标点可能会在行首,如何解决?

cherokee_zhang 2011-11-29 10:26:04
各位前辈,小弟在使用iText生成pdf,在使用分栏填充内容时,中文的标点会在行首,这个如何解决啊?

我试过继承DefaultSplitCharacter类,然后去修改分隔符。如果直接往document中添加段落没有问题,可以处理中文标点,但放入分栏中就不行了。

最后,我去直接修改DefaultSplitCharacter类也没有实现。

iText 的DefaultSplitCharacter类中有这样一段
return ((c >= 0x2002 && c <= 0x200b)
|| (c >= 0x2e80 && c < 0xd7a0)
|| (c >= 0xf900 && c < 0xfb00)
|| (c >= 0xfe30 && c < 0xfe50)
|| (c >= 0xff61 && c < 0xffa0));

这样就会把部分中文作为分隔符,对吧?这好像和不能将中文标点放在行首冲突吧?

小弟跪拜!
...全文
1571 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoghurt 2014-07-19
  • 打赏
  • 举报
回复
引用 3 楼 cherokee_zhang 的回复:
首先,要明白为什么在分栏的时候中文标点会出现在前面。你看DefaultSplitCharacter类,会明白,iText将中文也看成是分割符,只要将一栏的宽度填满,他就换行,不管下一个字符是什么。 顺着上面的问题,继续。 要解决这个问题: 第一要修改DefaultSplitCharacter类,添加所需的中文符号; if (ChineseSymbolSplit.chSymSplits.contains(c)) { return true; } 第二要修改分栏中调用写一行的那个类:iTextMe\src\com\itextpdf\text\pdf\BidiLine.java 中的 processLine()方法。 在方法内添加判断 int nextUnic = 0; float nextCharWidth = 0; if (currentChar < totalTextLength-1) { // nextUnic = ck.getUnicodeEquivalent(text[currentChar+1]); nextSurrogate = Utilities.isSurrogatePair(text, currentChar+1); if (nextSurrogate){ nextUnic = ck.getUnicodeEquivalent(Utilities.convertToUtf32(text, currentChar+1)); nextCharWidth = ck.getCharWidth(nextUnic); } else{ nextUnic = ck.getUnicodeEquivalent(text[currentChar+1]); nextCharWidth = ck.getCharWidth(text[currentChar+1]); } /** * 在一下内容判断前,先判断该字符与下一字符的宽度是否可以换行,如果宽度已经可以换行,则判断下一个字符是否为中文标点! */ if (width - charWidth - nextCharWidth < 0) { if (ChineseSymbolSplit.isIncludeChar(nextUnic)) { // System.out.println("不能以标点符号开头!"); break; } } } //注:我是将所有的中文标点都封装到一个类了 import java.util.ArrayList; import java.util.List; /** * 不能放在行首的中文标点 * @author Administrator * */ public class ChineseSymbolSplit { public static List<Character> chSymSplits; static { chSymSplits = new ArrayList<Character>(); chSymSplits.add(','); chSymSplits.add('。'); chSymSplits.add('!'); chSymSplits.add(';'); chSymSplits.add('?'); /** 添加你所需的标点 ***/ } public static boolean isIncludeChar(int srcChar) { for (int i = 0; i < chSymSplits.size(); i++) { if (chSymSplits.get(i) == srcChar) { return true; } } return false; } }
这个方法试过了,没有达到效果啊!问题出现在哪里?
yoghurt 2014-07-19
  • 打赏
  • 举报
回复
你好,搞定了没啊
prettyboy434 2012-05-09
  • 打赏
  • 举报
回复
你好,能说下,正常不分栏情况下,怎么去除行首标点吗
cherokee_zhang 2011-12-13
  • 打赏
  • 举报
回复
首先,要明白为什么在分栏的时候中文标点会出现在前面。你看DefaultSplitCharacter类,会明白,iText将中文也看成是分割符,只要将一栏的宽度填满,他就换行,不管下一个字符是什么。

顺着上面的问题,继续。
要解决这个问题:
第一要修改DefaultSplitCharacter类,添加所需的中文符号;
if (ChineseSymbolSplit.chSymSplits.contains(c)) {
return true;
}
第二要修改分栏中调用写一行的那个类:iTextMe\src\com\itextpdf\text\pdf\BidiLine.java 中的
processLine()方法。
在方法内添加判断
int nextUnic = 0;
float nextCharWidth = 0;

if (currentChar < totalTextLength-1) {
// nextUnic = ck.getUnicodeEquivalent(text[currentChar+1]);
nextSurrogate = Utilities.isSurrogatePair(text, currentChar+1);

if (nextSurrogate){
nextUnic = ck.getUnicodeEquivalent(Utilities.convertToUtf32(text, currentChar+1));
nextCharWidth = ck.getCharWidth(nextUnic);
}
else{
nextUnic = ck.getUnicodeEquivalent(text[currentChar+1]);
nextCharWidth = ck.getCharWidth(text[currentChar+1]);
}
/**
* 在一下内容判断前,先判断该字符与下一字符的宽度是否可以换行,如果宽度已经可以换行,则判断下一个字符是否为中文标点!
*/

if (width - charWidth - nextCharWidth < 0) {
if (ChineseSymbolSplit.isIncludeChar(nextUnic)) {
// System.out.println("不能以标点符号开头!");
break;
}
}
}


//注:我是将所有的中文标点都封装到一个类了
import java.util.ArrayList;
import java.util.List;

/**
* 不能放在行首的中文标点
* @author Administrator
*
*/
public class ChineseSymbolSplit {
public static List<Character> chSymSplits;

static {
chSymSplits = new ArrayList<Character>();
chSymSplits.add(',');
chSymSplits.add('。');
chSymSplits.add('!');
chSymSplits.add(';');
chSymSplits.add('?');

/** 添加你所需的标点 ***/


}

public static boolean isIncludeChar(int srcChar) {
for (int i = 0; i < chSymSplits.size(); i++) {
if (chSymSplits.get(i) == srcChar) {
return true;
}
}
return false;
}

}
redsignal 2011-12-01
  • 打赏
  • 举报
回复
怎样搞定的,请详细说说。
cherokee_zhang 2011-11-29
  • 打赏
  • 举报
回复
搞定了,要重写iText源码!

50,541

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧