这篇文章给大家分享的是有关如何使用Java通过关键字修改pdf的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、前言
在main方法中测试该方法,还需要引用的jar包有itextpdf-5.5.10.jar、itext-asian-5.2.0.jar
注意:两jar包之间有版本对应,否则会出现报错,该报错主要针对设置中文字体的方法java itext 报错 com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H'
import com.itextpdf.text.Chunk;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Font;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.ColumnText;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.UUID;public class UpdatePdf { public static void main(String[] args) { File file = new File("G://files//cs//111.pdf");//模拟文件位置 if(file!=null && file.exists()){ FileInputStream is = null; try { //本地根据文件路径获取文件流 is = new FileInputStream(file); long length = file.length(); byte[] fileBytes = new byte[(int)length]; is.read(fileBytes); //进行pdf文件修改 File file1 = pdfFzSqsj(fileBytes); if(file1!=null && file1.exists()){ System.out.println("修改pdf完成!"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if(is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } } private static File pdfFzSqsj(byte[] tpeHtcxyw) { PdfStamper stamper = null; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); //获取要写入的申请时间 String sj =sdf.format(new Date()); PdfReader reader = new PdfReader(tpeHtcxyw); //创建文件路径String filePath = "G://files/cs/"; System.out.println("filePath="+filePath); File directory = new File(filePath); //如果pdf保存路径不存在,则创建路径 if (!directory.exists()) { directory.mkdirs(); } String filename = UUID.randomUUID()+"_after.pdf";//修改后文件String filename1 = UUID.randomUUID()+"_before.pdf";//修改前文件 再输出一遍,校验自己在修改之前拿到正确的文件流 System.out.println("file:"+filePath+filename); File file = new File(filePath+filename);File file1 = new File(filePath+filename1); //将写入临时文件FileOutputStream foss = new FileOutputStream (file1);foss.write(tpeHtcxyw);foss.close(); //设置字体 BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false); Font font = new Font(baseFont); stamper = new PdfStamper(reader, new FileOutputStream(file)); //对于已经固话的pdf回填申请时间 for (int i = 1; i <= reader.getNumberOfPages(); i++) { PdfContentByte over = stamper.getOverContent(i); ColumnText columnText = new ColumnText(over); if(i==1){ String str = "申请日期:"; //根据关键字获取关键字位置 float[] po = Html2Pdf.getGzzzb(str,tpeHtcxyw); if(po[0]==1.00f){ // 方法setSimpleColumn(float llx, float lly, float urx, float ury) // llx 和 urx 最小的值决定离左边的距离. lly 和 ury 最大的值决定离下边的距离 columnText.setSimpleColumn( po[1]+46f, po[2]-9f, 500, 0); //将时间文本创建成对象 Paragraph elements = new Paragraph(0, new Chunk(new Chunk(sj))); // 设置字体,如果不设置添加的中文将无法显示 elements.setFont(font); columnText.addElement(elements); columnText.go(); } } } return file; } catch (Exception e) { e.printStackTrace(); return null; } finally { if(stamper!=null){ try { stamper.close(); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }}
二、Html2Pdf
import com.itextpdf.awt.geom.Rectangle2D;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.parser.ImageRenderInfo;import com.itextpdf.text.pdf.parser.PdfReaderContentParser;import com.itextpdf.text.pdf.parser.RenderListener;import com.itextpdf.text.pdf.parser.TextRenderInfo;public class Html2Pdf { public static float[] getGzzzb(String signKey, byte[] pdf){ PdfReader reader=null; final float[] po = new float[3]; try{ reader = new PdfReader(pdf); int pageNum = reader.getNumberOfPages(); final String signKeyWord = signKey; for(int page=1; page <= pageNum; page++){ PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(reader); pdfReaderContentParser.processContent(page, new RenderListener() { StringBuilder sb = new StringBuilder(""); int maxLength = signKeyWord.length(); @Override public void renderText(TextRenderInfo textRenderInfo) { // 只适用 单字块文档 以及 关键字整个为一个块的情况 // 设置 关键字文本为单独的块,不然会错位 boolean isKeywordChunk = textRenderInfo.getText().length() == maxLength; if (isKeywordChunk) { // 文档按照 块 读取 sb.delete(0, sb.length()); sb.append(textRenderInfo.getText()); } else { // 有些文档 单字一个块的情况 // 拼接字符串 sb.append(textRenderInfo.getText()); // 去除首部字符串,使长度等于关键字长度 if (sb.length() > maxLength) { sb.delete(0, sb.length() - maxLength); } } // 判断是否匹配上 if (signKeyWord.equals(sb.toString())) { // 计算中心点坐标 Rectangle2D.Float baseFloat = textRenderInfo.getBaseline() .getBoundingRectange(); Rectangle2D.Float ascentFloat = textRenderInfo.getAscentLine() .getBoundingRectange(); float centreX; float centreY; if (isKeywordChunk) { centreX = baseFloat.x + 5*ascentFloat.width / 6; centreY = baseFloat.y + (5*(ascentFloat.y - baseFloat.y) / 6); } else { centreX = baseFloat.x + ascentFloat.width - (5*maxLength * ascentFloat.width / 6); centreY = baseFloat.y + (5*(ascentFloat.y - baseFloat.y) / 6); } po[0]=1.00f; po[1]=centreX+3; po[2]=centreY; // 匹配完后 清除 sb.delete(0, sb.length()); } } @Override public void renderImage(ImageRenderInfo arg0) {} @Override public void endTextBlock() {} @Override public void beginTextBlock() {} }); } if(po[0]==1.00f){ return po; } }catch(Exception e){ e.printStackTrace(); }finally { if(reader!=null){ reader.close(); } } return null; }
三、结果图
111.pdf是原始文件,其余两文件在方法执行后生成,before文件内容与111.pdf一致
我的原始pdf中含有关键字申请时间
,修改前后文件内容如下:
常用的java框架有哪些
1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。
感谢各位的阅读!关于“如何使用Java通过关键字修改pdf”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!