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

本站声明
本文转载自:http://www.cnblogs.com/ywjy/p/5045483.html     作者:一尾金鱼     发布日期:2015-12-14     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2016 ITdaan.com 粤ICP备14056181号