admin管理员组

文章数量:1650766

1 问题

最近在做给PDF文件加水印,在服务器上面一直提示如下异常

java.lang.AbstractMethodError:javax.xml.parsers.DocumentBuilderFactory.setFeature(java/lang/String)

2 原因

在本地WINDOWS编译测试没问题,只在LINUX服务器上面有这个问题,查了很久估计是服务器上面不同jar包的多xml解析器冲突

3 部分代码

public  void pdfToWaterMarkAndCPPDF(String infilePath,String outFilePath,String picPath,String bgPicPath) {
    	try{
    		System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
	    	PdfReader reader = new PdfReader(infilePath);//选择需要印章的pdf
	        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf
	
	        Rectangle pageSize = reader.getPageSize(1);//获得第一页
	        float height = pageSize.getHeight();
	        float width  = pageSize.getWidth();
	
	        int nums = reader.getNumberOfPages();
	        Image[] nImage =  subImages(picPath,nums);//生成骑缝章切割图片
	
	        Image image = Image.getInstance(bgPicPath);
	        for(int n=1;n<=nums;n++){
	            PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章
	            Image img = nImage[n-1];//选择图片
	            img.setAlignment(1);
	            over.beginText();
	    		// 设置水印透明度
	    		PdfGState gs = new PdfGState();
	    		// 设置笔触字体不透明度为0.4f
	    		gs.setFillOpacity(0.6f);
	            image.setAbsolutePosition(0, 0);
	            image.scaleAbsolute(width-10,height-10);//控制图片大小
				// 设置透明度
				over.setGState(gs);
				// 添加水印图片
				over.addImage(image);
				img.scaleAbsolute(120/nums,52);//控制图片大小
	            img.setAbsolutePosition(width-img.getWidth()-10,height/2-img.getHeight()/2);//控制图片位置
	            over.addImage(img);
	           
				//结束设置
				over.endText();
				over.stroke();
	        }
	        stamp.close();
	        reader.close();
    	} catch (Exception e) {
	         e.printStackTrace();
	      }
    }

4 解决

解决办法:在代码前面加上如下代码

System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");

 

 

本文标签: 异常AbstractMethodErrorjavaxJavalang