导出带水印的pdf

12 篇文章 1 订阅
package com.util.pdf;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jpedal.PdfDecoder;
import org.jpedal.exception.PdfException;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.CMYKColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfTransparencyGroup;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.Image;
import com.pde.app.util.PdeTools;

/**
 * 
 * @ClassName PdfUtil 
 * @Description PDF操作工具
 * @version 1.0.0
 */
public class PdfUtil {
    
	/**
	 * 
	 * @Title addWatermark 
	 * @Description 生成加水印的PDF文件
	 * @param filename 源PDF文件
	 * @param outfile 生成水印后的文件
	 * @param transparency 设置透明度0--1
	 * @param Watermarks 水印列表
	 * @param ownerPassWord 文件密码 
	 * @return boolean 
	 * @since  1.0.0
	 */
    public boolean addWatermark(String filename,String outfile,float transparency,List<WatermarkAbstract> Watermarks,String ownerPassWord) {
    	boolean r = false;
    	PdfReader reader = null;
    	PdfStamper stamp = null;
    	FileOutputStream fileoutputS= null;
        try {
             if (null == ownerPassWord || "".equals(ownerPassWord)) { 
                 reader = new PdfReader(filename); 
             } else { 
                 reader = new PdfReader(filename, ownerPassWord.getBytes()); 
             } 
             fileoutputS =  new FileOutputStream(outfile);
             stamp = new PdfStamper(reader, fileoutputS);
             //设置透明
         	 PdfGState gs = new PdfGState();
         	 gs.setFillOpacity(transparency);
             for(int i=1;i<=reader.getNumberOfPages();i++){
            	 PdfContentByte content = null;
                 PdfTemplate template = null;
                 for(WatermarkAbstract watermark :Watermarks){
                	 if(!watermark.isNeedByPage(i)){
                		 continue;
                	 }
                	 if(null==content){
                		 content = stamp.getOverContent(i);
                	 }
                	 float pageHeight =reader.getPageSize(i).getHeight();
                     float pageWidth= reader.getPageSize(i).getWidth();
                     if(null==template){
                    	 template = this.createTemplate(content, pageWidth, pageHeight);
                	 }
                     template = watermark.addWatermarkToTemplate(template);
                 }
                 if(null!=template && null!=content){
                	 content.setGState(gs);
                     content.addTemplate(template, 0, 0);
                 }
             }  
         }
         catch (Exception de) {
        	 de.printStackTrace();
             return false;
         }finally{
 			 try {
        		 if(stamp!=null)
        			 stamp.close();
			} catch (DocumentException e) {
			} catch (IOException e) {
			}	
        	if(reader!=null)
 				reader.close();	
        	try {
 				if(fileoutputS!=null){
 					fileoutputS.flush();
 					fileoutputS.close();
 				}
 			} catch (IOException e) {
 			}
         }
         File f = new File(outfile);
         if(f.isFile()){
        	 r = true;
         }
         return r;
     }
    
    /**
     * 
     * @Title createTemplate 
     * @Description 得到PdfTemplate 
     * @param content
     * @param pageWidth
     * @param pageHeight
     * @return
     * @throws BadElementException
     * @throws MalformedURLException
     * @throws IOException
     * @throws DocumentException PdfTemplate 
     * @since  1.0.0
     */
    public PdfTemplate createTemplate(PdfContentByte content,float pageWidth,float pageHeight) throws BadElementException, MalformedURLException, IOException, DocumentException{
    	PdfTemplate template =content.createTemplate(pageWidth, pageHeight);
        PdfTransparencyGroup transGroup = new PdfTransparencyGroup();
        transGroup.setIsolated(true);
        transGroup.setKnockout(false);
        template.setGroup(transGroup);
        return template;
    }
    /**
	 * 
	 * @Title addWatermark 
	 * @Description 生成加水印的PDF文件
	 * @param filename 源PDF文件
	 * @param outfile 生成水印后的文件
	 * @param transparency 设置透明度0--1
	 * @param Watermarks 水印列表
	 * @return boolean 
	 * @since  1.0.0
	 */
    public boolean addWatermark(String filename,String outfile,float transparency,List<WatermarkAbstract> Watermarks){
    	return this.addWatermark(filename, outfile, transparency, Watermarks,null);
    }
     
     /** 
      * Itext证书加密 
      * 
      * @param originalFile 
      *            pdf文件路径 
      * @param encryptedFile 
      *            加密后生成新的pdf文件路径 
      * @param certFile 
      *            证书路径 
      * @param password 
      *            证书密码 
      * @param ownerPassWord 
      *            所有者密码 
      */ 
     public void certificateEncryption(String originalFile, 
             String encryptedFile, String certFile, String password, 
             String ownerPassWord) { 
         PdfReader reader = null; 
         InputStream is = null; 
         PdfStamper stamper = null; 
         try { 

             // 添加providers (在%JAVA_HOME%/jre/lib/security/java.security 中可以找到sun提供的providers ) 
             Security.addProvider(new BouncyCastleProvider()); 
             // 如果原始文件已经加密 那么就要求提供ownerPassWord 
             if (null == ownerPassWord || "".equals(ownerPassWord)) { 
                 reader = new PdfReader(originalFile); 
             } else { 
                 reader = new PdfReader(originalFile, ownerPassWord.getBytes()); 
             } 
             stamper = new PdfStamper(reader, 
                     new FileOutputStream(encryptedFile)); 
             is = new FileInputStream(certFile); 
             // SubjectPublicKeyInfo(由 X.509 标准定义)public key 
//             CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
//             Certificate cert = cf.generateCertificate(is); 
//             
             X509Certificate cert = getCertFromKeyStoreFile(certFile, "intca",
            		 password);
             
             
             Certificate[] certs = new Certificate[1]; 
             certs[0] = cert; 

             int[] permissions = new int[1]; 
             
             
				permissions[0] = PdfWriter.ALLOW_MODIFY_CONTENTS | PdfWriter.ALLOW_COPY
						| PdfWriter.ALLOW_ASSEMBLY | PdfWriter.ALLOW_FILL_IN
						| PdfWriter.ALLOW_MODIFY_ANNOTATIONS
						| PdfWriter.ALLOW_SCREENREADERS;
				stamper.setEncryption(certs, permissions,
						PdfWriter.SPACE);
         } catch (Exception e) { 
             e.printStackTrace(); 
         } finally {
        	try {
         		 if(stamper!=null)
         			stamper.close();
 			} catch (DocumentException e) {
 			} catch (IOException e) {
 			}
            //关闭流  
        	if(reader!=null)
  				reader.close();
         	try {
  				if(is!=null)
  					is.close();
  			} catch (IOException e) {
  			}
         	
         } 
     }
     
     /**
 	 * 获取证书
 	 * @param fullFileName
 	 * @param alias
 	 * @param storepass
 	 * @return
 	 */
 	public X509Certificate getCertFromKeyStoreFile(String fullFileName,
 			String alias, String storepass) {
 		X509Certificate cert = null;
 		BufferedInputStream bIn = null;
 		try {
 			bIn = new BufferedInputStream(new FileInputStream(fullFileName));
 			KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
 			keyStore.load(bIn, storepass.toCharArray());
 			Certificate[] certs = keyStore.getCertificateChain(alias);
 			cert = (X509Certificate) certs[0];

 		} catch (KeyStoreException e) {
 			e.printStackTrace();
 		} catch (NoSuchProviderException e) {
 			e.printStackTrace();
 		} catch (FileNotFoundException e) {
 			e.printStackTrace();
 		} catch (NoSuchAlgorithmException e) {
 			e.printStackTrace();
 		} catch (CertificateException e) {
 			e.printStackTrace();
 		} catch (IOException e) {
 			e.printStackTrace();
 		}finally{
 			if(null != bIn)
 				try {
 					bIn.close();
 				} catch (IOException e) {
 					e.printStackTrace();
 				}
 		}
 		return cert;
 	}
     
    /**
     * 
     * @Title setEncryption 
     * @Description PDF密码加密 
     * @param originalFile pdf文件路径 
     * @param encryptedFile 加密后生成新的pdf文件路径 
     * @param original_ownerPassWord 源文件所有者密码
     * @param userPassWord 用户密码 
     * @param ownerPassWord 所有者密码 
     * @param permissions 权限列表 PdfWriter.ALLOW_ASSEMBLY | PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_DEGRADED_PRINTING | PdfWriter.ALLOW_FILL_IN
     *  | PdfWriter.ALLOW_MODIFY_ANNOTATIONS | PdfWriter.ALLOW_MODIFY_CONTENTS | PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_SCREENREADERS; 
     * return void 
     * @since  1.0.0
     */
     public void setEncryption(String originalFile,String encryptedFile,
    		 String original_ownerPassWord,String userPassWord,String ownerPassWord,int permissions) { 
         PdfReader reader = null; 
         PdfStamper stamper = null; 
         try { 
             if (null == original_ownerPassWord || "".equals(original_ownerPassWord)) { 
                 reader = new PdfReader(originalFile); 
             } else { 
                 reader = new PdfReader(originalFile, original_ownerPassWord.getBytes()); 
             } 
             stamper = new PdfStamper(reader, 
                     new FileOutputStream(encryptedFile)); 
             // pdf文档加密 
             //stamper.setEncryption(PdfWriter.ENCRYPTION_AES_128,null,null,PdfWriter.ALLOW_COPY ); 
             stamper.setEncryption(userPassWord.getBytes(), ownerPassWord.getBytes(), permissions, false);
         } catch (Exception e) { 
             e.printStackTrace(); 
         } finally {
        	try {
        		if(stamper!=null)
        			stamper.close();
 			} catch (DocumentException e) {
 			} catch (IOException e) {
 			}
        	if(reader!=null)
  				reader.close();
         } 
     }
     
     
	public void addTextWatermarkPdfsoft(String inputfile,String outputfile){
		List<Watermark> watermarks = new ArrayList<Watermark>();
		Set<Integer> textpages = new HashSet<Integer>();
		textpages.add(1);
		watermarks.add(new WatermarkText(2,0,10,45,0,null,"中国人gds" ,CMYKColor.BLUE,Element.ALIGN_LEFT,1,50));
		watermarks.add(new WatermarkImage(3,0,0,45,0,null,null,PdeTools.imageToByteArray(new File("f:/testinput/p9.png")),100));
		watermarks.add(new WatermarkRectangle(1,20,20,10,0,null,CMYKColor.BLUE,150,100,1));
		watermarks.add(new WatermarkRectangle(1,10,10,0,0,textpages,CMYKColor.BLUE,20,10,1));
		watermarks.add(new WatermarkText(1,14,12,0,0,textpages,"01",CMYKColor.RED,Element.ALIGN_LEFT,0,8));
		watermarks.add(new WatermarkRectangle(1,30,10,0,0,textpages,CMYKColor.BLUE,20,10,1));
		watermarks.add(new WatermarkText(1,31,12,0,0,textpages,"2012",CMYKColor.GRAY,Element.ALIGN_LEFT,0,8));
		watermarks.add(new WatermarkRectangle(1,50,10,0,0,textpages,CMYKColor.BLUE,20,10,1));
		watermarks.add(new WatermarkText(1,52,10,0,0,textpages,"长期",CMYKColor.RED,Element.ALIGN_LEFT,1,8));
		watermarks.add(new WatermarkRectangle(1,10,20,0,0,textpages,CMYKColor.BLUE,20,10,1));
		watermarks.add(new WatermarkText(1,11,22,0,0,textpages,"0001",CMYKColor.GRAY,Element.ALIGN_LEFT,0,8));
		watermarks.add(new WatermarkRectangle(1,30,20,0,0,textpages,CMYKColor.BLUE,20,10,1));
		watermarks.add(new WatermarkRectangle(1,50,20,0,0,textpages,CMYKColor.BLUE,20,10,1));
		
		watermarks.add(new WatermarkEllipse(1,10,10,0,0,textpages,CMYKColor.BLACK,200,200,1));
		watermarks.add(new WatermarkEllipse(2,10,10,0,0,textpages,CMYKColor.BLUE,200,200,1));
		watermarks.add(new WatermarkEllipse(3,10,10,0,0,textpages,CMYKColor.CYAN,200,200,1));
		watermarks.add(new WatermarkEllipse(4,10,10,0,0,textpages,CMYKColor.DARK_GRAY,200,200,1));
		watermarks.add(new WatermarkEllipse(5,10,10,0,0,textpages,CMYKColor.GRAY,200,200,1));
		watermarks.add(new WatermarkEllipse(6,10,10,0,0,textpages,CMYKColor.GREEN,200,200,1));
		watermarks.add(new WatermarkEllipse(7,10,10,0,0,textpages,CMYKColor.LIGHT_GRAY,200,200,1));
		watermarks.add(new WatermarkEllipse(8,10,10,0,0,textpages,CMYKColor.MAGENTA,200,200,1));
		watermarks.add(new WatermarkEllipse(9,10,10,0,0,textpages,CMYKColor.ORANGE,200,200,1));
		PdfWatermarkUtil  pdfWatermarkUtil = new PdfWatermarkUtil(0.5f,watermarks);
		//addWatermark(inputfile, outputfile,0.5f,watermarks,"");
		pdfWatermarkUtil.addWatermark(inputfile, outputfile);
     }
     public static void main(String[] strs){
    	 //new PdfUtil().addTextWatermarkPdfsoft("f:/1/307.pdf", "f:/1/testWatermark.pdf");
    	 // new PdfUtil().certificateEncryption("f:/1/1.pdf", "f:/1/1.cer.pdf", "e:/IntCA.pfx", "123456", null);
    	 //new PdfUtil().setEncryption("f:/1/1.pdf", "f:/1/Encryption.pdf", null, "user", "pde", 16); 
    	 //pdfBoxToImagePdf("c:/111.pdf","c:/222.pdf",new int[]{1});
    	 pdfImportedPage("c:/12345.pdf","c:/222.pdf",new int[]{1,22});
     }
     
     
     /**
      * PDF指定页生成BufferedImage By PDFBOX
      * @param pdfFile
      * @param pageNumber
      * @return
      */
     @SuppressWarnings("unchecked")
	public static List<BufferedImage> pdfBoxToImage(String pdfFile,int[] pageNumber)   {
    	 List<BufferedImage> imgs= new ArrayList<BufferedImage>();
         PDDocument doc = null;  
         try {  
             doc = PDDocument.load(pdfFile);  
             List<PDPage> pages = (List<PDPage>)doc.getDocumentCatalog().getAllPages();  
             for(int pagen:pageNumber){
            	 if(pagen > pages.size()) return null;
            	 PDPage page = (PDPage) pages.get(pagen-1); 
            	 BufferedImage image = page.convertToImage();  
            	 imgs.add(image);
             }
         } catch (IOException e) {  
             e.printStackTrace();  
         }  finally {
 		   	if(doc!=null){
 		   		try {
					doc.close();
				} catch (IOException e) {
				}
 		   	}
 		}
        return imgs;
     }
     
     /**
      * PDF指定页生成BufferedImage By jpedal
      * @param pdfFile
      * @param pageNumber
      * @return
      */
	public static List<BufferedImage> jpedalToImage(String pdfFile,int[] pageNumber)   {
    	 List<BufferedImage> imgs= new ArrayList<BufferedImage>(); 
         PdfDecoder decoder = new PdfDecoder(true);
         try{
        	 decoder.openPdfFile(pdfFile);
        	 for(int pagen:pageNumber){
            	 if(pagen > decoder.getPageCount()) return null;
            	 BufferedImage image = decoder.getPageAsImage(pagen);  
            	 imgs.add(image);
        	 }
         } catch (PdfException e) {
         } finally {
             decoder.closePdfFile();
         }
    	 return imgs;
    }

     
     /**
      * PdfReader拷贝页为文件
      * @param reader PdfReader
      * @param importedPdfFile 生成的文件名
      * @param pages 页数集合
      * @return
      */
     public static boolean pdfImportedPage(PdfReader reader,String importedPdfFile,int[] pages){
 		PdfCopy copyer = null; 
 		Document document = null;  
 		try { 
 			if(reader.getNumberOfPages()<pages[0]){
 				return false;
 			}
			document = new Document();  
			copyer = new PdfCopy(document, new FileOutputStream(importedPdfFile));             
	        document.open();
	        for(int page:pages){
	        	if(reader.getNumberOfPages()<page){
	 				return false;
	 			}
		        PdfImportedPage pager = copyer.getImportedPage(reader, page);  
		        copyer.addPage(pager);  
	        }
 		} catch (Exception e) { 
 			e.printStackTrace();
 			return false;
 		} finally {
 		   	if(document!=null){
 		   		document.close();
 		   	}
 		   	if(copyer!=null){
 		   		copyer.close();
 		   	}
 		}
 		return true;
     }
     
     public static boolean pdfImportedPage(String inputfile,String importedPdfFile,int[] pages){
    	 PdfReader reader = null;  
 		try { 
 			reader = new PdfReader(inputfile); 
 			return pdfImportedPage(reader,importedPdfFile,pages);
 		} catch (Exception e) { 
			return false;
		} finally {
		   	if(reader!=null){
		   		reader.close();
		   	}
		} 
     }
     
     /**
      * 将BufferedImage生成为PDF文件
      * @param bImages List<BufferedImage>
      * @param pdfFile PDF文件名
      * @return
      */
     public static boolean bufferedImageToImagePdf(List<BufferedImage> bImages,String pdfFile){
     	boolean result = false;
     	if(bImages==null || bImages.size()==0) return false;
  		Document document = null;
  		try {
  			document = new Document(new com.itextpdf.text.Rectangle(bImages.get(0).getWidth()+60,
  					bImages.get(0).getHeight()+60), 30, 30, 30, 30);
  			PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
  			document.open();
  			for(BufferedImage bImage : bImages){
  				document.newPage();
  				ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  				ImageIO.write(bImage, "jpg", baos);   
  	            byte[] bytes = baos.toByteArray(); 
  	            baos.flush();
  	            bImage.flush();
	  			Image image = Image.getInstance(bytes);
  				document.setPageSize(new com.itextpdf.text.Rectangle(image.getWidth()+60,
  						image.getHeight()+60));
	  			document.add(image);
  			}
  			result = true;
  		} catch (DocumentException de) {
  			result = false;
  		} catch (IOException ioe) {
  			result = false;
  		}finally{
  			if(document!=null)
  				document.close();
  		}
  		return result;
     }
     
     /**
      * 将PDF的某页生成为图片PDF by PDFBOX
      * @param ipdfFile 输入pdf
      * @param opdfFile 输出pdf
      * @param pageNumber 页号
      * @return
      */
     public static boolean pdfBoxToImagePdf(String ipdfFile,String opdfFile,int []pageNumber)   {
    	 return bufferedImageToImagePdf(pdfBoxToImage(ipdfFile,pageNumber),opdfFile);
     }
     
     /** 将PDF的某页生成为图片PDF by jpedal
     * @param ipdfFile 输入pdf
     * @param opdfFile 输出pdf
     * @param pageNumber 页号
     * @return
     */
    public static boolean jpedalToImagePdf(String ipdfFile,String opdfFile,int []pageNumber)   {
   	 return bufferedImageToImagePdf(jpedalToImage(ipdfFile,pageNumber),opdfFile);
    }
     
     
     
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值