你的位置:首页 > Java教程

[Java教程]PDF文档盖章


概述

在pdf文档的最后一页,合适位置,添加印章图片。

maven依赖

<dependency>  <groupId>com.itextpdf</groupId>  <artifactId>itextpdf</artifactId>  <version>5.5.7</version></dependency>

实现

类图

class-diagram

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);  }}

印章图片

盖章用的图片需要经过特殊处理(应该是在透明度方面进行处理),否则会覆盖下面的内容。这里提供一张测试用的图片:

signature