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 ...
随机推荐
- Linux之防火墙与端口
1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放.下面是命令实现: iptables -P INPUT DROPiptables -P FORWARD DROPiptable ...
- linux命令查看服务器的型号、序列号、内存插槽数(转)
1,查看服务器型号.序列号: dmidecode|grep "System Information" -A9|egrep "Manufacturer|Product|S ...
- websocket连接相关的几个问题
https://blog.csdn.net/shangmingtao/article/details/75810099 https://blog.csdn.net/keketrtr/article/d ...
- 【NOIP】提高组2016 愤怒的小鸟
[题意]Universal Online Judge [算法]状态压缩型DP [题解]看数据范围大概能猜到是状压了. 根据三点确定一条抛物线,枚举两个点之间的抛物线,再枚举有多少点在抛物线上(压缩为状 ...
- Vuejs - 组件式开发
初识组件 组件(Component)绝对是 Vue 最强大的功能之一.它可以扩展HTML元素,封装可复用代码.从较高层面讲,可以理解组件为自定义的HTML元素,Vue 的编译器为它添加了特殊强大的功能 ...
- java 错误: 找不到或无法加载主类解决方法
1.配置好jdk与jre环境变量路径 https://www.cnblogs.com/xch-yang/p/7629351.html 2.在编译和运行的时候需要注意如下格式.
- HDU 2899 三分
我们对这个函数求二阶导数,发现他的二阶导数是恒大于0的,那么他的导数是单调的,且在某时刻为0,那么这时的x值就是极值处的x值,其实题目说了,有最小值,那么我们三分水过去就好了. 反思:精度不够,因为是 ...
- bzoj 1305 二分+最大流判定|贪心
首先我们二分一个答案mid,在判定是否能举办mid次,那么对于每个次我们可以用最大流根据是否满流(流量为n*mid)来判定,对于每个点我们拆成两个点,分别表示这个人要和他喜欢和不喜欢的人一起跳舞,那么 ...
- UNIX v6
UNIX v6 http://download.csdn.net/download/u013896535/9106775 https://github.com/chromium/mini_chromi ...
- Python爬虫数据处理
一.首先理解下面几个函数 设置变量 length()函数 char_length() replace() 函数 max() 函数1.1.设置变量 set @变量名=值 set @address='中国 ...