itext 中文替换内容

博客介绍了在使用iText处理PDF时遇到的中文乱码问题,以及如何通过自定义方法实现PDF模板中文内容的替换,尽管可能存在一些bug,但已满足作者的需求。文章特别强调了函数对于UTF-16编码的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在有一个这样的需求。

需要将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;
	}


之前遇到了显示中文的问题


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值