这篇文章给大家分享的是有关如何使用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;
/**
* @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();
}
}
}
}
}
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中含有关键字申请时间
,修改前后文件内容如下:
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”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。