工作中比较常见的需求,在pdf文件中添加印章。这里记录的是比价简单的,就是加的印章图片。
印章图片分为两种:
一种是图片为白底的,印章在白底上。
一种是印章图片底色为透明的。
在pom文件中添加依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
实现添加印章图片:
/**
* @param sourceFilePath
* @param targetFilePath
* @param imagePath
* 给生成好的PDF文件,在文件结尾,公司名称日期位置,添加印章
*/
public static void addSignSeal(String sourceFilePath,
String targetFilePath,String imagePath)throws Exception{
ClassPathResource c = new ClassPathResource(imagePath);
Image image = Image.getInstance(c.getURL());
image.scaleToFit(100,100);
PdfReader pdfReader = new PdfReader(sourceFilePath);
int pageNumber = pdfReader.getNumberOfPages();
PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader);
parser.processContent(pageNumber, new RenderListener() {
@Override
public void beginTextBlock() {
}
@Override
public void renderText(TextRenderInfo textRenderInfo) {
String text = textRenderInfo.getText();
if(text != null && text.contains("交银公司名称")){
Rectangle2D.Float textFloat = textRenderInfo.getBaseline().getBoundingRectange();
float x = textFloat.x;
float y = textFloat.y;
image.setAbsolutePosition(x+28f,y-60f);
}
}
@Override
public void endTextBlock() {
}
@Override
public void renderImage(ImageRenderInfo imageRenderInfo) {
}
});
PdfStamper stamper = new PdfStamper(pdfReader,new FileOutputStream(targetFilePath));
PdfContentByte cvas = stamper.getUnderContent(pageNumber);
cvas.addImage(image);
stamper.close();
Optional.of(pdfReader).ifPresent(PdfReader::close);
}
注:白底的印章图片 要调用 stamper.getUnderContent(pageNumber)。效果看起来是字在章上面。
如果是透明的图片就需要用 getOverContent(pageNumber)。效果看起来是章在字上面。