概述
在pdf文档的最后一页,合适位置,添加印章图片。
maven依赖
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.7</version> </dependency>
实现
类图
createImage (imageContent: byte[], width: float, height: float, left: float, bottom: float): com.itextpdf.text.Image以指定的内容、大小、位置创建itextpdf的Image对象,这个对象将用于addImage方法。
createImage (imageContent: byte[]): com.itextpdf.text.Image以指定的内容,默认的大小和位置(参考类图中定义的常量)创建itextpdf的Image对象,这个对象将用于addImage方法。
addImage (image: com.itextpdf.text.Image, is: InputStream, os: OutputStream): void将图片添加到指定pdf文档的最后一页,将结果写到指定输出流。参数is提供原pdf的内容,参数os提供写出结果的流。
testAddDefaultImage (is: InputStream, os: OutputStream): void测试用:将默认的图片添加到指定pdf文档的最后一页,将结果写到指定输出流。
代码
IStamperService
package cn.ljl.javaweb.demo.ckeditor.service; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.itextpdf.text.Image; /** * 设置图片、添加图片. * @author lijinlong * */ public interface IStamperService { public static final Log logger = LogFactory.getLog(IStamperService.class); /** 默认宽度 */ float DEFAULT_WIDTH = 100f; /** 默认高度 */ float DEFAULT_HEIGHT = 100f; /** 默认x坐标 */ float DEFAULT_LEFT = 440f; /** 默认y坐标 */ float DEFAULT_BOTTOM = 50f; /** * 根据指定的图片数据,封装成{@link Image}对象实例. * * @param imageContent * 图片内容 * @param width * 图片宽度 * @param height * 图片高度 * @param left * 图片X坐标 * @param top * 图片Y坐标 */ public Image createImage(byte[] imageContent, float width, float height, float left, float bottom); /** * 使用默认的数据创建{@link Image}对象实例. * @param imageContent 图像内容. * @return */ public Image createImage(byte[] imageContent); /** * 加入图片.<br/> * 要求先调用{@link #setImage(byte[], float, float, float, float)}设置图片;<br/> * 从指定的输入流读入pdf内容,加入图片之后写到指定的输出流.<br/> * @param image 指定作为印章的{@link Image}实例. * @param is * @param os */ public void addImage(Image image, InputStream is, OutputStream os); /** * 将默认的图片加入pdf.<br/> * 这个方法仅用于功能测试. * @param is * @param os */ public void testAddDefaultImage(InputStream is, OutputStream os); }
StamperServiceImpl
package cn.ljl.javaweb.demo.ckeditor.service; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import com.itextpdf.text.BadElementException; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; public class StamperServiceImpl implements IStamperService { StamperServiceImpl() { super(); } @Override public Image createImage(byte[] imageContent, float width, float height, float left, float bottom) { Image image = null; try { image = Image.getInstance(imageContent); } catch (BadElementException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } image.scaleAbsolute(width, height); image.setAbsolutePosition(left, bottom); return image; } @Override public Image createImage(byte[] imageContent) { Image image = createImage(imageContent, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_LEFT, DEFAULT_BOTTOM); return image; } @Override public void addImage(Image image, InputStream is, OutputStream os) { PdfReader reader = null; PdfStamper stamper = null; try { reader = new PdfReader(is); int nop = reader.getNumberOfPages(); stamper = new PdfStamper(reader, os); PdfContentByte content = stamper.getOverContent(nop); content.addImage(image); } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } finally { try { if (stamper != null) stamper.close(); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (reader != null) reader.close(); } } /** 测试图片 */ private static final String PATH_IMAGE = "ckeditor/stamper/signature.gif"; @Override public void testAddDefaultImage(InputStream is, OutputStream os) { InputStream imageIs = StamperServiceImpl.class.getClassLoader().getResourceAsStream(PATH_IMAGE); byte[] imageContent = null; try { int length = imageIs.available(); imageContent = new byte[length]; imageIs.read(imageContent); } catch (IOException e) { e.printStackTrace(); } finally { try { imageIs.close(); } catch (IOException e) { e.printStackTrace(); } } Image img = createImage(imageContent); addImage(img, is, os); } }
印章图片
盖章用的图片需要经过特殊处理(应该是在透明度方面进行处理),否则会覆盖下面的内容。这里提供一张测试用的图片:
时间: 2024-10-12 23:41:34