IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java PDFBOX(2.0.25) 修改文本内容 -> 正文阅读

[Java知识库]java PDFBOX(2.0.25) 修改文本内容

@[TOC](PDFBOX(2.0.25) 修改文本内容)

pdfbox文本内容修在网上找不到新版本的,老版本的还不兼容(无效)。经过几周的寻找终于找到了个能用的
PDFBOX替换文本(pdfbox版本2.0.24,虽然我自己也发现这个字符编码的没弄成,参考这个后终于搞好了😊太不容易了。
记录下 方便以后使用

@Test
	public void pdf() throws Exception {
		File file = ResourceUtils.getFile("classpath:5.pdf");
		PDDocument pd = PDDocument.load(file);
		// 需要的字体文件
		Map<COSName, PDFont> oldfont = new HashMap<COSName, PDFont>();
		COSName fontName = null;
		PDType0Font targetfont= PDType0Font.load(pd, new File("C:\\Windows\\Fonts\\simfang.ttf"));
		for (PDPage page : pd.getPages()) {
			PDFStreamParser pdfsp = new PDFStreamParser(page);
			pdfsp.parse();
			List<Object> tokens = pdfsp.getTokens();
            for (int j = 0; j < tokens.size(); j++) {
                //创建一个object对象去接收标记
                Object next = tokens.get( j );
                //instanceof判断其左边对象是否为其右边类的实例
                if(next  instanceof COSName) {
                	fontName= (COSName)next;
                	if(!oldfont.containsKey(fontName)) {
                		oldfont.put(fontName, page.getResources().getFont(fontName));
                	}
                }else 
                if(next  instanceof COSString) {
                    COSString previous = (COSString)next;
                    try(InputStream in = new ByteArrayInputStream(previous.getBytes())){
                    	StringBuffer sb = new StringBuffer();
                    	while (in.available()>0) {
                    		int rc = oldfont.get(fontName).readCode(in);
                    		sb.append(oldfont.get(fontName).toUnicode(rc));
                    	}
                    	//重置COSString对象
                    	sb.append("例");
                    	System.out.println("--Tj----"+sb.toString());
                    	previous.setValue(targetfont.encode(sb.toString()));
                    }
                }else if(next  instanceof COSArray) {
                    //PDF中的字符串 
                	byte[] pstring = {};
                    int prej = 0;
                    COSArray previous  =(COSArray)next;
                    //循环previous
                    for (int k = 0; k < previous.size(); k++) {
                        Object arrElement = previous.getObject( k );
                        if( arrElement instanceof COSString ){
                            //COSString对象>>创建java字符串的一个新的文本字符串。
                            COSString cosString =(COSString)arrElement;
                            //将此字符串的内容作为PDF文本字符串返回。 
                            if (j == prej) {
                            	byte[] thisbyte = cosString.getBytes();
                                byte[] temp = new byte[pstring.length+thisbyte.length];  
                                System.arraycopy(pstring, 0, temp, 0, pstring.length);
                                System.arraycopy(thisbyte, 0, temp, pstring.length, thisbyte.length);
                                pstring=temp;
                            } else {
                                prej = j;
                                pstring = cosString.getBytes();
                            }                       
                        }
                    }
                    try(InputStream in = new ByteArrayInputStream(pstring)){
                    	StringBuffer sb = new StringBuffer();
                    	while (in.available()>0) {
                    		int rc = oldfont.get(fontName).readCode(in);
                    		sb.append(oldfont.get(fontName).toUnicode(rc));
                    	}
                    	sb.append("例");
                    	System.out.println("TJ----"+sb.toString());
                    	COSString cosString2 = (COSString) previous.getObject(0);
                    	cosString2.setValue(targetfont.encode(sb.toString()));
                    }
                    int total = previous.size()-1;    
                    for (int k = total; k > 0; k--) {
                        previous.remove(k);
                    }
                }
            }
            PDStream updatedStream = new PDStream(pd);
            OutputStream out = updatedStream.createOutputStream();
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
            tokenWriter.writeTokens(tokens);
            out.close();
            oldfont.forEach((k,v)->{
            	page.getResources().put(k, targetfont);
            });
            page.setContents(updatedStream);
		}
		pd.save("d:/1.pdf");
		pd.close();
	}
	

昨天的代码有问题,修改后
修改前
在这里插入图片描述
修改后
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:22:35  更:2022-04-22 18:27:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:50:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码