java 修改pdf_JAVA替换PDF文字

1 importcom.itextpdf.text.BaseColor;2 importcom.itextpdf.text.Font;3 importcom.itextpdf.text.Rectangle;4 importcom.itextpdf.text.pdf.BaseFont;5 importcom.itextpdf.text.pdf.PdfContentByte;6 importcom.itextpdf.text.pdf.PdfReader;7 importcom.itextpdf.text.pdf.PdfStamper;8 importcom.itextpdf.text.pdf.parser.PdfReaderContentParser;9

10 importjava.io.FileOutputStream;11 importjava.util.ArrayList;12 importjava.util.HashMap;13 importjava.util.List;14 importjava.util.Map;15

16 /**

17 * pdf替换文字工具类18 *19 * 思路:20 * 1.逐页搜索关键字,逐页匹配21 * 2.先读取一页的所有字符信息,存放到allItems中22 * 3.把一页的字符拼接成字符串,然后匹配关键字,匹配上,记录匹配的第一个字符的MatchItem信息;匹配不是,继续下一页匹配23 * 4.根据匹配字符串的长度和字符的宽高信息画遮罩层,然后替换文字生成新的pdf文件24 *25 * 不足之处:26 * 1.目前只支持单字符串匹配27 * 2.替换之后的文字无法和原pdf中替换掉的文字信息一致(主要有:字体大小、样式等)28 * 3.某些情况下(主要是替换字体的大小)替换之后显示不是太整齐29 * 4.字体大小、样式无法把控30 * 5.无法匹配目标文字在两页中显示的情况(例如:目标文字:替换工具,第一页页尾有替换两字,第二页页首有工具二字)31 *32 */

33 public classPdfUtils {34

35 public static void main(String[] args) throwsException{36 //List matchItems = matchPage(“C:\\Users\\Desktop\\pdftest.pdf”, “系统”);37 //for(MatchItem m : matchItems){38 //System.out.println(m);39 //}40 //manipulatePdf(“C:\\Users\\Desktop\\pdftest.pdf”,”C:\\Users\\Desktop\\pdftest_new.pdf”,matchItems,”系统”);

41 String src = “C:\\\\Users\\\\Desktop\\\\pdftest.pdf”;42 String dest = “C:\\\\Users\\\\Desktop\\\\pdftest_new.pdf”;43 String keyWord = “登陆”;44 String keyWordNew = “测试”;45 pdfReplace(src,dest,keyWord,keyWordNew);46 }47

48 /**

49 * 根据关键字和pdf路径,全文搜索关键字50 *@paramfilePath pdf目标路径51 *@paramkeyword 关键字52 *@return

53 *@throwsException54 */

55 public static List matchAll(String filePath, String keyword) throwsException {56 List items = new ArrayList();57 PdfReader reader = newPdfReader(filePath);58 //获取pdf页数

59 int pageSize =reader.getNumberOfPages();60 //逐页匹配关键字

61 for(int page = 1;page <= pageSize;page++){62 items.addAll(matchPage(reader,page,keyword));63 }64 returnitems;65 }66

67 /**

68 * 根据关键字、文档路径、pdf页数寻找特定的文件内容69 *@paramreader70 *@parampageNumber 页数71 *@paramkeyword 关键字72 *@return

73 *@throwsException74 */

75 public static List matchPage(PdfReader reader, Integer pageNumber,String keyword) throwsException {76 PdfReaderContentParser parse = newPdfReaderContentParser(reader);77 Rectangle rectangle =reader.getPageSize(pageNumber);78 //匹配监听

79 KeyWordPositionListener renderListener = newKeyWordPositionListener();80 renderListener.setKeyword(keyword);81 renderListener.setPageNumber(pageNumber);82 renderListener.setCurPageSize(rectangle);83 parse.processContent(pageNumber, renderListener);84 returnfindKeywordItems(renderListener,keyword);85 }86

87 /**

88 * 找到匹配的关键词块89 *@paramrenderListener90 *@paramkeyword91 *@return

92 */

93 public static ListfindKeywordItems(KeyWordPositionListener renderListener,String keyword){94 //先判断本页中是否存在关键词

95 List allItems = renderListener.getAllItems();//所有块LIST

96 StringBuffer sbtemp = new StringBuffer(“”);97

98 for(MatchItem item : allItems){//将一页中所有的块内容连接起来组成一个字符串。

99 sbtemp.append(item.getContent());100 }101

102 List matches =renderListener.getMatches();103

104 //一页组成的字符串没有关键词,直接return105 //第一种情况:关键词与块内容完全匹配的项,直接返回

106 if(sbtemp.toString().indexOf(keyword) == -1 || matches.size() > 0){107 returnmatches;108 }109 //第二种情况:多个块内容拼成一个关键词,则一个一个来匹配,组装成一个关键词

110 sbtemp = new StringBuffer(“”);111 List tempItems = newArrayList();112 for(MatchItem item : allItems){113 if(keyword.indexOf(item.getContent()) != -1){114 tempItems.add(item);115 sbtemp.append(item.getContent());116

117 if(keyword.indexOf(sbtemp.toString()) == -1){//如果暂存的字符串和关键词 不再匹配时

118 sbtemp = newStringBuffer(item.getContent());119 tempItems.clear();120 tempItems.add(item);121 }122

123 if(sbtemp.toString().equalsIgnoreCase(keyword)){//暂存的字符串正好匹配到关键词时

124 matches.add(tempItems.get(0));//得到匹配的项

125 sbtemp = new StringBuffer(“”);//清空暂存的字符串

126 tempItems.clear();//清空暂存的LIST

127 continue;//继续查找

128 }129 }else{//如果找不到则清空

130 sbtemp = new StringBuffer(“”);131 tempItems.clear();132 }133 }134 returnmatches;135 }136

137 /**

138 * 替换目标文字,生成新的pdf文件139 *@paramsrc 目标pdf路径140 *@paramdest 新pdf的路径141 *@throwsException142 */

143 public static void manipulatePdf(String src,String dest,List matchItems,String keyWord,String keyWordNew) throwsException{144 PdfReader reader = newPdfReader(src);145 PdfStamper stamper = new PdfStamper(reader, newFileOutputStream(dest));146 PdfContentByte canvas = null;147 Map> mapItem = new HashMap>();148 List itemList = null;149 for(MatchItem item : matchItems){150 Integer pageNum =item.getPageNum();151 if(mapItem.containsKey(pageNum)){152 itemList =mapItem.get(pageNum);153 itemList.add(item);154 mapItem.put(pageNum,itemList);155 }else{156 itemList = new ArrayList();157 itemList.add(item);158 mapItem.put(pageNum,itemList);159 }160 }161 //遍历每一页去修改

162 for(Integer page : mapItem.keySet()){163 List items =mapItem.get(page);164 //遍历每一页中的匹配项

165 for(MatchItem item : items){166 canvas =stamper.getOverContent(page);167 float x =item.getX();168 float y =item.getY();169 float fontWidth =item.getFontWidth();170 float fontHeight =item.getFontHeight();171 canvas.saveState();172 canvas.setColorFill(BaseColor.WHITE);173 canvas.rectangle(x, y,fontWidth*keyWord.length(),fontWidth+2);174 canvas.fill();175 canvas.restoreState();176 //开始写入文本

177 canvas.beginText();178 BaseFont bf = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”, BaseFont.EMBEDDED);179 Font font = newFont(bf,fontWidth,Font.BOLD);180 //设置字体和大小

181 canvas.setFontAndSize(font.getBaseFont(), fontWidth);182 //设置字体的输出位置

183 canvas.setTextMatrix(x, y+fontWidth/10+0.5f);184 //要输出的text

185 canvas.showText(keyWordNew);186

187 canvas.endText();188 }189 }190 stamper.close();191 reader.close();192 System.out.println(“complete”);193 }194

195 /**

196 * 替换pdf中指定文字197 *@paramsrc 目标pdf路径198 *@paramdest 新pdf的路径199 *@paramkeyWord 替换的文字200 *@paramkeyWordNew 替换后的文字201 *@throwsException202 */

203 public static void pdfReplace(String src,String dest,String keyWord,String keyWordNew) throwsException{204 manipulatePdf(src,dest,matchAll(src,keyWord),keyWord,keyWordNew);205 }206 }

    原文作者:勃珍妮
    原文地址: https://blog.csdn.net/weixin_34891129/article/details/114045301
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞