zoukankan      html  css  js  c++  java
  • PDF文档盖章

    概述

    在pdf文档的最后一页,合适位置,添加印章图片。

    maven依赖

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.7</version>
    </dependency>

    实现

    类图

    class-diagram

    createImage (imageContent: byte[],  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

  • 相关阅读:
    多线程-上
    IO流之序列化
    IO流之标准输入输出流
    IO流之BufferedReader/BufferedWriter
    IO流之转换流
    IO流之字符输入输出流
    IO流之字节输入输出流
    JS Flex布局
    MSSQL case when
    钉钉审批流API
  • 原文地址:https://www.cnblogs.com/ywjy/p/5045483.html
Copyright © 2011-2022 走看看