教你怎么用Java通过关键字修改pdf
更新时间:2021年5月15日 00:01 点击:1461
一、前言
在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; /** * @Desc * @Author madengling * @Time 2021/5/11 15:18 */ 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(); } } } } } /** * 根据pdf的固定关键字,查找进行pdf相关位置增加文字 * @param tpeHtcxyw 文件流 * @return 修改后的文件 */ 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 { /** * 定位pdf文件中关键字坐标 * @param signKey 关键字 * @param pdf 文件流 * @return 坐标位置 */ 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通过关键字修改pdf的文章就介绍到这了,更多相关关键字修改pdf内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了C# 中的var关键字详细介绍的相关资料,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
- yield这个关键字是和迭代器挂钩的,而且是与return一起以yield return的形式合用的,用来返回迭代器中的条目。...2020-06-25
- 这篇文章主要介绍了c# 如何对CSV文件操作,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下...2020-11-03
Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28