java 使用 itextpdf 为 PDF 添加图片

package com.soft.pdfaddseal;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import com.itextpdf.text.Document;
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 demo {
	private static int blank = 5;

	public static void main(String[] args) {
		try {
			// 获取所有图片
			List<String> list = new ArrayList<>();
			list.add("F:\\demo.jpg");
			list.add("F:\\2.png");
			list.add("F:\\3.png");
			list.add("F:\\4.png");

			addPdfMark("F:\\1.pdf", "F:\\2.pdf", list);
		} catch (Exception e) {
			System.out.println("失败");
			e.printStackTrace();
		}
		System.out.println("成功");
	}

	public static void addPdfMark(String InPdfFile, String outPdfFile, List<String> imgList) throws Exception {
		try {
			// 获取PDF文档信息
			Map<String, Object> pdfMsg = getPdfMsg(InPdfFile);
			// 开始计算图片起始位置 * PDF文档宽度 - (所有图片的宽度 + 每张图片右侧加5 个单位的空白 )
			float startAddress = Float.valueOf(pdfMsg.get("width").toString());
			for (String imgPath : imgList) {
				startAddress -= (Double.valueOf(getImgMsg(imgPath).get("width").toString()) + blank);
			}

			PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
			PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outPdfFile));

			for (String imgPath : imgList) {
				Image img = Image.getInstance(imgPath);// 插入水印   
				// 设置图片水印的位置。
				img.setAbsolutePosition(startAddress, 400);
				// 开始水印 如果需要每一页都加图片,这里添加循环即可
				PdfContentByte under = stamp.getUnderContent(Integer.valueOf(pdfMsg.get("pageSize").toString()));
				under.addImage(img);
				startAddress += Float.valueOf(Float.valueOf(getImgMsg(imgPath).get("width").toString()) + blank);
			}

			stamp.close();// 关闭          
			File tempfile = new File(InPdfFile);

			if (tempfile.exists()) {
				tempfile.delete();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static Map<String, Object> getPdfMsg(String filePath) {
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		try {
			// 获取PDF共有几页
			PdfReader pdfReader = new PdfReader(new FileInputStream(filePath));
			int pages = pdfReader.getNumberOfPages();
			// System.err.println(pages);
			map.put("pageSize", pages);

			// 获取PDF 的宽高
			PdfReader pdfreader = new PdfReader(filePath);
			Document document = new Document(pdfreader.getPageSize(pages));
			float widths = document.getPageSize().getWidth();
			// 获取页面高度
			float heights = document.getPageSize().getHeight();
			// System.out.println("widths = " + widths + ", heights = " + heights);
			map.put("width", widths);
			map.put("height", heights);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

	public static Map<String, Object> getImgMsg(String imgPath) {
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		try {
			File picture = new File(imgPath);
			BufferedImage sourceImg = ImageIO.read(new FileInputStream(picture));
			// System.out.println("=源图宽度===>"+sourceImg.getWidth()); // 源图宽度
			// System.out.println("=源图高度===>"+sourceImg.getHeight()); // 源图高度
			map.put("width", sourceImg.getWidth());
			map.put("height", sourceImg.getHeight());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

}

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值