java生成pdf文件的完善

主要完善了两个功能,一个是对pdf文件进行加密,一个加水印

一、对生成的pdf文件进行加密:

加密用到了集成jar包 bcprov-jdk15on-1.48.jar 加密只需在pdfWriter中setEncryption() , 而其中的参数可以通过xml文件进行配置,在xml的global标签中新增

<encrypt encryption="true" userPassword="11" ownerPassword="11"></encrypt>

同时,新增一个EncryptModel,用该对象存储encrypt 标签中的参数,在GlobalModel中需要添加EncryptModel对象,将EncryptModel set 进GlobalModel 对象中,GlobalModel又存入统筹对象 DocModel  。

在对DocModel  进行解析时,先拆分GlobalModel,将其中的参数传入PdfWriter , 再将BodyModel中存入的对象add到Document中。其中添加密码的实现代码如下:

pdfWriter.setEncryption(encryptModel.getUserPassword().getBytes(), encryptModel.getOwnerPassword().getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);


最终生成解析各个对象,生成pdf文件的代码如下:

	/**
	 * 根据model对象的内容,开始写入pdf文件
	 * @param model  存放文件内容文件对象
	 * @param os	文件输出流
	 * @throws Exception
	 */
	public void create(DocModel model, OutputStream os) throws Exception {
		this.docModel = model;
		PageModel pageModel = this.docModel.getGlobalModel().getPage();
		Document document = null;
		try {
			if ((pageModel.getMarginLeft() < 0) && (pageModel.getMarginRight() < 0) && (pageModel.getMarginTop() < 0) && (pageModel.getMarginBottom() < 0))
				document = new Document(PageSize.A4);  //如果page参数设置不完整,则默认使用A4大小
			else {
				document = new Document(PageSize.A4, pageModel.getMarginLeft(),
						pageModel.getMarginRight(), pageModel.getMarginTop(),
						pageModel.getMarginBottom());
			}
			this.pdfWriter = PdfWriter.getInstance(document, os);
			//设置页眉页脚
			this.pdfWriter.setPageEvent(createHeaderFooter());
			//设置密码
			EncryptModel encryptModel = this.docModel.getGlobalModel().getEncrypt();
			if(encryptModel.isEncryption())
				this.pdfWriter.setEncryption(encryptModel.getUserPassword().getBytes(), encryptModel.getOwnerPassword().getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
			document.open();
			createContent(document, this.docModel.getBodyModel().getCells());
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			if (document != null)
				document.close();
			if (this.pdfWriter != null)
				this.pdfWriter.close();
		}
	}

	/**
	 * 添加各元组实例对象到Document中
	 * @param document
	 * @param cells
	 * @throws Exception
	 */
	private void createContent(Document document, List<CellModel> cells) throws Exception {
		for (CellModel cell : cells)
			if ((cell instanceof PModel))  //CellModel为所有模型均须实现的公共接口,可以用 instanceof 判断具体内容具体是被哪个接口实现类实例化的
				document.add((Element) new PCreator(this.docModel.getGlobalModel(), this.pdfWriter).create(cell));
			
			else if ((cell instanceof LineModel)) 
			{
				new LineCreator(this.docModel.getGlobalModel(), this.pdfWriter,document, 10.0F).create(cell);
			}
			else if ((cell instanceof ImgModel))
				document.add((Element) new ImgCreator(this.docModel.getGlobalModel(), this.pdfWriter).create(cell));
			
			else if ((cell instanceof TableModel))
				document.add((Element) new TableCreator(this.docModel.getGlobalModel(), this.pdfWriter, document).create(cell));
			
			else if ((cell instanceof BrModel))
				document.add((Element) new BrCreator(this.docModel.getGlobalModel(), this.pdfWriter).create(cell));
			
			else if ((cell instanceof NpModel))
				document.newPage();
	}

二、水印

直接用image对象就可实现水印。。

你可能感兴趣的:(java生成pdf文件的完善)