教你怎么用Java通过关键字修改pdf

网友投稿 356 2022-10-24


教你怎么用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.Filhttp://eOutputStream;

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()){

Systehttp://m.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);

iEgfjQhEuv}

}

// 判断是否匹配上

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() {}

iEgfjQhEuv });

}

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中含有关键字申请时间,修改前后文件内容如下:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:分层模型介绍
下一篇:数据通信模式
相关文章

 发表评论

评论列表