概述

在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文档盖章的更多相关文章

  1. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. C# 复制PDF页面到另一个PDF文档

    C# 复制PDF页面到另一个PDF文档 有时候我们可能有这样一个需求,那就是把PDF页面从一个PDF文档复制到另一个PDF文档中.由于PDF文档并不像word文档那样好编辑,因此复制也相对没有那么容易 ...

  3. 利用Java动态生成 PDF 文档

    利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...

  4. Java实现office文档与pdf文档的在线预览功能

    最近项目有个需求要java实现office文档与pdf文档的在线预览功能,刚刚接到的时候就觉得有点难,以自己的水平难以在三四天做完.压力略大.后面查找百度资料.以及在同事与网友的帮助下,四天多把它做完 ...

  5. 【Win10 开发】读取PDF文档

    关于用来读取PDF文档的内容的API,其实在Win8.1的时候就有,不过没关系,既咱们讨论的是10的UAP,连同8.1的内容也包括进去,所以老周无数次强调:把以前的内容学好了,就可以在不学习任何新知识 ...

  6. 一起学微软Power BI系列-官方文档-入门指南(7)发布与共享-终结篇+完整PDF文档

    接触Power BI的时间也只有几个月,虽然花的时间不多,但通过各种渠道了解收集,谈不上精通,但对一些重要概念和细节还是有所了解.在整理官方文档的过程中,也熟悉和了解了很多概念.所以从前到后把微软官方 ...

  7. 使用免费组件view pdf 文档

    “Is there any way to view PDF files in a Winforms tool?” 这个是我在技术论坛上发现的一个老外求助的帖子,然后看到别人回复的帖子中建议了一个免费的 ...

  8. 如何使用免费PDF控件从PDF文档中提取文本和图片

             如何使用免费PDF控件从PDF文档中提取文本和图片 概要 现在手头的项目有一个需求是从PDF文档中提取文本和图片,我以前也使用过像iTextSharp, PDFBox 这些免费的PD ...

  9. PHP 与pdf文档 与条码

    必要的步骤 1.导入require_once "tcpdf/tcpdf.php"; 工具源码在demo中 2.$pdf = new TCPDF("P", &qu ...

随机推荐

  1. 【BZOJ2288】生日礼物 [贪心]

    生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ftiasch 18岁生日的时候, ...

  2. 【51NOD-5】1293 球与切换器

    [算法]DP [题解]f[i][j][0]表示在i,j位置往下走的球数,f[i][j][1]表示在i,j位置往右走的球数,经过i,j的球若为-1则(num+1)/2往下,其余往右.+1类似. 转移见代 ...

  3. 基于 Docker 的 Zabbix 微服务系统

    zabbix 官网提供一个镜像 [ zabbix-appliance ], 可以直接拉起一个 zabbix-server. 但是数据库无法分离出来. 本实践使用 zabbix 官方提供的 Docker ...

  4. Different Integers(牛客多校第一场+莫队做法)

    题目链接:https://www.nowcoder.com/acm/contest/139/J 题目: 题意:给你n个数,q次查询,对于每次查询得l,r,求1~l和r~n元素得种类. 莫队思路:1.将 ...

  5. embed标签 阻止点击事件 让父元素处理点击事件

    由于规定页面显示的PDF文件要有固定大小,使得页面风格统一 最开始发现了CSS样式pointer-events 写出如下代码,在360急速浏览器急速模式中访问可在点击PDF控件时可跳转页面 <a ...

  6. 灵活使用ARM汇编的WEAK关键字

    //=====================================================================//TITLE://    灵活使用ARM汇编的WEAK关 ...

  7. css文本垂直水平居中

    一.单行文本居中 .content{ height:100px; line-height:100px; text-align:center; border:1px solid red; } 效果图 二 ...

  8. ctsc&apio2018八日游

    day0: 早就知道自己是打酱油的..早就做好了打铁的准备.. Q:那你来干嘛 A:当然是来玩啊!!玩啊!啊!! emmmmm 抱着半期考不及格的卷子瑟瑟发抖地上了飞机. day1:报道!当然还有在宾 ...

  9. •搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机

    本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB ...

  10. C++学习之路(一):const与define,结构体对齐,new/delete

    前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验. (一)const与define 关于con ...