热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java实现pdf定位签章

很多时候,在项目中需要打单子,生成pdf格式,还需要盖章。这个时候,就需要对pdf文件进行再次处理。处理的方式就是:1、获取要处理的位置2、将要盖章的图片添加上去代码如下:publ


很多时候,在项目中需要打单子,生成pdf格式,还需要盖章。

这个时候,就需要对pdf文件进行再次处理。

处理的方式就是:

1、获取要处理的位置

2、将要盖章的图片添加上去

代码如下:

public void printSign(OutputStream outputStream){
List keyWords = new ArrayList();
keyWords.add("打印人,打印机构");//支持多关键字,默认选择第一个找到的关键字
PdfReader pdfReader;
PdfStamper pdfStamper;
try {
pdfReader = new PdfReader(((ByteArrayOutputStream)outputStream).toByteArray());
pdfStamper = new PdfStamper(pdfReader, outputStream);
List> arrayLists = findKeywords(keyWords, pdfReader);//查找关键字所在坐标
//一个坐标也没找到,就返回
if (ObjectUtil.isEmpty(arrayLists)) {
return;
}
if (!ObjectUtil.isEmpty(arrayLists.get(0))) {
for (int i=0; i> findKeywords(final List keyWords, PdfReader pdfReader) {
if (keyWords == null || keyWords.size() == 0) {
return null;
}
int pageNum = pdfReader.getNumberOfPages();
final List> arrayLists = new ArrayList>(keyWords.size());
for (int k=0; k List positiOns= new ArrayList();
arrayLists.add(positions);
}
PdfReaderContentParser pdfReaderCOntentParser= new PdfReaderContentParser(pdfReader);
try {
for (int i = 1; i <= pageNum; i++) {
final int finalI = i;
pdfReaderContentParser.processContent(i, new RenderListener() {
private StringBuilder pdfsb = new StringBuilder();
private float yy = -1f;
@Override
public void renderText(TextRenderInfo textRenderInfo) {
String text = textRenderInfo.getText();
com.itextpdf.awt.geom.Rectangle2D.Float boundingRectange =
textRenderInfo.getBaseline().getBoundingRectange();
if(yy == -1f) {
yy = boundingRectange.y;
}
if(yy != boundingRectange.y) {
yy = boundingRectange.y;
pdfsb.setLength(0);
}
pdfsb.append(text);
if (pdfsb.length()>0) {
for (int j=0; j List key_words = ListUtil.parseList
(keyWords.get(j), ",");
//假如配置了多个关键字,找到一个就跑
for (final String key_word : key_words) {
if (arrayLists.get(j) != null)
{
break;
}
if (pdfsb.length()>0 && pdfsb.toString
().contains(key_word)) {
float[] resu = new float[3];
resu[0] = boundingRectange.x +
boundingRectange.width * (key_word.length()-1);
resu[1] = boundingRectange.y;
resu[2] = finalI;
arrayLists.get(j).add(resu);
pdfsb.setLength(0);
break;
}
}
}
}
}
@Override
public void renderImage(ImageRenderInfo arg0) {
//renderImage
}
@Override
public void endTextBlock() {
//endTextBlock
}
@Override
public void beginTextBlock() {
//beginTextBlock
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayLists;
}
public static List parseList(String source, String regex) {
if (source == null || "".equals(source)) {
return null;
}
List strList = new ArrayList();
if (regex== null || "".equals(regex)) {
strList.add(source);
} else {
String[] strArr = source.split(regex);
for (String str : strArr) {
if (str!= null || !"".equals(str)) {
strList.add(str);
}
}
}
return strList;
}

1、将上面的代码考到项目中,把该导的包导好。该方法所需的类都在iTextpdf里 https://download.csdn.net/download/esc_tab_end/10730983 。如果你的报表里还需要什么条形码生成的。可以下载条形码所需的包: https://download.csdn.net/download/esc_tab_end/10730999

2、然后调用printSign方法。

2.1 printSign方法入参是pdf的二进制流对象。

2.2 还有就是关键字写上自己所需要的关键字就行了。方法内的代码都是现成的,不需要改动,若有特殊需求可以自己微调。

注意:pdf中的关键字的字体必须是中文字体,例如:宋体,黑体,楷体等等。如果pdf生成的时候关键字是用英文字体例如:Arial,Dialog等等这些。

效果图如下:

在这里插入图片描述



推荐阅读
author-avatar
木易_迪迪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有