现在有一个这样的需求。
需要将pdf模版内的文字替换成指定的文字。
这个本身没什么难的, 官网就有demo。
但是涉及到中文的话就有点麻烦了。
在网上搜了半天也没找到解决方案。
于是自己写了一个。
也许会有bug 但是满足了我的需求。
之前遇到了显示中文的问题,
BaseFont bfChinese = BaseFont.createFont("STSong-Light",
"UniGB-UTF16-H", BaseFont.NOT_EMBEDDED);
用了 utf16的编码。 到替换的时候官网的demo就不好用了,java又没有 支持 UniGB-UTF16-H。
只能自己写一个Charset 放到jar包里来支持这种编码。我觉得太麻烦了(其实是不会)。
所以手动替换一下吧。
下边的函数实现了 将指定的byte数组内的字符串替换。
不过因为是pdf里边,只适用于替换utf16的。
public byte[] replace(byte[] data, String from, String to) {
try {
byte[] fromArr = from.getBytes("utf16");
List<Byte> fromList = new LinkedList<Byte>();
for (int i = 2; i < fromArr.length; i++) {
fromList.add(fromArr[i]);
}
byte[] toArr = to.getBytes("utf16");
List<Byte> toList = new LinkedList<Byte>();
for (int i = 2; i < toArr.length; i++) {
toList.add(toArr[i]);
}
List<Byte> dataList = new LinkedList<Byte>();
for (int i = 0; i < data.length; i++) {
dataList.add(data[i]);
}
// 可能有bug 只替换 ${}
int countSub = 0;
for (int i = 35; i < dataList.size(); i++) {
if (dataList.get(i).equals(fromList.get(0))) {
boolean isSub = true;
for (int j = 0; j < fromList.size(); j++) {
if ((i + j) < dataList.size()) {
if (!dataList.get(i + j).equals(fromList.get(j))) {
isSub = false;
}
} else {
isSub = false;
}
}
if (isSub) {
countSub++;
for (int j = 0; j < fromList.size(); j++) {
dataList.remove(i);
}
dataList.addAll(i, toList);
}
}
}
byte[] replaceData = new byte[dataList.size()];
for (int i = 0; i < replaceData.length; i++) {
replaceData[i] = dataList.get(i);
}
return replaceData;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
之前遇到了显示中文的问题