JAVA替换PDF文字

北漂追梦人 2019-06-12 11:34:00 阅读数:19 评论数:0 收藏数:0

前言:

  以下是通过网上查阅资料,东拼西凑实现的一个使用java替换pdf文字的功能。使用的是itextpdf.jar

参考:

  https://blog.csdn.net/sdizoea/article/details/75105798

  https://blog.csdn.net/sishenkankan/article/details/53107195

具体实现:

  1.引入jar包

 <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.5.13</version>
 </dependency>
 <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itext-asian</artifactId>
      <version>5.2.0</version>
 </dependency>

  2.编写实现类

    实现类主要有三个类。

    一个是用来保存关键字信息的实体类MatchItem;

    一个是匹配关键字的监听类KeyWordPositionListener;

    最后一个是查找关键字、关键字替换的实现类PdfUtils。

  具体代码如下:

  MatchItem实体类

 /**
  * 用来保存关键字信息
  */
 public class MatchItem {
 
     //页数
     private Integer pageNum;
     //x坐标
     private Float x;
     //y坐标
     private Float y;
     //页宽
     private Float pageWidth;
     //页高
     private Float pageHeight;
     //匹配字符
     private String content;
     //字体宽
     private float fontWidth;
     //字体高
     private float fontHeight = 12;
 
     public Integer getPageNum() {
         return pageNum;
     }
 
     public void setPageNum(Integer pageNum) {
         this.pageNum = pageNum;
     }
 
     public Float getX() {
         return x;
     }
 
     public void setX(Float x) {
         this.x = x;
     }
 
     public Float getY() {
         return y;
     }
 
     public void setY(Float y) {
         this.y = y;
     }
 
     public Float getPageWidth() {
         return pageWidth;
     }
 
     public void setPageWidth(Float pageWidth) {
         this.pageWidth = pageWidth;
     }
 
     public Float getPageHeight() {
         return pageHeight;
     }
 
     public void setPageHeight(Float pageHeight) {
         this.pageHeight = pageHeight;
     }
 
     public String getContent() {
         return content;
     }
 
     public void setContent(String content) {
         this.content = content;
     }
 
     public float getFontWidth() {
         return fontWidth;
     }
 
     public void setFontWidth(float fontWidth) {
         this.fontWidth = fontWidth;
     }
 
     public float getFontHeight() {
         return fontHeight;
     }
 
     public void setFontHeight(float fontHeight) {
         this.fontHeight = fontHeight;
     }
 
     @Override
     public String toString() {
         return "MatchItem{" +
                 "pageNum=" + pageNum +
                 ", x=" + x +
                 ", y=" + y +
                 ", pageWidth=" + pageWidth +
                 ", pageHeight=" + pageHeight +
                 ", content='" + content + '\'' +
                 '}';
     }
 }

  

  KeyWordPositionListener监听类

 import com.itextpdf.awt.geom.Rectangle2D;
 import com.itextpdf.text.Rectangle;
 import com.itextpdf.text.pdf.parser.ImageRenderInfo;
 import com.itextpdf.text.pdf.parser.RenderListener;
 import com.itextpdf.text.pdf.parser.TextRenderInfo;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * 用来匹配pdf的关键词 监听类
  */
 public class KeyWordPositionListener implements RenderListener {
 
     //存放匹配上的字符信息
     private List<MatchItem> matches = new ArrayList<MatchItem>();
     //存放所有的字符信息
     private List<MatchItem> allItems = new ArrayList<MatchItem>();
 
     private Rectangle curPageSize;
 
     /**
      * 匹配的关键字
      */
     private String keyword;
     /**
      * 匹配的当前页
      */
     private Integer pageNumber;
 
     @Override
     public void beginTextBlock() {
         //do nothing
     }
 
     @Override
     public void renderText(TextRenderInfo renderInfo) {
         //获取字符
         String content = renderInfo.getText();
         Rectangle2D.Float textRectangle = renderInfo.getDescentLine().getBoundingRectange();
 
         MatchItem item = new MatchItem();
         item.setContent(content);
         item.setPageNum(pageNumber);
         item.setFontHeight(textRectangle.height == 0 ? 12:textRectangle.height);//默认12
         item.setFontWidth(textRectangle.width);
         item.setPageHeight(curPageSize.getHeight());
         item.setPageWidth(curPageSize.getWidth());
         item.setX((float)textRectangle.getX());
         item.setY((float)textRectangle.getY());
 
         //若keyword是单个字符,匹配上的情况
         if(content.equalsIgnoreCase(keyword)) {
             matches.add(item);
         }
         //保存所有的项
         allItems.add(item);
     }
 
     @Override
     public void endTextBlock() {
         //do nothing
     }
 
     @Override
     public void renderImage(ImageRenderInfo renderInfo) {
         //do nothing
     }
 
     /**
      * 设置需要匹配的当前页
      * @param pageNumber
      */
     public void setPageNumber(Integer pageNumber) {
         this.pageNumber = pageNumber;
     }
 
     /**
      * 设置需要匹配的关键字,忽略大小写
      * @param keyword
      */
     public void setKeyword(String keyword) {
         this.keyword = keyword;
     }
 
     /**
      * 返回匹配的结果列表
      * @return
      */
     public List<MatchItem> getMatches() {
         return matches;
     }
 
     void setCurPageSize(Rectangle rect) {
         this.curPageSize = rect;
     }
 
     public List<MatchItem> getAllItems() {
         return allItems;
     }
 
     public void setAllItems(List<MatchItem> allItems) {
         this.allItems = allItems;
     }
 
 }

 

  PdfUtils核心功能实现类

 import com.itextpdf.text.BaseColor;
 import com.itextpdf.text.Font;
 import com.itextpdf.text.Rectangle;
 import com.itextpdf.text.pdf.BaseFont;
 import com.itextpdf.text.pdf.PdfContentByte;
 import com.itextpdf.text.pdf.PdfReader;
 import com.itextpdf.text.pdf.PdfStamper;
 import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
 
 import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 /**
  * pdf替换文字工具类
  *
  * 思路:
  * 1.逐页搜索关键字,逐页匹配
  * 2.先读取一页的所有字符信息,存放到allItems中
  * 3.把一页的字符拼接成字符串,然后匹配关键字,匹配上,记录匹配的第一个字符的MatchItem信息;匹配不是,继续下一页匹配
  * 4.根据匹配字符串的长度和字符的宽高信息画遮罩层,然后替换文字生成新的pdf文件
  *
  * 不足之处:
  * 1.目前只支持单字符串匹配
  * 2.替换之后的文字无法和原pdf中替换掉的文字信息一致(主要有:字体大小、样式等)
  * 3.某些情况下(主要是替换字体的大小)替换之后显示不是太整齐
  * 4.字体大小、样式无法把控
  * 5.无法匹配目标文字在两页中显示的情况(例如:目标文字:替换工具,第一页页尾有替换两字,第二页页首有工具二字)
  *
  */
 public class PdfUtils {
 
     public static void main(String[] args) throws Exception{
 //        List<MatchItem> matchItems = matchPage("C:\\Users\\Desktop\\pdftest.pdf", "系统");
 //        for(MatchItem m : matchItems){
 //            System.out.println(m);
 //        }
 //        manipulatePdf("C:\\Users\\Desktop\\pdftest.pdf","C:\\Users\\Desktop\\pdftest_new.pdf",matchItems,"系统");
         String src = "C:\\\\Users\\\\Desktop\\\\pdftest.pdf";
         String dest = "C:\\\\Users\\\\Desktop\\\\pdftest_new.pdf";
         String keyWord = "登陆";
         String keyWordNew = "测试";
         pdfReplace(src,dest,keyWord,keyWordNew);
     }
 
     /**
      * 根据关键字和pdf路径,全文搜索关键字
      * @param filePath pdf目标路径
      * @param keyword 关键字
      * @return
      * @throws Exception
      */
     public static List<MatchItem> matchAll(String filePath, String keyword) throws Exception {
         List<MatchItem> items = new ArrayList<MatchItem>();
         PdfReader reader = new PdfReader(filePath);
         //获取pdf页数
         int pageSize = reader.getNumberOfPages();
         //逐页匹配关键字
         for(int page = 1;page <= pageSize;page++){
             items.addAll(matchPage(reader,page,keyword));
         }
         return items;
     }
 
     /**
      * 根据关键字、文档路径、pdf页数寻找特定的文件内容
      * @param reader
      * @param pageNumber 页数
      * @param keyword 关键字
      * @return
      * @throws Exception
      */
     public static List<MatchItem> matchPage(PdfReader reader, Integer pageNumber,String keyword) throws Exception {
         PdfReaderContentParser parse = new PdfReaderContentParser(reader);
         Rectangle rectangle = reader.getPageSize(pageNumber);
         //匹配监听
         KeyWordPositionListener renderListener = new KeyWordPositionListener();
         renderListener.setKeyword(keyword);
         renderListener.setPageNumber(pageNumber);
         renderListener.setCurPageSize(rectangle);
         parse.processContent(pageNumber, renderListener);
         return findKeywordItems(renderListener,keyword);
     }
 
     /**
      * 找到匹配的关键词块
      * @param renderListener
      * @param keyword
      * @return
      */
     public static List<MatchItem> findKeywordItems(KeyWordPositionListener renderListener,String keyword){
         //先判断本页中是否存在关键词
         List<MatchItem> allItems = renderListener.getAllItems();//所有块LIST
         StringBuffer sbtemp = new StringBuffer("");
 
         for(MatchItem item : allItems){//将一页中所有的块内容连接起来组成一个字符串。
             sbtemp.append(item.getContent());
         }
 
         List<MatchItem> matches = renderListener.getMatches();
 
         //一页组成的字符串没有关键词,直接return
         //第一种情况:关键词与块内容完全匹配的项,直接返回
         if(sbtemp.toString().indexOf(keyword) == -1 || matches.size() > 0){
             return matches;
         }
         //第二种情况:多个块内容拼成一个关键词,则一个一个来匹配,组装成一个关键词
         sbtemp = new StringBuffer("");
         List<MatchItem> tempItems = new ArrayList();
         for(MatchItem item : allItems){
             if(keyword.indexOf(item.getContent()) != -1 ){
                 tempItems.add(item);
                 sbtemp.append(item.getContent());
 
                 if(keyword.indexOf(sbtemp.toString()) == -1){//如果暂存的字符串和关键词 不再匹配时
                     sbtemp = new StringBuffer(item.getContent());
                     tempItems.clear();
                     tempItems.add(item);
                 }
 
                 if(sbtemp.toString().equalsIgnoreCase(keyword)){//暂存的字符串正好匹配到关键词时
                     matches.add(tempItems.get(0));//得到匹配的项
                     sbtemp = new StringBuffer("");//清空暂存的字符串
                     tempItems.clear();//清空暂存的LIST
                     continue;//继续查找
                 }
             }else{//如果找不到则清空
                 sbtemp = new StringBuffer("");
                 tempItems.clear();
             }
         }
         return matches;
     }
 
     /**
      * 替换目标文字,生成新的pdf文件
      * @param src 目标pdf路径
      * @param dest 新pdf的路径
      * @throws Exception
      */
     public static void manipulatePdf(String src,String dest,List<MatchItem> matchItems,String keyWord,String keyWordNew) throws Exception{
         PdfReader reader = new PdfReader(src);
         PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
         PdfContentByte canvas = null;
         Map<Integer,List<MatchItem>> mapItem = new HashMap<Integer,List<MatchItem>>();
         List<MatchItem> itemList = null;
         for(MatchItem item : matchItems){
             Integer pageNum = item.getPageNum();
             if(mapItem.containsKey(pageNum)){
                 itemList = mapItem.get(pageNum);
                 itemList.add(item);
                 mapItem.put(pageNum,itemList);
             }else{
                 itemList = new ArrayList<MatchItem>();
                 itemList.add(item);
                 mapItem.put(pageNum,itemList);
             }
         }
         //遍历每一页去修改
         for(Integer page : mapItem.keySet()){
             List<MatchItem> items = mapItem.get(page);
             //遍历每一页中的匹配项
             for(MatchItem item : items){
                 canvas = stamper.getOverContent(page);
                 float x = item.getX();
                 float y = item.getY();
                 float fontWidth = item.getFontWidth();
                 float fontHeight = item.getFontHeight();
                 canvas.saveState();
                 canvas.setColorFill(BaseColor.WHITE);
                 canvas.rectangle(x, y,fontWidth*keyWord.length(),fontWidth+2);
                 canvas.fill();
                 canvas.restoreState();
                 //开始写入文本
                 canvas.beginText();
                 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                 Font font = new Font(bf,fontWidth,Font.BOLD);
                 //设置字体和大小
                 canvas.setFontAndSize(font.getBaseFont(), fontWidth);
                 //设置字体的输出位置
                 canvas.setTextMatrix(x, y+fontWidth/10+0.5f);
                 //要输出的text
                 canvas.showText(keyWordNew);
 
                 canvas.endText();
             }
         }
         stamper.close();
         reader.close();
         System.out.println("complete");
     }
 
     /**
      * 替换pdf中指定文字
      * @param src 目标pdf路径
      * @param dest 新pdf的路径
      * @param keyWord 替换的文字
      * @param keyWordNew 替换后的文字
      * @throws Exception
      */
     public static void pdfReplace(String src,String dest,String keyWord,String keyWordNew) throws Exception{
         manipulatePdf(src,dest,matchAll(src,keyWord),keyWord,keyWordNew);
     }
 }

 

  PS:以上就是功能所有实现,不足之处和适应场景程序备注里面已详细说明,每个方法的作用及参数说明也都在程序中备注说明。


版权声明:本文为[北漂追梦人]原创文章
转载请带上:http://copyfuture.com/blogs-details/20190612113453239esi64apapmsekwp
或:https://www.cnblogs.com/ntfblogs/p/10986268.html


  1. 第84节:Java中的网络编程(中)
  2. 福布斯发布2019全球亿万富豪榜
  3. Python3定时短信获得天气
  4. Intellij idea 离线安装activiti工作流插件
  5. Linux的权限管理操作-Linux从入门到精通第八天
  6. 游戏大作劲爆来袭,装台“4A”电脑所向无敌
  7. 65岁老戏骨寇振海,二婚娶小21岁娇妻,儿子帅气成为一名童星!
  8. K-近邻算法(KNN)
  9. Html和Css学习笔记-css进阶-盒模型
  10. 稳扎稳打 Silverlight 4.0 系列文章索引
  11. 用Q-learning算法实现自动走迷宫机器人
  12. 独家|Google任命陈俊廷为大中华区总裁
  13. MapReduce Shuffle 和 Spark Shuffle 原理概述
  14. 野心昭昭!美国暂停中导条约,是为了打造出本土版东风-21D吗?
  15. @Controller和@RestController源码解析
  16. 还有30亿年银河系就要和仙女星系相撞了,带着地球去流浪可以吗?
  17. 这才是泰国最基本的生活物价。
  18. G胖慌不慌?《地铁:逃离》逃离Steam转投Epic
  19. 2014年,河南修河堤挖出一古墓,距今千年,墓主是杨家将后人
  20. PHP全栈学习笔记4
  21. mysql之my.cnf详解
  22. 美国纽约一个山洞的故事,1841年“雪茄女孩”案的最后线索
  23. 9岁“天山童姥”,表白养父被拒,屠杀一家人
  24. 这个省下令“封杀”槟榔广告!曾催生草根富豪和千亿企业
  25. Python 官方中文教程(简)
  26. 里程碑!状元艾顿生涯总得分1000分
  27. java如何消除太多的if else判断?
  28. Linux下设置svn开机自启动
  29. 一个有1900万用户的萌宠社区,是怎么对付喷子、僵尸号和养号党的
  30. OPPO、华为海外互撕“名牌”,中国手机品牌决战欧洲市场
  31. 西安城墙角有个陕西唯一的藏传佛教寺院,珍藏鲜为人知的镇寺八宝
  32. 贝努小行星自转正在加速,原因未知,科学家高兴表示:机会来了
  33. 五家爆雷P2P平台的最新进展,有一家用大米偿债!
  34. 胶东半岛三大高峰,全是名山,皆有典故,你去过哪座?
  35. 500彩票网第四季净亏3600万美元 同比幅度扩大
  36. Ubuntu防火墙(ufw)配置 Nat 专有网络共用一个公网IP实现外网访问
  37. 2019年2月国内SUV销量排行榜,有的暴跌,有的大涨
  38. 世界第一三连冠梦碎!陈雨菲突破克星,中国女单时隔5年再次夺冠
  39. 《中国公有云行业白皮书》发布 阿里云腾讯云占据半壁江山
  40. 为何摄影家都爱往四川跑?
  41. 谁在背后使坏,伊朗火箭接连坠毁,事发时附近有多艘美军电子舰船
  42. 聊聊我的知识体系
  43. 世界上模仿我国最成功的例子,除了军帽,其他都是中国制造
  44. 全球零售品牌榜出炉:阿里品牌价值1312亿美元排第二
  45. 切片
  46. 关于浏览器缓存的那些事
  47. 腓尼基和迦太基的历史教训:商业繁荣的大国如何保证国家安全
  48. 中国独步全球的三种武器,怪不得这么多年西方国家都非常尊敬中国
  49. 一只“黑”鸭子的野心
  50. 油画里刻骨的乡愁,看了想哭的人都有美丽的童年
  51. 这是一个好消息,丰田和铃木宣布合作了
  52. ASP.Net Core on Linux (CentOS7) 部署时将相同的独立依赖第三方dll指向共享同一个目录
  53. 怎样踩离合器又慢又稳, 离合器的踩法技巧介绍
  54. 这个属于亚洲的“欧洲”国家,媲美瑞士,比泰国便宜,超适合旅行
  55. Flexbox
  56. 0517上节课复习
  57. 可通过的洛伦兹虫洞,希望虽然渺茫,但是有可能存在
  58. 三国志11:游戏里后期会更强的3类武将,周瑜前期其实并不厉害!
  59. 2019:炒房客退场 炒房时代宣告结束
  60. 【Windows】Win10-更改c盘下的用户文件夹名
  61. Socket简单实现ssh笔记
  62. 【CodeForces - 501B 】Misha and Changing Handles
  63. git 入门教程之里程碑式标签
  64. 张掖七彩丹霞,为何引来频繁知名导演张艺谋关注?
  65. 无袖装怎样穿才能显瘦,牢记这三点,时尚感满满
  66. 为什么说李国庆早该离开当当
  67. Matlab基础:图像类型的转换
  68. 今起新加坡乌节路将对违规吸烟者进行书面警告,和五千元的罚款!
  69. uni-app引入阿里iconfont
  70. 16年,斥资4800万美元,打捞300多年、装满40吨财宝的帆船!
  71. 痛失爱子的四大明星:他孩子六岁就不幸离开,他一生接连两次丧子
  72. 索尼停产PS Vita
  73. 双机身!中国最大无人机解决关键性技术,或将装备部队
  74. 再有钱能咋地?看看吧
  75. 每次两条大驱同时下水,老牌船厂宣告强势回归!
  76. 柬埔寨炒房的“冰与火”
  77. Spring Boot 之 Profile 使用
  78. 现实版火星救援,埃隆.马斯克雄心壮志,准备“征战”火星!
  79. 买车不买白色?交警教你一句买车“顺口溜” 照着买不会吃亏
  80. 飞机和火箭发动机的地面测试台
  81. JAVA编码 —— 字符串关键字内容替换
  82. 低调AI大牛颜水成,挥别360,加盟依图
  83. 中国恒大:3-5年成为世界规模最大的新能源汽车集团
  84. “父母在,人生尚有来处”,下半句更经典,请珍惜父母的疼爱
  85. 十一大要点一网打尽:一文看懂六小时巴菲特股东大会
  86. 三分之一国土是森林,德国简直是天然氧吧
  87. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点
  88. 同样是2连冠+2连FMVP的科比和詹姆斯!他受到的更多是质疑声
  89. 同级价格不能再低 Jeep指南者为何“可望不可得”?
  90. 贸易战升级,美国高等教育何去何从?
  91. 国产奔驰与进口的有什么不同?修车师傅:3年后你就能看出来
  92. 短线投机必杀技——涨停技术全集(珍藏版)
  93. 这些飞行汽车项目即将成为现实
  94. 我因是 “扶弟狂魔”惨被抛弃
  95. 21家主要银行已全部支持云闪付APP借记卡余额查询
  96. 千古一帝:秦始皇
  97. 宝宝黄疸不退怎么办?新生儿黄疸超实用攻略
  98. 时隔5年后,河北“小官巨腐”代表马超群案将于27日开庭
  99. 做一个优秀的男/女朋友的攻略:养只猫吧
  100. 德国采埃孚航空技术公司展示航空电气化技术和产品

  1. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点(1713)
  2. Python开发:部分第三方库无法在线安装解决方法(1519)
  3. Matlab 2019a 安装包下载以及安装和激活(1421)
  4. React 与 React-Native 使用同一个 meteor 后台(1340)
  5. Delphi 开发微信公众平台 (二) 用户管理(1292)
  6. C#读取excel文件提示未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序(1146)
  7. [深度应用]·实战掌握Dlib人脸识别开发教程(1113)
  8. 币安称 4000 万美元比特币被盗(1059)
  9. 《跃迁-成为高手的技术》之联机学习(1052)
  10. 独家 | 寒武纪二代芯片发布在即,提前解密如何挑战英伟达!(984)
  11. 使用 C 语言实现一个 HTTP GET 连接(971)
  12. WebGL three.js学习笔记 纹理贴图模拟太阳系运转(965)
  13. 【译】.NET Core 是 .NET 的未来(863)
  14. Sublime Text3 最新版3207 安装及破解(804)
  15. 科学家在太平洋水域发现奇特的“砷呼吸”微生物(762)
  16. 小米有品员工签军令状,自动放弃年终奖!(740)
  17. 微软宣布 .NET 5 计划,支持跨平台、移动开发(740)
  18. 【预警通告】Weblogic反序列化远程代码执行漏洞(737)
  19. layui的table参数条件缓存问题(728)
  20. 75条笑死人的知乎神回复,用60行代码就爬完了(721)
  21. Linux学习(三):XShell连接虚拟机+开通22端口(713)
  22. Visual Studio 2019 正式发布,重磅更新,支持live share(692)
  23. 【预警通告】Apache Tomcat远程代码执行漏洞CVE-2019-0232(674)
  24. SQL简介及MySQL的安装目录详解(649)
  25. 10亿元巨贪山西吕梁原副市长张中生二审维持死刑判决(638)
  26. 5月13日公告精读丨一字跌停后,这只300亿市值的白马股出来澄清了(617)
  27. Vue之路由(603)
  28. css-博客样式初体验(562)
  29. 如果想转行学习WEB前端,这样学也许更加利于找工作(557)
  30. 2019年程序员最值得学习的思维利器——任务分解(556)
  31. 彭博社:苹果A13芯片即将产量 新iPhone"浴霸"无疑(539)
  32. 声明与定义的区别(521)
  33. MongoDB创建数据库和删除数据库05-14学习笔记(493)
  34. PJzhang:Lucifer1993的struts-scan漏洞全量检测工具(492)
  35. 吴奇隆当爹!前妻马雅舒开心复出拍戏,颜值吸睛气质超赞(490)
  36. K8s集群安装--最新版 Kubernetes 1.14.1(490)
  37. 【威胁通告】Oracle全系产品2019年4月关键补丁更新(483)
  38. 英媒:阿里将允许外国零售商在阿里平台上销售商品(475)
  39. Confluence SSRF及远程代码执行漏洞处置手册(470)
  40. 舍命生子产妇吴梦丈夫怒斥:没抢肺源不是精神分裂,网友断章取义(469)
  41. Visual Studio 2019 正式发布(460)
  42. 短视频内容重复,如何伪原创处理(456)
  43. [翻译] Visual Studio 2019: 极速编码. 智能工作. 创造未来.(438)
  44. 美方拟升级关税措施?中方:反制!(435)
  45. 机器学习 ML.NET 发布 1.0 RC(435)
  46. 香饽饽!米兰双雄均有意荷兰小将贝尔赫韦因(431)
  47. 刘强东身边的CXO还有谁“幸存”(430)
  48. 阿里巴巴2018年纳税516亿元 同比增40%(427)
  49. 绿盟科技互联网安全威胁周报NSFOCUS-19-13(409)
  50. 告诉你去越南芽庄必带回的好东西(406)
  51. 宝宝多大可以自己吃饭?错过孩子独立吃饭黄金期,等着后悔吧(404)
  52. 娶不起老婆就来这6个国家,菲律宾的女孩是首选,一定别娶韩国女(398)
  53. 小米手机卖不动了?(387)
  54. 针对django2.2报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: ill....(386)
  55. 太奇葩!买100元债只给1.63元购物券和1.11元现金?网友炸锅:得买多少债券才能换一双鞋(385)
  56. 马光远:全球货币政策进入摇摆期,包括房价的资产价格何去何从(384)
  57. 我司使用了六年的分布式锁(382)
  58. 雷军清华演讲实录:小米9年的创新、变革与未来(379)
  59. 积分一样却选手下败将出战国际赛,《最强大脑》云队选手被坑了?(374)
  60. F#周报2019年第14期(371)
  61. Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!(368)
  62. Webpack 4教程 - 第八部分 使用prefetch和preload进行动态加载(368)
  63. 报告显示:一季度中国家庭总资产缩水而消费支出增加(341)
  64. 《最强大脑》要垮?桑洁魏坤琳出轨细节被扒,戚薇才是神助攻(337)
  65. 直认与老公感情淡了!27岁TVB上位女星:我们不是好熟(336)
  66. 他联系叙恐怖分子“卖军火”,称能搞到2000枚导弹,关键时刻中国警察出手(335)
  67. 谁是苏小明饭局爆粗偷拍者?知情人称另有其人(325)
  68. 苹果应用商店被判垄断?然而并没有(324)
  69. Oracle甲骨文大规模裁员,你背离时代就会被淘汰(324)
  70. 日本明仁天皇退位,日本“平成”年代结束(316)
  71. 华电教授孙玉兵被指与昔日同学共同学术造假,多所高校调查(309)
  72. 迪玛希好惨!昨晚《歌手》为声入人心男团帮帮唱,却再被指控侵权(307)
  73. linux系统安装cdcfordb2udb(306)
  74. 女友被曝插足许志安郑秀文婚姻 知情人透露马国明已下定决心分手(306)
  75. 智慧停车场系统开发建设解决方案(302)
  76. F#周报2019年第15期(298)
  77. shopify网站转化率优化之结账页checkout优化(288)
  78. 杜敬谦死因疑曝光!或因他这一特殊的训练方式,泳迷高呼孙杨退役(286)
  79. 真实!这部8.5分的缉毒剧,毒贩公然贿赂警察:80万,把我放出去(283)
  80. 威廉王子出轨凯特王妃闺蜜? 外媒称婚外情致兄弟反目(283)
  81. spring-cloud-sleuth+zipkin源码探究(280)
  82. 深度学习python的配置(Windows)(279)
  83. 许志安出轨视频系蓄谋偷拍?司机被曝收40万装红外摄像头(278)
  84. 赌命生子九个月后,吴梦离世:前半辈子任性了,我用生命买单(278)
  85. NodeJs之邮件(email)发送(277)
  86. 视觉中国深夜道歉:全面配合监管部门彻底积极整改(276)
  87. 新更新kb4493472导致无法正常开机(264)
  88. 她做个半永久眉毛就被说整容了?(262)
  89. 韦杰落网,金诚集团终局(262)
  90. 美国各州18年人均GDP排名(附中国各省市区人均GDP排名)(261)
  91. Google AI 系统 DeepMind 高中数学考试不及格(257)
  92. 阿里 EasyExcel 使用及避坑(257)
  93. 机器学习基石笔记:01 The Learning Problem(256)
  94. 华为推出方舟编译器 称可提升安卓系统效率(253)
  95. 张丹峰出轨最新锤来了!毕滢的朋友圈简直刷新下限啊!(252)
  96. 山东庆云民企3000亩土地被贱卖 国企接盘拟转性(251)
  97. 【硬盘版】下载利器IDM+优特(uTorrent)BT下载器类(250)
  98. 如何设置使chrome新标签页中打开链接自动跳转到新标签页?(248)
  99. 不要996!程序员创建955.WLB不加班公司名单,GitHub周榜第二(246)
  100. 河南汝州农商行“百万丢款案”调查,两级法院现“判决书打架”(242)

  1. 女子替父筹款后被指炫富 平台:善款将原路退还给捐款人
  2. 如何制作出像钻石般纯净的冰块?
  3. [P4240] 毒瘤之神的考验
  4. 从壹开始[做贡献]之二 || 推荐VSCode多语言开发,支持一键JAVA
  5. (数据科学学习手札61)xpath进阶用法
  6. ER模型设计工具:设计ER模型及MySQL DDL文件导入及生成
  7. IT兄弟连 Java语法教程 Java语言的跨平台特性
  8. 当MySQL数据库遇到Syn Flooding
  9. GQ报道 | ofo的终场战事
  10. Pycharm 新建模板默认添加编码格式-作者-时间等信息
  11. ES6中常用的小技巧,用了事半功倍哦
  12. Python 从入门到进阶之路(六)
  13. Java中的反射机制和动态代理
  14. 英特尔推创业扶持计划:“攫取”以色列AI和自动驾驶人才
  15. 支付类系统数据处理和数据中台的数据处理方式有什么不同?
  16. 机器视觉中的光源
  17. 想让自己的项目6666,可是 Chrome 不答应!
  18. 未来简史:从智人到神人
  19. AMD、Intel注意了 俄罗斯国产处理器能跑X86游戏了
  20. selenium2library关键字
  21. 《Graph Attention Network》阅读笔记
  22. 面试总结 - 大三第 16 周总结
  23. Intel、高通等在美游说以期不断供
  24. 小白到大神,你需要了解的 sqlite 最佳实践
  25. 5种处理Vue异常的方法
  26. 浅谈 Attention 机制的理解
  27. 看完此文,妈妈还会担心你docker入不了门?
  28. 北电90级:最勤奋的黄磊和最懒的姜武居然在同一个班
  29. Java 8 Collectors to Map
  30. Spring AOP中@Aspect 面向切面注解使用详解
  31. 文件操作的相关
  32. 我科学家首次提出新型远程量子密钥分发协议
  33. 精读《Optional chaining》
  34. CentsOS原生RabbitMQ安装过程
  35. 大数据技术之_31_Java 面试题_01_JavaSE 面试题 + SSM 面试题 + Java 高级面试题 + Java 项目面试题
  36. 零基础如何学习好python爬虫?分哪几个阶段?
  37. 可见光驱动生物质可制备氢气和原柴油
  38. Redis删除特定前缀key的优雅实现
  39. AWS云创建EC2与使用注意事项-踩坑记录
  40. 新行星“猎手”瞄准半人马座阿尔法星
  41. 传杨天真和张艺兴闹掰,杨天真发两人跳舞视频辟谣
  42. 万亿数据下Hadoop的核心竞争力
  43. AI也“偏见”!或应鼓励女性参与AI研发
  44. [Vue 牛刀小试]:第十三章 - Vue Router 基础使用再探(命名路由、命名视图、路由传参)
  45. 上周热点回顾(6.10-6.16)
  46. 屠呦呦团队放“大招”:“青蒿素抗药性”等研究获新突破
  47. Spring拓展接口之BeanPostProcessor,我们来看看它的底层实现
  48. 高通骁龙865曝光:支持LPDDR5X和UFS 3.0 有两个版本
  49. 一线|前百度副总裁顾国栋加入蛋壳公寓任COO 负责线下团队
  50. 周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8
  51. LeetCode.927-独特邮箱地址(Unique Email Addresses)
  52. Anaconda 恢复清华大学开源软件镜像,近期服务上线
  53. Consul初探-服务注册和发现
  54. 企业讨债9年打赢官司也没用:法院领导是对方亲兄弟
  55. 台积电或在明年一季度开始为苹果生产5纳米芯片
  56. 日本JDI纾困案生变:夏普表示愿伸援
  57. 曹大谈内存重排
  58. 滴滴接入第三方出行服务商,试水聚合平台
  59. 中国AI芯“觉醒”的五年
  60. 统计学习方法20190616学习第一章第1,2节统计学习
  61. 命令行高效操作Git,看这篇就够了
  62. 曾猛删合照,父亲节晒与张丹峰合影!这对父子也走出毕滢风波了?
  63. 唐嫣走路一半遭鸟屎砸中 超近画面笑翻网友
  64. kubernetes调度之pod优先级和资源抢占
  65. .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
  66. 库克斯坦福演讲:科技公司应为"做坏事"担责任
  67. 一周全球公司十大要闻:波音连续第二个月没收到商业飞机订单
  68. 特斯拉上海厂:建筑基本完工 开始安装生产线
  69. 存储卡革命启动!microSD已然媲美SSD
  70. 警告!2020年2月1月起:不支持TCP和UDP协议的DNS服务器将被关停
  71. 近百起涉民营医院骗保案:伪造病历、虚假住院,有的涉案千万
  72. 企业存储快速增长势头到头了:2019 年 Q1 下降 0.6%
  73. 天文学家探测到银河系与另一个星系相撞的信号
  74. 升维打击,设计之道
  75. 北电1990级:除了黄磊和姜武,他们也是你眼熟的演员
  76. 四象限分析法分析你是否适合做管理
  77. 韩国瑜22日台中造势 国民党市议员全力相挺
  78. 苏贞昌笑高雄“20例”登革热 游淑慧:看看“万例”前朝
  79. 退休女环保局长涉黑落马,该区一周“打伞”11人
  80. 杨幂雪莉冷白皮之战,杨洋尼坤合照,网友心痛神颜不再
  81. 微服务架构:自动扩展简介
  82. 浏览器缓存
  83. 深入理解Java虚拟机(自动内存管理机制)
  84. Jenkins自动化部署入门(一)
  85. jvm(2)---类加载机制
  86. Java8的Stream API使用
  87. Spring的web.xml文件配置
  88. vscode源码分析【二】程序的启动逻辑
  89. kubernetes ingress(一) 简介
  90. 寻觅Azure上的Athena和BigQuery(一):落寞的ADLA
  91. 实验十二:SWING界面设计
  92. 死磕 java同步系列之CountDownLatch源码解析
  93. 容器中Java 程序OOMKilled原因浅析
  94. 舍友聚会
  95. 串口通信
  96. 数据结构与算法---排序算法(Sort Algorithm)
  97. 笔记-JavaWeb学习之旅17
  98. 物理隔离下的数据交换平台难点解析与实践(一)
  99. jvm(1)---java内存模型
  100. F#周报2019年第24期