PDF文档盖章
概述
在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);
}
}
印章图片
盖章用的图片需要经过特殊处理(应该是在透明度方面进行处理),否则会覆盖下面的内容。这里提供一张测试用的图片:

PDF文档盖章的更多相关文章
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- C# 复制PDF页面到另一个PDF文档
C# 复制PDF页面到另一个PDF文档 有时候我们可能有这样一个需求,那就是把PDF页面从一个PDF文档复制到另一个PDF文档中.由于PDF文档并不像word文档那样好编辑,因此复制也相对没有那么容易 ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- Java实现office文档与pdf文档的在线预览功能
最近项目有个需求要java实现office文档与pdf文档的在线预览功能,刚刚接到的时候就觉得有点难,以自己的水平难以在三四天做完.压力略大.后面查找百度资料.以及在同事与网友的帮助下,四天多把它做完 ...
- 【Win10 开发】读取PDF文档
关于用来读取PDF文档的内容的API,其实在Win8.1的时候就有,不过没关系,既咱们讨论的是10的UAP,连同8.1的内容也包括进去,所以老周无数次强调:把以前的内容学好了,就可以在不学习任何新知识 ...
- 一起学微软Power BI系列-官方文档-入门指南(7)发布与共享-终结篇+完整PDF文档
接触Power BI的时间也只有几个月,虽然花的时间不多,但通过各种渠道了解收集,谈不上精通,但对一些重要概念和细节还是有所了解.在整理官方文档的过程中,也熟悉和了解了很多概念.所以从前到后把微软官方 ...
- 使用免费组件view pdf 文档
“Is there any way to view PDF files in a Winforms tool?” 这个是我在技术论坛上发现的一个老外求助的帖子,然后看到别人回复的帖子中建议了一个免费的 ...
- 如何使用免费PDF控件从PDF文档中提取文本和图片
如何使用免费PDF控件从PDF文档中提取文本和图片 概要 现在手头的项目有一个需求是从PDF文档中提取文本和图片,我以前也使用过像iTextSharp, PDFBox 这些免费的PD ...
- PHP 与pdf文档 与条码
必要的步骤 1.导入require_once "tcpdf/tcpdf.php"; 工具源码在demo中 2.$pdf = new TCPDF("P", &qu ...
随机推荐
- Epoll模型讲解
1.流模型 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作, ...
- apache+svn+ldap集成
apache+svn搭建方式如下:http://www.cnblogs.com/uglyliu/p/6914056.html SVN和ldap集成,我用的方式只需要更改 /etc/http/conf. ...
- Kubernetes: 集群网络配置 - flannel
参考: [ Kubernetes 权威指南 ] Kubernetes 集群搭建可以参考 [ Kubernetes : 多节点 k8s 集群实践 ] 在多个 Node 组成的 Kubernetes 集群 ...
- Chrome 浏览器 autocomplete off无效
在表单填写时突然发现autocomplete 失效了 网上搜索后得出大概意思是在某些情况下确实无效[捂脸] 解决方案 大致原因是浏览器默认为type为password的input标签自动填充密码 这样 ...
- rtems-os-source
http://blog.csdn.net/xpx3216/article/details/5776941 http://tech.hqew.com/fangan_421204 https://gith ...
- c++设计模式系列----factory模式
问题: 假设我们要开发一个游戏--打怪物,首先,游戏有分等级,假设有初级,中级两个个等级(就不用flappy bird模式了,那个比较特殊,对一个玩家来说是难以具有持久吸引力的!),不同的等级怪物也是 ...
- 2014ACM/ICPC亚洲区北京站题解
本题解不包括个人觉得太水的题(J题本人偷懒没做). 个人觉得这场其实HDU-5116要比HDU-5118难,不过赛场情况似乎不是这样.怀疑是因为老司机带错了路. 这套题,个人感觉动态规划和数论是两个主 ...
- 一个真正的客户端非阻塞的 connect
前言 - 一个简短开场白 winds 的 select 和 linux 的 select 是两个完全不同的东西. 然而凡人喜欢把它们揉在一起. 非阻塞的connect业务是个自带超时机制的 conn ...
- mac 使用清除废纸篓或彻底删除某文件 附加: smb afp ftp NAS 访问服务器相关
mac 使用清除废纸篓或彻底删除某文件 附加: smb afp ftp NAS 访问服务器相关 mac 下删除文件方法: 1.使用 cleanmymac 使用 cleamymac 的清理 和 逐个 ...
- linux的基本的命令行操作
linux的基本的命令行操作 第一步前登陆你的服务器 //创建文件夹的方法 mkdir 文件名 //进入指定文件夹 cd 文件名 //查看文件夹下的内容 ls or ll // 查看当前的路径 pwd ...