本文共 1699 字,大约阅读时间需要 5 分钟。
我用的是iText-5.5.10,版本差别不是很大的话,应该都可以这么修改
最近在使用iText生成PDF时,遇到了行首标点问题,可是找了半天,也没找到一个明确的可行解决方案,后来找到一个看着比较靠谱的,http://bbs.csdn.net/topics/380075439,也说的模模糊糊的,试了也没好使,不过也提供了一个思路。
下面直接上干货
下载iText源码,改源码是最直接有效的
解压后将itext子项目导入开发工具中,待会改完后还要重新打包的
添加一个中文标点数据类 package com.itextpdf.text.pdf;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2017/6/16.
*/
public class ChineseSymbolSplit {
public static List chSymSplits;
static {
chSymSplits = new ArrayList();
chSymSplits.add(',');
chSymSplits.add('、');
chSymSplits.add('。');
chSymSplits.add(':');
chSymSplits.add('!');
chSymSplits.add(';');
chSymSplits.add('?');
/** 添加你所需的标点 ***/
}
}
找到类com.itextpdf.text.pdf.PdfChunk的split(float width)方法中修改 if (character == ' ') {
lastSpace = currentPosition + 1;
lastSpaceWidth = currentWidth;
} 为 if (character == ' ' || ChineseSymbolSplit.chSymSplits.contains(character)) {
lastSpace = currentPosition + 1;
lastSpaceWidth = currentWidth;
}
大概在367行和402行(不同版本,可能会有点差别)
到这,内容中的行首中文标点只调整好了一半,下面图1这种情况已经Ok了,但图2还不行
图1
图2
接着来,找到com.itextpdf.text.pdf.BidiLine中trimRightEx(int startIdx, int endIdx)方法,在"return idx;"前添加 //当下一个元素是标点时,前移一位
if(ChineseSymbolSplit.chSymSplits.contains(text[idx + 1]) && idx > 0){
idx--;
}
找到trimLeftEx(int startIdx, int endIdx)方法前,在"return idx;"前添加 //当前元素是标点时,前移一位
if(ChineseSymbolSplit.chSymSplits.contains(text[idx]) && idx > 0){
idx--;
}
(备注:这里的修改我使用的是将上一行的最后一个字挪下来的方式)
到这,修改就完了,将项目重新打包,引入到你的项目中,再试下生成的PDF效果
补充:
到了实际应用时,出现了一种空行的问题,如下图
所以再添加一点改进,解决这个问题
找到com.itextpdf.text.pdf.PdfLine文件中的add(PdfChunk chunk)方法
在“newlineSplit = chunk.isNewlineSplit() || overflow == null;”前添加如下代码
if(overflow != null && overflow.value.trim().length() == 0){
overflow = null;
}
再试下,看是不是搞定了呢
转载地址:https://blog.csdn.net/weixin_39861823/article/details/114954551 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!