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 ...
随机推荐
- UVA 12716 GCD XOR
https://vjudge.net/problem/UVA-12716 求有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b 结论:若gcd(a, ...
- leetcode 刷题日志 2018-3-28
树: 404. 左叶子之和 求所有左叶子结点之和 . 递归法 分析:递归法遍历结点,找左叶子结点 空指针判断 有左子节点?是叶子结点?是的话更新value的值 int sumOfLeftLeaves( ...
- 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...
- 什么是AMD规范
AMD规范全称是Asynchronous Module Definition,即异步模块加载机制.从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制. ...
- js中的document.ready
1.概念 表示在dom结构绘制完成后执行,可能DOM元素关联的部分并未加载完 2.写法 $(document).on("ready",function(){ }) $(docume ...
- js中的indexOf
1.概述 indexOf大小写敏感,其中的O要大写 2.对于字符串而言 indexOf返回字符串第一次出现的位置,若没有出现返回-1 var str = "hello world" ...
- Java 中的方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用. 一定要注意哦:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 s ...
- 【shell】shell编程(六)-shell函数的应用
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...
- python urllib2练习发送简单post
import urllib2 import urllib url = 'http://localhost/1.php' while True: data = raw_input('(ctrl+c ex ...
- linux之cron定时任务介绍
前言 linux系统有一个专门用来管理定时任务的进程cron,一般是设置成开机自启动的,通过添加任务可以让服务器定时执行某些任务. cron介绍 linux系统有一个专门用来管理定时任务的进程cron ...