之前替换PDFBOX文本一直替换不了,查看到网上很多案例全都是直接使用cosstring.setValue。并没有效果。直到研究了PDFTextStripper的showText方法(解析)以及PDPageContentStream的showText方法(写入)才得到最终的解决方案。
首先在官方的exmaple文档中有个RemoveAll的案例这个案例当中是去除所有pdf的文字(github搜索pdfbox找到exmaple),得到图片。可以看到操作符Tj,TJ是写入文字,前一个token就是COSString。Tf是设置文字前两个token是字体。我们对这个方法体改造就可以做到替换文本了。
关键点:PDFont的encode方法,PDFont 的readCode方法,PDFont的toUnicode方法,替换当前PDFont为自己加载的pdfont。
public static List<Object> replaceText(PDContentStream contentStream, PDDocument document,String witch,String replace) throws Exception {
//得到当前页面的所有的资源
PDResources resources = contentStream.getResources();
//解析当前页面,并得到token
PDFStreamParser parser = new PDFStreamParser(contentStream);
Object token = parser.parseNextToken();
List<Object> newTokens = new ArrayList<Object>();
Map<COSName,PDFont> fon