Java使用itextpdf生成斜面、铺满水印图片的PDF文件

引入maven依赖

<!-- PDFBOX操作PDF文件組件 -->
	<dependency>
		<groupId>org.apache.pdfbox</groupId>
		<artifactId>pdfbox</artifactId>
		<version>2.0.13</version>
	</dependency>
	
	<dependency>
           <groupId>com.itextpdf</groupId>
           <artifactId>itextpdf</artifactId>
           <version>5.4.3</version>
       </dependency>
       <dependency>
           <groupId>com.itextpdf</groupId>
           <artifactId>itext-asian</artifactId>
           <version>5.2.0</version>
       </dependency>
       <dependency>
           <groupId>com.itextpdf.tool</groupId>
           <artifactId>xmlworker</artifactId>
           <version>5.4.1</version>
       </dependency>
       <dependency>
           <groupId>org.jsoup</groupId>
           <artifactId>jsoup</artifactId>
           <version>1.10.1</version>
       </dependency>
	<!-- PDFBOX操作PDF文件組件 -->

生成带水印的PDF

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class WatermarkUtils {

	public static void main(String[] args) throws Exception {
		imageFileWaterPrint("D:\\1.png", "D:\\360安全浏览器下载\\测试.pdf", "D:\\360安全浏览器下载\\测试-水印.pdf");
	}
	
	/**
	 * 生成印有二维码水印的附件
	 * @param imageUrl 二维码图片路径
	 * @param fileUrl 附件路径
	 * @param outFileUrl 水印附件的保存路径
	 * @throws Exception IOException
	 */
	public static void psWaterPrintFile(String imageUrl, String fileUrl, String outFileUrl) throws Exception {
		PdfReader pdfReader = null;
		PdfStamper pdfStamper = null;
		try {
			//文件夹如果不存在则新建
			File outputFileP = new File(outFileUrl);
			if (!outputFileP.getParentFile().exists()) {
				outputFileP.getParentFile().mkdirs(); //创建文件夹 
			}

			pdfReader = new PdfReader(fileUrl);
			pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFileUrl));

			PdfGState gs = new PdfGState();
			gs.setFillOpacity(0.8f); // 设置透明度为0.8
			Image img = Image.getInstance(imageUrl); // 选择图片

			int total = pdfReader.getNumberOfPages(); // 获取要水印的附件的页数
			for (int i = 1; i <= total; i++) {
				Rectangle pageSize = pdfReader.getPageSize(i);

				float width = pageSize.getWidth(); //长度
				float height = pageSize.getHeight(); //高度
				//System.out.println("width:" + width + ",height:" + height);

				PdfContentByte content = pdfStamper.getOverContent(i);
				// 设置透明度
				content.setGState(gs);

				// 设置等比缩放
				img.scaleToFit(100, 100);

				// 图片的位置控制
				img.setAbsolutePosition(width - 120, height - 120);
				content.addImage(img);

				if (width > height) { //横向,再输出一份水印
					img.setAbsolutePosition(400, 750);
					content.addImage(img);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pdfStamper != null) {
				pdfStamper.close();
			}
			if (pdfReader != null) {
				pdfReader.close();
			}
		}
	}

	/**
	 * 生成印有图片水印的PDF文件(铺满、倾斜)
	 * @param imageUrl 二维码图片路径
	 * @param fileUrl 附件路径
	 * @param outFileUrl 水印附件的保存路径
	 * @throws Exception IOException
	 */
	public static void imageFileWaterPrint(String imageUrl, String fileUrl, String outFileUrl) throws Exception {
		PdfReader pdfReader = null;
		PdfStamper pdfStamper = null;
		try {
			//文件夹如果不存在则新建
			File outputFileP = new File(outFileUrl);
			if (!outputFileP.getParentFile().exists()) {
				outputFileP.getParentFile().mkdirs(); //创建文件夹 
			}

			pdfReader = new PdfReader(fileUrl);
			pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFileUrl));

			PdfGState gs = new PdfGState();
			gs.setFillOpacity(0.1f); // 设置透明度为0.1
			Image img = Image.getInstance(imageUrl); // 选择图片

			int interval = -50;
			int imgH = (int) (img.getHeight() / 4);
			int imgW = (int) (img.getWidth() / 7);
			System.out.println("imgH:" + imgH + ",imgW:" + imgW);

			int total = pdfReader.getNumberOfPages(); // 获取要水印的附件的页数
			for (int i = 1; i <= total; i++) {
				Rectangle pageRect = pdfReader.getPageSizeWithRotation(i);

				PdfContentByte content = pdfStamper.getOverContent(i);
				// 设置透明度
				content.setGState(gs);

				img.setRotationDegrees(45);//旋转 角度  

				for (int height = interval + imgH; height < pageRect.getHeight(); height = height + imgH * 3) {
					for (int width = interval + imgW; width < pageRect.getWidth() + imgW; width = width + imgW * 2) {

						// 设置等比缩放
						img.scaleToFit(100, 100);

						// 图片的位置控制
						img.setAbsolutePosition(width - imgW, height - imgH);
						content.addImage(img);
					}
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pdfStamper != null) {
				pdfStamper.close();
			}
			if (pdfReader != null) {
				pdfReader.close();
			}
		}
	}
	
	/**
	 * 获取要水印的附件的页数
	 * @param path PDF路径
	 * @return 附件的页数
	 */
	public static int efficientPDFPageCount(String path) {
		int ret = 0;
		try {
		  PdfReader reader = new PdfReader(path);
		  ret = reader.getNumberOfPages();
		  reader.close();
		  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return ret;
	}

	/**
	 * 校验附件,是否能加水印
	 * @param fileUrl 文件路径
	 * @return boolean
	 */
	public static boolean checkPdfWatermark(String fileUrl) {
		File file = new File(fileUrl);
		if (!file.exists()) { //不存在,不做校验
			return true;
		}

		//在同一目录生成一份临时文件,uuid.pdf
		String outFileUrl = file.getParent() + "/" + UUIdUtils.genId() + ".pdf";

		PdfReader pdfReader = null;
		PdfStamper pdfStamper = null;
		try {

			pdfReader = new PdfReader(fileUrl);
			pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFileUrl));

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pdfStamper != null) {
				try {
					pdfStamper.close();
				} catch (DocumentException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (pdfReader != null) {
				pdfReader.close();
			}
		}

		//校验临时文件,是否能打开:报错,不能打开、不能加水印;否则,可以
		InputStream is = null;
		try {
			is = new FileInputStream(outFileUrl);

			PdfReader reader = new PdfReader(is);
			reader.close();

			//可以加水印
			return true;
		} catch (Exception e) {

			//报错,不能打开、不能加水印;
			return false;
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			//删除临时文件
			new File(outFileUrl).delete();
		}
	}

}

PDF文件

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值