javaitextPDF替换文本

更新时间:2023-06-08 23:31:24 阅读: 评论:0

javaitextPDF替换⽂本
最近接到⼀个新的项⽬需求,客户需要在PDF上盖章,盖完章后要把做标记盖章的关键字给移除或隐藏,在⽹上找了很久很多都是改背景⾊或者覆盖⽂字的,但是效果不⼤好,主要是找关键字那块都只是定位到第⼀个字符的位置,也就只能修改第⼀个字符,不能对整个关键字替换,后⾯经过⼀番调整终于实现对整个关键字的替换,但是替换也只是修改其背景⾊或者置为空,但是该⽅法有个弊端就是如果去复制的话其实还是底层的⽂字;
冰箱有异味怎么办好了话不多少直接贴上关键代码:
/**
* 获取关键字定位的⼯具类
* 其它的⽅法不⽤关⼼,我暂时都看不懂
* 你调⽤findKeywordPostions⽅法就可以了,参照main⽅法⽰例
*/
public class GetKeyWordPosition {
带镣行
public static final float defaultHeight = 16;部分的英文
public static final float fixHeight = 10;
public static void main(String[] args) {
//1.给定⽂件
File pdfFile = new File("D:/1.pdf");
String out = "d:/3.pdf";
//2.定义⼀个byte数组,长度为⽂件的长度
byte[] pdfData = new byte[(int) pdfFile.length()];
//3.IO流读取⽂件内容到byte数组
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(pdfFile);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.clo();
} catch (IOException e) {
}
}
}
//4.指定关键字
String keyword = "签名/盖章(红印)";
String replace = "";
//5.调⽤⽅法,给定关键字和⽂件
List<float[]> positions = null;
try {
positions = findKeywordPostions(pdfData, keyword);
} catch (IOException e) {
e.printStackTrace();
}
PdfReader pdfReader = null;
PdfStamper stamper = null;
try {
stamper = new PdfStamper(pdfReader, new FileOutputStream(out));
if (positions != null) {
for (int i = 0; i < positions.size(); i++) {
float[] position = (i);
PdfContentByte canvas = OverContent((int) position[0]);
//修改背景⾊
canvas.saveState();
canvas.tColorFill(BaColor.WHITE);
/
/ canvas.tColorFill(BaColor.BLUE);
// 以左下点为原点,x轴的值,y轴的值,总宽度,总⾼度:
// X() - 1, Y(),
// Width() + 2, Height());
canvas.fill();
//替换关键字
/*                    canvas.beginText();
BaFont bf = ateFont("STSong-Light", "UniGB-UCS2-H", BaFont.EMBEDDED);
canvas.tFontAndSize(bf, 10F);
canvas.tTextMatrix(position[1], position[2] + 2*//*修正背景与⽂本的相对位置*//*);
canvas.showText(replace);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} finally {
if (stamper != null)
try {
stamper.clo();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (pdfReader != null) {
pdfReader.clo();
}
}
/
/6.返回值类型是  List<float[]> 每个list元素代表⼀个匹配的位置,分别为 float[0]所在页码  float[1]所在x轴 float[2]所在y轴 float[3]关键字宽度 floatt[4]关键字⾼度        System.out.println("total:" + positions.size());
if (positions != null && positions.size() > 0)
{
for (float[] position : positions) {
System.out.print("pageNum: " + (int) position[0]);
System.out.print("\tx: " + position[1]);
System.out.println("\ty: " + position[2]);
System.out.println("\tw: " + position[3]);
System.out.println("\th: " + position[4]);
}
}
}
/**
* findKeywordPostions
* @param pdfData 通过IO流 PDF⽂件转化的byte数组
* @param keyword 关键字
* @return List<float [ ]> : float[0]:pageNum float[1]:x float[2]:y
* @throws IOException
*/
public static List<float[]> findKeywordPostions(byte[] pdfData, String keyword) throws IOException {
师恩难忘的作文
List<float[]> result = new ArrayList<float[]>();
List<PdfPageContentPositions> pdfPageContentPositions = getPdfContentPostionsList(pdfData);
for (PdfPageContentPositions pdfPageContentPosition : pdfPageContentPositions) {
List<float[]> charPositions = findPositions(keyword, pdfPageContentPosition);
if (charPositions == null || charPositions.size() < 1) {
continue;
}
result.addAll(charPositions);
}
return result;
}
千张结烧肉
private static List<PdfPageContentPositions> getPdfContentPostionsList(byte[] pdfData) throws IOException {
PdfReader reader = new PdfReader(pdfData);
List<PdfPageContentPositions> result = new ArrayList<PdfPageContentPositions>();
最是难忘那表情int pages = NumberOfPages();
for (int pageNum = 1; pageNum <= pages; pageNum++) {
float width = PageSize(pageNum).getWidth();
float height = PageSize(pageNum).getHeight();
PdfRenderListener pdfRenderListener = new PdfRenderListener(pageNum, width, height);
//解析pdf,定位位置
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(pdfRenderListener);
PdfDictionary pageDic = PageN(pageNum);
PdfDictionary resourcesDic = AsDict(PdfName.RESOURCES);
try {
processor.ContentBytesForPage(reader, pageNum), resourcesDic);
} catch (IOException e) {
reader.clo();
throw e;
}
String content = Content();
List<CharPosition> charPositions = harPositions();
List<float[]> positionsList = new ArrayList<float[]>();
for (CharPosition charPosition : charPositions) {
float[] positions = new float[]{PageNum(), X(), Y(), Width(), Height()};                positionsList.add(positions);
}
PdfPageContentPositions pdfPageContentPositions = new PdfPageContentPositions();
pdfPageContentPositions.tContent(content);
pdfPageContentPositions.tPostions(positionsList);
result.add(pdfPageContentPositions);
reader.clo();
return result;
}
private static List<float[]> findPositions(String keyword, PdfPageContentPositions pdfPageContentPositions) {        List<float[]> result = new ArrayList<float[]>();
String content = Content();一枚硬币
List<float[]> charPositions = Positions();
for (int pos = 0; pos < content.length(); ) {
int positionIndex = content.indexOf(keyword, pos);
if (positionIndex == -1) {
break;
}
float[] postions = (positionIndex);
//此处较为关键通过第⼀个关键字计算出整个关键字的宽度
for (int i = 1; i < keyword.length(); i++) {
float[] postionsNew = (positionIndex + i);
postions[3] = postions[3] + postionsNew[3];
}
result.add(postions);
pos = positionIndex + 1;
}
return result;
}
private static class PdfPageContentPositions {
private String content;
private List<float[]> positions;
public String getContent() {
return content;
}
public void tContent(String content) {
}
public List<float[]> getPositions() {
return positions;
}
public void tPostions(List<float[]> positions) {
this.positions = positions;
}
}
private static class PdfRenderListener implements RenderListener {
private int pageNum;
private float pageWidth;
private float pageHeight;
private StringBuilder contentBuilder = new StringBuilder();
public PdfRenderListener(int pageNum, float pageWidth, float pageHeight) {
this.pageNum = pageNum;徐才厚级别
this.pageWidth = pageWidth;
this.pageHeight = pageHeight;
}
public void beginTextBlock() {
}
public void renderText(TextRenderInfo renderInfo) {
List<TextRenderInfo> characterRenderInfos = CharacterRenderInfos();
for (TextRenderInfo textRenderInfo : characterRenderInfos) {
String word = Text();
if (word.length() > 1) {
word = word.substring(word.length() - 1, word.length());
}
Rectangle2D.Float rectangle = AscentLine().getBoundingRectange();
float x = (float) X();
float y = (float) Y();
//                float x = (CenterX();
//                float y = (CenterY();
//                double x = MinX();
//                double y = MaxY();
//这两个是关键字在所在页⾯的XY轴的百分⽐
float xPercent = und(x / pageWidth * 10000) / 10000f;
float yPercent = und((1 - y / pageHeight) * 10000) / 10000f;
//                CharPosition charPosition = new CharPosition(pageNum, xPercent, yPercent);
CharPosition charPosition = new CharPosition(pageNum, x, y - fixHeight, (float) Width(), (float) (Height() == 0 ? defaultHeight                charPositions.add(charPosition);
contentBuilder.append(word);
}
}
public void endTextBlock() {
}
public void renderImage(ImageRenderInfo renderInfo) {
}
public String getContent() {
String();
}
public List<CharPosition> getcharPositions() {
return charPositions;
}
}
private static class CharPosition {
private int pageNum = 0;

本文发布于:2023-06-08 23:31:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/906479.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:关键字   数组   替换   定位   难忘
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图