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

posted on 2015-12-14 15:51  一尾金鱼  阅读(1968)  评论(1编辑  收藏  举报